Contoh lanjutan ini menunjukkan cara membangun aplikasi buku log yang menggunakan node.js untuk frontend dan MySQL untuk backend-nya. Template ini juga membuat dan menghubungkan load balancer HTTP yang melakukan load balancing di dua zona, dan autoscaler untuk menskalakan aplikasi secara otomatis.
Contoh ini mengasumsikan bahwa Anda sudah memahami container Docker serta resource Compute Engine, terutama load balancing HTTP, penskalaan otomatis, grup instance terkelola, dan template instance.
Untuk tutorial pengantar lainnya, lihat Panduan memulai atau Panduan langkah demi langkah.
Sebelum memulai
- Jika Anda ingin menggunakan contoh command line dalam panduan ini, instal alat command line`gcloud`.
- Jika Anda ingin menggunakan contoh API dalam panduan ini, siapkan akses API.
- Pemahaman tentang load balancing HTTP Compute Engine.
- Pemahaman tentang Container Docker.
Membuat template
Contoh ini meluncurkan deployment dengan beberapa jenis resource. Untuk memulai, Anda akan membuat template yang dapat digunakan kembali, yang menentukan resource ini secara terpisah. Nantinya, Anda akan menggunakan {i>template<i} ini dalam konfigurasi akhir Anda.
Di akhir contoh ini, Anda akan memiliki deployment yang berisi resource berikut:
- Satu instance Compute Engine untuk virtual machine MySQL backend.
- Template instance yang menggunakan image Docker.
- Dua grup instance terkelola yang diskalakan otomatis di dua zona berbeda, yang menjalankan layanan frontend node.js.
- Dua grup instance terkelola dengan penskalaan otomatis lainnya yang melayani data statis.
- Health check dan load balancer HTTP untuk traffic yang didistribusikan di masing-masing grup instance terkelola.
Membuat template backend
Backend aplikasi ini adalah instance Compute Engine tunggal yang menjalankan container Docker MySQL. Buat template yang menentukan instance Compute Engine yang menggunakan gambar yang dioptimalkan untuk container. Beri nama file container_vm.[py|jinja]
:
Jinja
Python
Template menentukan sejumlah variabel, seperti containerImage
dan
manifest
, yang akan diisi saat Anda menentukan
konfigurasi. Template ini saja hanya membuat
satu instance virtual machine (VM).
Saat menggunakan image container di instance Compute Engine, Anda juga perlu menyediakan file manifes (berbeda dengan manifes Deployment Manager) untuk menjelaskan image container mana yang akan digunakan kepada Compute Engine. Buat metode
helper yang disebut container_helper.[py|jinja]
untuk menentukan manifes
container secara dinamis:
Jinja
Python
Membuat template frontend
Frontend aplikasi ini menjalankan Node.js dan memungkinkan pengguna memposting pesan ke halaman web. Akan ada dua grup instance terkelola yang masing-masing berisi dua instance: grup instance terkelola utama, dan grup instance terkelola sekunder untuk load balancing.
Untuk membuat template frontend ini, gunakan petunjuk berikut.
Membuat template instance.
Anda memerlukan resource Template Instance untuk membuat grup instance terkelola, yang merupakan grup instance VM identik yang dikelola secara terpusat. Contoh ini membuat grup instance terkelola untuk instance node.js frontend, tetapi Anda harus membuat Template Instance terlebih dahulu.
Tentukan file bernama
container_instance_template.[py|jinja]
:Jinja
Python
Membuat grup instance terkelola dengan penskalaan otomatis.
Setelah memiliki template instance, Anda dapat menentukan template yang menggunakan template instance tersebut untuk membuat grup instance terkelola dengan penskalaan otomatis. Buat file baru bernama
autoscaled_group.[py|jinja]
dengan isi berikut:Jinja
Python
Buat file skema yang sesuai:
Jinja
Python
Buat resource menggunakan template ini.
Hingga titik ini, Anda telah menentukan template dasar yang menentukan properti resource Anda. Dengan template ini, tentukan penyiapan frontend Anda. Buat file baru bernama
service.[py|jinja]
dengan konten berikut:Jinja
Python
Buat file skema yang sesuai:
Jinja
Python
Mari kita uraikan apa yang dibuat oleh template ini:
Dua grup instance terkelola, satu utama dan satu sekunder.
Template ini menggunakan template
autoscaled_group.[py|jinja]
untuk membuat grup instance terkelola primer dan sekunder dengan penskalaan otomatis.Selanjutnya, template akan membuat layanan backend dan health checker. Layanan backend diperlukan untuk load balancing HTTP, dan menentukan kapasitas penayangan grup instance di layanan backend tersebut. Dalam hal ini, grup instance terkelola utama dan sekunder adalah bagian dari backend ini, dan properti default layanan backend berlaku.
Secara default, layanan backend melakukan load balancing berdasarkan penggunaan CPU grup instance terkait, tetapi Anda juga dapat melakukan load balancing berdasarkan permintaan per detik (RPS).
Catatan: Health check selalu diperlukan saat membuat layanan backend.
Membuat {i>template<i} terpadu
Terakhir, buat template pemersatu yang menggabungkan template backend dan
frontend. Buat file baru bernama application.[py|jinja]
:
Jinja
Python
Buat file skema yang sesuai:
Jinja
Python
Selain frontend dan backend, template juga menentukan beberapa resource tambahan:
Layanan statis dengan grup instance terkelola utama dan sekunder. Layanan statis ini melayani halaman web yang terletak di jalur
/static
di aplikasi Anda.Resource Peta URL. Load balancing HTTP memerlukan peta URL untuk memetakan berbagai URL ke jalur yang benar. Dalam hal ini, jalur default, yang ditunjukkan oleh properti
defaultService
, adalah layanan backend yang Anda buat sebelumnya. Jika pengguna membuka/static
, peta URL akan memetakan jalur tersebut ke layanan statis, seperti yang ditentukan di bagianpathMatchers
.Aturan penerusan global dan proxy HTTP target. Karena aplikasi melakukan load balancing di dua zona terpisah, Anda memerlukan aturan penerusan global yang melayani satu alamat IP eksternal. Selain itu, proxy HTTP target diperlukan untuk penyiapan load balancing HTTP.
Aturan firewall yang memungkinkan traffic melalui port 8080.
Membuat konfigurasi Anda
Setelah template dan skema terkait siap, Anda dapat membuat
konfigurasi yang men-deploy resource ini. Buat file konfigurasi bernama application.yaml
dengan konten berikut, lalu ganti ZONE_TO_RUN
dan SECONDARY_ZONE_TO_RUN
dengan zona utama dan sekunder pilihan Anda.
Jinja
Python
Men-deploy konfigurasi
Sekarang, mari kita deploy resource Anda. Dengan Google Cloud CLI, jalankan perintah berikut, yang secara opsional memilih untuk mengganti advanced-configuration-l7
dengan nama deployment pilihan Anda. Perlu diingat bahwa nama deployment Anda akan otomatis digunakan untuk memberi nama resource.
Dalam contoh ini, nama deployment-nya adalah advanced-configuration-l7
. Jika Anda memilih untuk mengubah nama deployment, pastikan untuk menggunakan nama deployment tersebut di semua contoh berikut.
gcloud deployment-manager deployments create advanced-configuration-l7 --config application.yaml
Responsnya akan terlihat seperti referensi berikut:
Waiting for create operation-1469468950934-5387966d431f0-49b11bc4-1421b2f0...done. Create operation operation-1469468950934-5387966d431f0-49b11bc4-1421b2f0 completed successfully. NAME TYPE STATE ERRORS advanced-configuration-l7-application-fw compute.v1.firewall COMPLETED [] advanced-configuration-l7-application-l7lb compute.v1.globalForwardingRule COMPLETED [] advanced-configuration-l7-application-targetproxy compute.v1.targetHttpProxy COMPLETED [] advanced-configuration-l7-application-urlmap compute.v1.urlMap COMPLETED [] advanced-configuration-l7-backend compute.v1.instance COMPLETED [] advanced-configuration-l7-frontend-bes compute.v1.backendService COMPLETED [] advanced-configuration-l7-frontend-hc compute.v1.httpHealthCheck COMPLETED [] advanced-configuration-l7-frontend-it compute.v1.instanceTemplate COMPLETED [] advanced-configuration-l7-frontend-pri-as compute.v1.autoscaler COMPLETED [] advanced-configuration-l7-frontend-pri-igm compute.v1.instanceGroupManager COMPLETED [] advanced-configuration-l7-frontend-sec-as compute.v1.autoscaler COMPLETED [] advanced-configuration-l7-frontend-sec-igm compute.v1.instanceGroupManager COMPLETED [] advanced-configuration-l7-static-service-bes compute.v1.backendService COMPLETED [] advanced-configuration-l7-static-service-hc compute.v1.httpHealthCheck COMPLETED [] advanced-configuration-l7-static-service-it compute.v1.instanceTemplate COMPLETED [] advanced-configuration-l7-static-service-pri-as compute.v1.autoscaler COMPLETED [] advanced-configuration-l7-static-service-pri-igm compute.v1.instanceGroupManager COMPLETED [] advanced-configuration-l7-static-service-sec-as compute.v1.autoscaler COMPLETED [] advanced-configuration-l7-static-service-sec-igm compute.v1.instanceGroupManager COMPLETED []
Menambahkan label layanan
Selanjutnya, tentukan label layanan yang sesuai untuk grup instance terkelola Anda. Label layanan adalah metadata yang digunakan oleh layanan load balancing untuk mengelompokkan resource.
Untuk menambahkan label layanan, jalankan perintah berikut, dengan mencocokkan zona utama dan sekunder dengan zona yang Anda pilih di file konfigurasi deployment:
gcloud compute instance-groups unmanaged set-named-ports advanced-configuration-l7-frontend-pri-igm \
--named-ports http:8080,httpstatic:8080 \
--zone [PRIMARY_ZONE]
gcloud compute instance-groups unmanaged set-named-ports advanced-configuration-l7-frontend-sec-igm \
--named-ports http:8080,httpstatic:8080 \
--zone [SECONDARY_ZONE]
Menguji konfigurasi Anda
Untuk menguji konfigurasi Anda, dapatkan alamat IP eksternal yang menayangkan traffic dengan membuat kueri aturan penerusan:
gcloud compute forwarding-rules list | grep advanced-configuration-l7-l7lb advanced-configuration-l7-l7lb 107.178.249.126 TCP advanced-configuration-l7-targetproxy
Dalam hal ini, IP eksternalnya adalah 107.178.249.126
.
Di browser, buka alamat IP eksternal di port 8080. Misalnya,
jika IP eksternal Anda adalah 107.178.249.126
, URL-nya adalah:
http://107.178.249.126:8080
Anda akan melihat halaman kosong, seperti yang diharapkan. Selanjutnya, posting pesan ke laman tersebut. Buka URL berikut:
http://107.178.249.126:8080?msg=hello_world!
Anda akan melihat konfirmasi bahwa pesan telah ditambahkan. Kembali ke URL utama dan sekarang halaman akan menampilkan pesan:
hello_world!
Anda juga dapat mengunjungi halaman statis yang Anda buat, atau memeriksa kondisi aplikasi, dengan membuka URL berikut:
# Static web page
http://107.178.249.126:8080/static
# Health check
http://107.178.249.126:8080/_ah/health
Selamat, Anda telah berhasil men-deploy konfigurasi.
(Opsional) Membuat image Docker
Dengan Docker, Anda dapat mengotomatiskan dan menjalankan software di dalam container. Dengan container, Anda dapat mengisolasi berbagai layanan dalam container yang semuanya dapat berjalan pada satu instance Linux.
Contoh ini menggunakan beberapa image Docker yang ada, tetapi Anda juga dapat membuat image Docker versi Anda sendiri. Petunjuk untuk membuat gambar backend MySQL dan gambar frontend Node.js dapat dilihat di bagian Membuat template resource.
Untuk membuat image Docker yang menayangkan halaman web statis:
Buat instance VM baru dengan image yang dioptimalkan untuk container:
gcloud compute instances create docker-playground \ --image-family container-vm \ --image-project google-containers \ --zone us-central1-a \ --machine-type f1-micro
Hubungkan ke instance:
gcloud compute ssh --zone us-central1-a docker-playground
Buat file bernama
Dockerfile
dengan konten berikut:FROM node:latest RUN mkdir /var/www/ ADD service.js /var/www/service.js WORKDIR /var/www/ RUN npm install mysql CMD ["node", "service.js"]
Buat file bernama
service.js
dengan konten berikut:var http = require('http'); var url = require('url'); console.log('Started static node server') http.createServer(function (req, res) { reqUrl = url.parse(req.url, true); res.useChunkedEncodingByDefault = false; res.writeHead(200, {'Content-Type': 'text/html'}); if (reqUrl.pathname == '/_ah/health') { res.end('ok'); } else if (reqUrl.pathname == '/exit') { process.exit(-1) } else { res.end('static server'); } }).listen(8080, '0.0.0.0'); console.log('Static server running at http://127.0.0.1:8080/');
Bangun image Docker, dan ganti
username
dengan nama pengguna Docker Hub Anda. Jika Anda belum memiliki nama pengguna Docker Hub, buat nama terlebih dahulu sebelum membangun image Docker.sudo docker build --no-cache -t username/nodejsservicestatic .
Kirim image ke repositori Docker:
sudo docker push username/nodejsservicestatic
Sekarang Anda memiliki image Docker untuk menjalankan Node.js dan MySQL. Anda sebenarnya dapat melihat
gambar ini di
repositori dengan menelusuri
nama image. Untuk mencoba gambar, Anda dapat mengganti semua instance
gcr.io/deployment-manager-examples/mysql
dan
gcr.io/deployment-manager-examples/nodejsservice
dengan gambar masing-masing.
Langkah berikutnya
Setelah Anda menyelesaikan contoh ini, Anda dapat:
- Lanjutkan membuat contoh ini dengan membuat halaman web yang lebih tangguh, atau menambahkan lebih banyak layanan ke server web.
- Baca selengkapnya tentang konfigurasi atau deployment.
- Coba buat konfigurasi Anda sendiri.