Contoh lanjutan ini menunjukkan cara mem-build aplikasi logbook yang menggunakan node.js untuk frontend-nya 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 penampung 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.
- Memahami load balancing HTTP Compute Engine.
- Memahami 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. Nanti, Anda akan menggunakan template ini dalam konfigurasi akhir.
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 dengan penskalaan otomatis di dua zona yang berbeda, yang menjalankan layanan node.js frontend.
- Dua grup instance terkelola lainnya yang diskalakan secara otomatis dan menayangkan data statis.
- Health check dan load balancer HTTP untuk mendistribusikan traffic di seluruh grup instance terkelola.
Membuat template backend
Backend aplikasi ini adalah satu instance Compute Engine yang menjalankan penampung Docker MySQL. Buat template yang menentukan instance Compute Engine
yang menggunakan image 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 kepada Compute Engine image container mana yang akan digunakan. Buat metode bantuan
yang disebut container_helper.[py|jinja]
untuk menentukan manifes
penampung 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 pertama-tama, Anda harus membuat Template Instance.
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 untuk membuat grup instance terkelola dengan penskalaan otomatis. Buat file baru bernama
autoscaled_group.[py|jinja]
dengan konten berikut:Jinja
Python
Buat file skema yang sesuai:
Jinja
Python
Buat resource menggunakan template ini.
Hingga saat 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 template ini:
Dua grup instance terkelola, satu primer 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 dalam 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 dari 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 template pemersatu
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 primer dan sekunder. Layanan statis ini menayangkan 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 di-load balance di dua zona terpisah, Anda memerlukan aturan penerusan global yang menayangkan 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
Setelah template dan skema terkait siap, Anda dapat membuat
konfigurasi yang men-deploy resource ini. Buat file konfigurasi bernama
application.yaml
dengan konten berikut, dan 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 menggunakan Google Cloud CLI, jalankan perintah berikut, dengan memilih untuk mengganti advanced-configuration-l7
dengan nama deployment pilihan Anda. Perhatikan bahwa nama deployment Anda akan otomatis digunakan untuk memberi nama resource.
Dalam contoh ini, nama deployment 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 resource 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 balancer untuk mengelompokkan resource.
Untuk menambahkan label layanan, jalankan perintah berikut, yang mencocokkan zona utama dan sekunder dengan zona yang Anda pilih dalam 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 menyalurkan 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 eksternal 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, yang diharapkan. Selanjutnya, posting pesan ke halaman. Buka URL berikut:
http://107.178.249.126:8080?msg=hello_world!
Anda akan melihat konfirmasi bahwa pesan Anda telah ditambahkan. Kembali ke URL utama dan sekarang halaman akan menampilkan pesan:
hello_world!
Anda juga dapat membuka 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 berhasil men-deploy konfigurasi.
(Opsional) Membuat image Docker
Docker memungkinkan Anda mengotomatiskan dan menjalankan software di dalam container. Container memungkinkan Anda mengisolasi berbagai layanan dalam container yang semuanya dapat dijalankan di satu instance Linux.
Contoh ini menggunakan beberapa image Docker yang ada, tetapi Anda juga dapat membuat versi image Docker ini sendiri. Anda dapat menemukan petunjuk untuk membuat image backend MySQL dan image frontend Node.js 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/');
Build image Docker, dengan mengganti
username
dengan nama pengguna Docker Hub Anda. Jika Anda tidak memiliki nama pengguna Docker Hub, buat terlebih dahulu sebelum mem-build 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 gambar. 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 menyelesaikan contoh ini, Anda dapat:
- Lanjutkan untuk membuat contoh ini dengan membuat halaman web yang lebih andal, atau menambahkan lebih banyak layanan ke server web.
- Baca selengkapnya tentang konfigurasi atau deployment.
- Coba buat konfigurasi Anda sendiri.