Tutorial ini menjelaskan praktik yang direkomendasikan untuk membuat aplikasi stateful dan mengupgrade cluster Google Kubernetes Engine (GKE) yang menjalankan aplikasi. Tutorial ini menggunakan Redis sebagai contoh untuk men-deploy aplikasi stateful, tetapi konsep yang sama berlaku untuk jenis aplikasi stateful lain yang di-deploy di GKE.
Tujuan
Tutorial ini membahas langkah-langkah berikut:
- Membuat cluster GKE yang terdaftar di saluran rilis.
- Membuat Cluster Redis di GKE.
- Men-deploy aplikasi klien Redis ke GKE.
- Melakukan praktik terbaik berikut untuk upgrade node pool:
- Menyiapkan Anggaran Gangguan Pod (PDB).
- Menyiapkan masa pemeliharaan dan pengecualian pemeliharaan.
- Menyiapkan strategi upgrade node ke upgrade lonjakan atau upgrade biru-hijau.
- Uji aplikasi.
- Mengupgrade cluster.
- Menguji gangguan workload.
Diagram berikut menunjukkan tampilan tingkat tinggi arsitektur cluster untuk tutorial ini:
Biaya
Dalam dokumen ini, Anda akan menggunakan komponen Google Cloud yang dapat ditagih berikut:
Untuk membuat perkiraan biaya berdasarkan proyeksi penggunaan Anda,
gunakan kalkulator harga.
Setelah menyelesaikan tugas yang dijelaskan dalam dokumen ini, Anda dapat menghindari penagihan berkelanjutan dengan menghapus resource yang Anda buat. Untuk mengetahui informasi selengkapnya, lihat Pembersihan.
Sebelum memulai
Menyiapkan project
- Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
-
In the Google Cloud console, on the project selector page, click Create project to begin creating a new Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the GKE API.
-
In the Google Cloud console, on the project selector page, click Create project to begin creating a new Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the GKE API.
Menetapkan setelan default untuk Google Cloud CLI
Di konsol Google Cloud, mulai instance Cloud Shell:
Buka Cloud ShellDownload kode sumber untuk aplikasi contoh ini:
git clone https://github.com/GoogleCloudPlatform/kubernetes-engine-samples cd kubernetes-engine-samples/quickstarts/hello-app-redis/manifests
Tetapkan variabel lingkungan default:
gcloud config set project PROJECT-ID gcloud config set compute/zone COMPUTE-ZONE
Ganti nilai berikut:
- PROJECT_ID: project ID Google Cloud Anda.
- COMPUTE_ZONE: zona Compute Engine.
Membuat cluster GKE yang terdaftar di saluran rilis
Untuk membuat cluster GKE, selesaikan langkah-langkah berikut:
Buat cluster bernama
redis-test
dengan tiga node:gcloud container clusters create redis-test \ --num-nodes=3 \ --release-channel regular
Setelah cluster dibuat, Anda akan melihat output yang mirip dengan contoh berikut:
NAME: redis-test LOCATION: us-central1-c MASTER_VERSION: 1.22.10-gke.600 MASTER_IP: 34.69.67.7 MACHINE_TYPE: e2-medium NODE_VERSION: 1.22.10-gke.600 NUM_NODES: 3 STATUS: RUNNING
Konfigurasi
kubectl
untuk berkomunikasi dengan cluster:gcloud container clusters get-credentials redis-test
Membuat Cluster Redis di GKE
Di bagian ini, Anda menambahkan Cluster Redis di atas cluster GKE yang sebelumnya Anda buat dengan men-deploy ConfigMap .StatefulSet , danLayanan headless.
Untuk membuat cluster Redis, ikuti seluruh langkah berikut:
Lihat file ConfigMap (
redis-configmap.yaml
) yang menyimpan konfigurasi Redis. Cuplikan di bawah ini menunjukkan skrip pemeriksaan Kesiapan dan skrip pemeriksaan Keaktifan.Skrip
readiness.sh
danliveness.sh
menggunakan ping redis-cli untuk memeriksa apakah server redis berjalan atau tidak. Jika yang ditampilkan adalahPONG
, berarti server Redis sudah aktif dan berjalan. Skrip ini akan digunakan diredis-cluster.yaml
.Untuk mempelajari parameter Redis dalam ConfigMap ini lebih lanjut, lihat bagian parameter konfigurasi Cluster Redis di tutorial Cluster Redis.
Men-deploy ConfigMap:
kubectl apply -f redis-configmap.yaml
Lihat cuplikan StatefulSet (
redis-cluster.yaml
) di bawah, yang menunjukkan penggunaan pemeriksaan Kesiapan dan pemeriksaan Keaktifan.Untuk mempelajari cara mengonfigurasi pemeriksaan di Kubernetes, lihat Mengonfigurasi Pemeriksaan.
Anda sangat disarankan untuk menggunakan pemeriksaan Kesiapan dan Keaktifan saat mengupgrade node pool; hal ini memastikan bahwa Pod Anda siap selama upgrade.
Men-deploy StatefulSet:
kubectl apply -f redis-cluster.yaml
Layanan headless yang bernama
redis-service.yaml
ditujukan untuk koneksi node Redis. KolomclusterIP
ditetapkan keNone
untuk membuat Layanan headless.Men-deploy Service:
kubectl apply -f redis-service.yaml
Tunggu sekitar dua menit dan pastikan semua Pod berjalan dengan menggunakan perintah berikut:
kubectl get pods
Anda akan melihat output yang mirip dengan contoh berikut ini:
NAME READY STATUS RESTARTS AGE redis-0 1/1 Running 0 2m29s redis-1 1/1 Running 0 2m8s redis-2 1/1 Running 0 107s redis-3 1/1 Running 0 85s redis-4 1/1 Running 0 54s redis-5 1/1 Running 0 23s
Pastikan volume persisten dibuat dengan menjalankan perintah berikut:
kubectl get pv
Anda akan melihat output yang mirip dengan contoh berikut ini:
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE pvc-HASH 1Gi RWO Delete Bound default/data-redis-5 standard 75s pvc-HASH 1Gi RWO Delete Bound default/data-redis-1 standard 2m59s pvc-HASH 1Gi RWO Delete Bound default/data-redis-3 standard 2m16s pvc-HASH 1Gi RWO Delete Bound default/data-redis-2 standard 2m38s pvc-HASH 1Gi RWO Delete Bound default/data-redis-0 standard 3m20s pvc-HASH 1Gi RWO Delete Bound default/data-redis-4 standard 104s
Dalam output ini, HASH mewakili hash yang disertakan ke setiap nama volume persisten.
Menetapkan peran ke Cluster Redis
Setelah konfigurasi selesai, tetapkan peran ke Cluster Redis.
Skrip berikut memperoleh alamat IP Pod, lalu menetapkan peran pemimpin dan pengikut dengan meneruskan setiap alamat IP Pod ke dalam perintah:
Untuk menetapkan peran ke cluster Redis, ikuti seluruh langkah berikut:
Jalankan skrip:
chmod +x ./roles.sh ./roles.sh
Ketikkan
yes
saat diminta.Login ke node Redis untuk memeriksa perannya. Misalnya, untuk memverifikasi bahwa
redis-0
memiliki peran pemimpin, jalankan perintah berikut:kubectl exec -it redis-0 -- redis-cli role
Anda akan melihat output yang mirip dengan contoh berikut ini:
1) "master" 2) (integer) 574 3) 1) 1) "10.28.2.3" 2) "6379" 3) "574"
Men-deploy aplikasi klien Redis
Untuk men-deploy aplikasi ke cluster GKE yang Anda buat, tentukan Deployment untuk aplikasi Anda.
File bernama app-deployment.yaml
berisi definisi deployment untuk aplikasi.
Untuk mempelajari lebih lanjut pemeriksaan dan aturan afinitas Pod yang digunakan dalam Deployment ini, lihat Praktik terbaik GKE: Mendesain dan membangun cluster dengan ketersediaan tinggi.
Untuk membuat Deployment, ikuti seluruh langkah berikut:
Terapkan Deployment:
kubectl apply -f app-deployment.yaml
Ekspos aplikasi melalui load balancer:
kubectl expose deployment hello-web \ --type=LoadBalancer \ --port 80 \ --target-port 8080
Tunggu sekitar satu menit, lalu ambil alamat IP eksternal aplikasi dengan menjalankan perintah berikut:
kubectl get service
Dari output, salin nilai yang tercantum di kolom
hello-web's
EXTERNAL-IP
:NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE hello-web LoadBalancer 10.13.10.55 EXTERNAL_IP 80:30703/TCP 166m
Pastikan bahwa aplikasi berfungsi dengan menempelkan EXTERNAL_IP ke browser web Anda. Anda akan melihat output yang mirip dengan contoh berikut ini:
I have been hit [1] times since deployment!
Catat angka kunjungan. Anda harus menggunakannya di bagian Menguji gangguan aplikasi.
Tetapkan variabel untuk EXTERNAL_IP yang baru saja Anda salin. Anda menggunakan nilai ini saat membuat skrip untuk menguji aplikasi di bagian berikutnya:
export IP=EXTERNAL_IP
Mengonfigurasi praktik terbaik untuk upgrade node pool
Lakukan praktik terbaik ini untuk aplikasi stateful guna mengoptimalkan ketersediaan yang lebih baik selama upgrade node pool.
Menyiapkan Anggaran Gangguan Pod (PDB)
Buat Anggaran Gangguan Pod untuk membatasi jumlah replika Pod yang mengalami gangguan secara bersamaan selama gangguan yang bersifat sukarela. Hal ini berguna untuk aplikasi stateful yang memerlukan ketersediaan replika dengan jumlah tertentu sebagai kuorum selama upgrade.
Dalam definisi PDB:
app
menentukan aplikasi tempat PDB ini diterapkan.minAvailable
menetapkan jumlah minimum Pod yang akan tersedia selama terjadinya gangguan. Hal ini dapat berupa nilai atau persentase (misalnya 30%).maxUnavailable
menetapkan jumlah maksimum Pod yang tidak dapat tersedia selama gangguan. Data ini bisa berupa nilai atau persentase juga.
Untuk menyiapkan PDB, ikuti seluruh langkah berikut:
Deploy PDB:
kubectl apply -f pdb-minavailable.yaml
Pastikan bahwa layanan telah dibuat:
kubectl get pdb
Menyiapkan masa pemeliharaan dan pengecualian pemeliharaan
Upgrade otomatis node menyederhanakan proses upgrade dan menjaga agar node dalam cluster selalu terbaru saat bidang kontrol diupgrade untuk Anda. Fitur ini diaktifkan secara default. Untuk mempelajari lebih lanjut, lihat Mengupgrade node otomatis.
Gunakan masa pemeliharaan dan pengecualian pemeliharaan untuk menyiapkan jangka waktu dan mengontrol kapan pemeliharaan dapat dan tidak dapat dilakukan di cluster GKE:
Siapkan masa pemeliharaan yang dimulai pukul 02.00 UTC pada 19 Agustus 2022, dan selesai empat jam setelahnya. Masa pemeliharaan ini berjalan setiap hari. Selama jangka waktu ini, pemeliharaan otomatis diizinkan.
gcloud container clusters update redis-test \ --maintenance-window-start 2022-08-19T02:00:00Z \ --maintenance-window-end 2022-08-19T06:00:00Z \ --maintenance-window-recurrence FREQ=DAILY
Siapkan periode pengecualian yang mencegah pemeliharaan selama liburan Tahun Baru. Pengecualian pemeliharaan ini menggunakan cakupan
no_upgrades
. Selama jangka waktu ini, pemeliharaan otomatis apa pun tidak diizinkan. Untuk mempelajari lebih lanjut, lihat Cakupan pemeliharaan yang akan dikecualikan.gcloud container clusters update redis-test \ --add-maintenance-exclusion-name new-year \ --add-maintenance-exclusion-start 2022-12-26T00:00:00Z \ --add-maintenance-exclusion-end 2023-01-02T02:00:00Z \ --add-maintenance-exclusion-scope no_upgrades
Pastikan masa pemeliharaan dan pengecualian diterapkan. Lihat di bawah
maintenancePolicy:
gcloud container clusters describe redis-test
Untuk mempelajari lebih lanjut, lihat Mengonfigurasi masa pemeliharaan dan pengecualian pemeliharaan.
Mengonfigurasi strategi upgrade node
Tersedia dua strategi upgrade node yang dapat Anda gunakan untuk node pool di cluster GKE: Upgrade blue-green dan upgrade lonjakan. Untuk mempelajari lebih lanjut, lihat Strategi upgrade node.
Upgrade blue-green
Pilih upgrade blue-green jika workload tidak terlalu toleran terhadap gangguan, dan kenaikan biaya sementara karena penggunaan resource yang lebih tinggi dapat diterima.
Jalankan perintah berikut untuk mengubah node pool saat ini menjadi strategi upgrade blue-green.
gcloud container node-pools update default-pool \
--cluster=redis-test \
--enable-blue-green-upgrade \
--zone COMPUTE-ZONE \
--node-pool-soak-duration=120s
Durasi pengujian node pool disetel ke dua menit untuk menghemat waktu selama fase node pool pengujian untuk tujuan tutorial ini. Fase ini digunakan untuk memverifikasi kondisi workload setelah node pool biru dikosongkan. Sebaiknya tetapkan durasi pengujian node pool ke satu jam (3600 detik) atau durasi yang paling sesuai dengan aplikasi.
Untuk informasi selengkapnya tentang cara mengelola alokasi pod, lihat Men-deploy Pod ke node pool tertentu dan Men-deploy Layanan ke node pool tertentu.
Untuk informasi selengkapnya tentang cara mengonfigurasi upgrade blue-green, lihat Mengonfigurasi upgrade blue-green.
Upgrade Lonjakan
Pilih upgrade lonjakan jika pengoptimalan biaya penting dan jika workload dapat menoleransi penghentian terstruktur dalam waktu kurang dari 60 menit (GKE menaati ketentuan PDB, yaitu maksimal 60 menit).
Jalankan perintah berikut untuk mengubah node pool saat ini menjadi strategi upgrade lonjakan.
gcloud container node-pools update default-pool \
--max-surge-upgrade=1 \
--max-unavailable-upgrade=0 \
--cluster=redis-test
Dengan konfigurasi ini (maxSurge=1
dan maxUnavailable=0
), hanya satu node lonjakan
yang dapat ditambahkan ke node pool selama upgrade, sehingga hanya satu node yang dapat
diupgrade pada satu waktu. Setelan ini mempercepat mulai ulang Pod selama upgrade namun
proses tetap berlangsung secara konservatif.
Untuk informasi selengkapnya tentang cara mengonfigurasi upgrade lonjakan, lihat Mengonfigurasi upgrade lonjakan.
Periksa konfigurasi node pool saat ini:
gcloud container node-pools describe default-pool \
--cluster redis-test \
--zone COMPUTE-ZONE
Untuk informasi selengkapnya tentang melihat node pool, lihat Melihat node pool di cluster.
Menguji aplikasi
Di bagian ini, Anda menggunakan dua skrip, satu yang mengirim permintaan ke aplikasi Anda, dan satu yang mengukur tingkat keberhasilan permintaan tersebut. Anda menggunakan skrip ini untuk mengukur apa yang terjadi saat mengupgrade cluster.
Untuk membuat skrip:
Ubah ke direktori yang berisi skrip:
cd cd kubernetes-engine-samples/quickstarts/hello-app-redis/scripts
Lihat skrip bernama
generate_load.sh
yang mengirimkan permintaan kueri per detik (QPS) ke aplikasi Anda. Skrip ini menyimpan kode respons HTTP ke dalam direktori saat ini ke file bernamaoutput
. Nilaioutput
digunakan dalam skrip yang Anda buat di langkah berikutnya.Lihat skrip bernama
print_error_rate.sh
yang menghitung tingkat keberhasilan berdasarkan output yang dihasilkan olehgenerate_load.sh
.Berikan izin kepada diri Anda untuk menjalankan skrip:
chmod u+x generate_load.sh print_error_rate.sh
Tetapkan variabel untuk jumlah QPS. Nilai ini digunakan dalam skrip
generate_load.sh
seperti variabel yang Anda tetapkan untuk EXTERNAL_IP. Sebaiknya tetapkan nilai sebesar 40.export QPS=40
Jalankan skrip
generate_load.sh
untuk mulai mengirim QPS:./generate_load.sh $IP $QPS 2>&1
Biarkan skrip
generate_load.sh
berjalan dan buka terminal baru. Di terminal baru, jalankan skripprint_error_rate.sh
untuk memeriksa tingkat error:cd cd kubernetes-engine-samples/quickstarts/hello-app-redis/scripts watch ./print_error_rate.sh
Anda akan melihat tingkat keberhasilan 100% dan tingkat error 0% karena QPS dibuat.
Biarkan kedua skrip berjalan dan buka terminal ketiga untuk mempersiapkan bagian berikutnya.
Mengupgrade cluster
Untuk mengupgrade cluster, ikuti seluruh langkah berikut:
Tentukan versi GKE yang digunakan cluster
redis-test
:V=$(gcloud container clusters describe redis-test | grep "version:" | sed "s/version: //") echo $V
Anda akan melihat output yang mirip dengan contoh berikut:
1.22.9-gke.2000
.Ambil daftar versi Kubernetes yang tersedia:
gcloud container get-server-config
Dalam daftar versi, temukan bagian
validMasterVersions:
dan cari versiredis-test
yang Anda ambil pada langkah sebelumnya. Untuk menghindari pelanggaran kebijakan ketidaksesuaian versi GKE dengan memilih versi yang tidak kompatibel dengan node, salin versi dari daftar yang tercantum tepat sebelum versiredis-test
.Upgrade bidang kontrol cluster ke versi yang Anda pilih dan ketik
y
saat diminta:gcloud container clusters upgrade redis-test \ --master \ --cluster-version VERSION
Ganti VERSION dengan versi yang Anda pilih dari daftar di langkah sebelumnya.
Upgrade bidang kontrol memerlukan waktu beberapa menit.
Upgrade node cluster ke versi yang Anda pilih dan ketik
y
saat diminta:gcloud container clusters upgrade redis-test \ --cluster-version=VERSION \ --node-pool=default-pool
Ganti VERSION dengan versi yang Anda pilih dari daftar.
Menguji gangguan workload
Di bagian ini, Anda akan menguji status aplikasi dan mengamati gangguan workload.
Kembali ke jendela terminal yang menjalankan
./print_error_rate.sh
dan amati perubahan tingkat keberhasilan selama upgrade. Anda akan melihat sedikit penurunan dalam tingkat keberhasilan dan sedikit peningkatan pada tingkat error jaringan aplikasi saat node dihapus untuk diupgrade.Di kolom
Success rate
, Anda akan melihat angka kunjungan yang berhasil dilakukan ke situs. Catat nilai ini.Hentikan kedua skrip agar tidak berjalan dengan memasukkan
CTRL+C
di terminal yang relevan.Kembali ke situs aplikasi Anda dengan memasukkan alamat IP-nya (ini adalah EXTERNAL_IP yang Anda salin saat bagian Men-deploy aplikasi klien Redis) ke browser Anda.
Amati angka kunjungan untuk aplikasi Anda. Angka yang Anda lihat harus sama:
ORIGINAL_VISIT_NUMBER + SUCCESSFUL_VISIT_NUMBER
dengan ORIGINAL_VISIT_NUMBER adalah angka yang Anda catat pada langkah terakhir, yaitu Men-deploy aplikasi klien Redis dan SUCCESSFUL_VISIT_NUMBER adalah nilai yang Anda catat pada langkah pertama bagian ini.
Pembersihan
Setelah menyelesaikan tutorial, Anda dapat membersihkan resource yang dibuat agar resource tersebut berhenti menggunakan kuota dan dikenai biaya. Bagian berikut menjelaskan cara menghapus atau menonaktifkan resource ini.
Menghapus project
Cara termudah untuk menghilangkan penagihan adalah dengan menghapus project yang Anda buat untuk tutorial.
Untuk menghapus project:
- In the Google Cloud console, go to the Manage resources page.
- In the project list, select the project that you want to delete, and then click Delete.
- In the dialog, type the project ID, and then click Shut down to delete the project.
Hapus kluster
Agar dapat menghapus cluster yang Anda buat untuk tutorial ini, jalankan perintah berikut:
gcloud container clusters delete redis-test