Halaman ini menjelaskan cara melakukan update berkelanjutan untuk aplikasi di Google Kubernetes Engine (GKE).
Ringkasan
Anda dapat melakukan update berkelanjutan untuk mengupdate image, konfigurasi, label, anotasi, dan batas/permintaan resource dari workload di cluster Anda. Update berkelanjutan akan mengganti Pod resource Anda dengan Pod resource baru secara bertahap, lalu dijadwalkan pada node dengan resource yang tersedia. Update berkelanjutan dirancang untuk mengupdate workload Anda tanpa periode nonaktif.
Objek berikut mewakili workload Kubernetes. Anda dapat memicu update berkelanjutan pada workload ini dengan mengupdate template Pod-nya:
- DaemonSets
- Deployment
- StatefulSets
Setiap objek ini memiliki template Pod yang diwakili oleh kolom spec: template
dalam manifes objek. Kolom template
Pod berisi spesifikasi Pod yang dibuat oleh pengontrol
untuk mewujudkan status atau perilaku yang diinginkan. Anda memicu peluncuran update dengan
mengupdate spec: template
objek.
Template Pod berisi kolom berikut:
Untuk mempelajari template Pod lebih lanjut, lihat dokumentasi
PodTemplateSpec
.
Menskalakan resource atau mengupdate kolom di luar template Pod tidak memicu peluncuran.
Sebelum memulai
Sebelum memulai, pastikan Anda telah menjalankan tugas berikut:
- Aktifkan Google Kubernetes Engine API. Aktifkan Google Kubernetes Engine API
- Jika ingin menggunakan Google Cloud CLI untuk tugas ini,
instal lalu
initialize
gcloud CLI. Jika sebelumnya Anda telah menginstal gcloud CLI, dapatkan versi terbaru dengan menjalankan
gcloud components update
.
Mengupdate aplikasi
Bagian berikut menjelaskan cara mengupdate aplikasi menggunakan konsol Google Cloud atau kubectl
.
kubectl set
Anda dapat menggunakan kubectl set
untuk mengubah kolom image
, resources
(resource komputasi seperti
CPU dan memori), atau selector
objek.
Misalnya, untuk mengupdate Deployment dari nginx
versi 1.7.9 ke 1.9.1, jalankan perintah berikut:
kubectl set image deployment nginx nginx=nginx:1.9.1
Perintah kubectl set image
memperbarui image nginx
Pod Deployment satu per satu.
Contoh lain untuk menetapkan permintaan dan batas resource Deployment:
kubectl set resources deployment nginx --limits cpu=200m,memory=512Mi --requests cpu=100m,memory=256Mi
Atau, untuk menghapus permintaan resource Deployment:
kubectl set resources deployment nginx --limits cpu=0,memory=0 --requests cpu=0,memory=0
kubectl apply
Anda dapat menggunakan kubectl apply
untuk mengupdate resource dengan menerapkan konfigurasi baru atau yang diupdate.
Untuk menerapkan konfigurasi baru atau yang diupdate ke resource, jalankan perintah berikut:
kubectl apply -f MANIFEST
Ganti MANIFEST
dengan nama file manifes.
Jika file tidak ada, perintah ini akan membuat resource dan menerapkan
konfigurasinya; jika tidak, konfigurasi yang
diupdate akan diterapkan.
Konsol
Untuk mengedit konfigurasi langsung aplikasi, lakukan langkah-langkah berikut:
Buka halaman Workloads di konsol Google Cloud.
Pilih beban kerja yang ingin diperbarui.
Di halaman Deployment details, klik list Actions > Rolling update.
Pada dialog Update berkelanjutan, tetapkan gambar beban kerja.
Klik Perbarui.
Mengelola peluncuran update
Anda dapat menggunakan
kubectl rollout
untuk memeriksa peluncuran saat berlangsung, menjeda dan melanjutkan peluncuran, melakukan rollback
update, dan melihat histori peluncuran objek.
Memeriksa peluncuran dengan kubectl rollout status
Anda dapat memeriksa status peluncuran menggunakan
perintah kubectl rollout status
.
Misalnya, Anda dapat memeriksa peluncuran Deployment nginx
dengan menjalankan perintah berikut:
kubectl rollout status deployment nginx
Outputnya mirip dengan hal berikut ini:
Waiting for rollout to finish: 2 out of 3 newreplicas have been updated...
deployment "nginx" successfully rolled out
Setelah peluncuran berhasil, jalankan kubectl get deployment nginx
untuk memverifikasi bahwa
semua Pod-nya berjalan. Outputnya mirip dengan hal berikut ini:
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
nginx 3 3 3 3 36s
Menjeda dan melanjutkan peluncuran
Anda dapat menggunakan kubectl rollout pause
untuk menjeda peluncuran.
Misalnya, untuk menjeda peluncuran Deployment nginx
, jalankan perintah berikut:
kubectl rollout pause deployment nginx
Untuk melanjutkan, jalankan perintah berikut:
kubectl rollout resume deployment nginx
Melihat histori peluncuran dengan kubectl rollout history
Anda dapat menggunakan kubectl rollout history
untuk melihat histori peluncuran objek.
Misalnya, untuk melihat histori peluncuran Deployment nginx
, jalankan perintah berikut:
kubectl rollout history deployment nginx
Untuk melihat histori revisi ketiga, jalankan perintah berikut:
kubectl rollout history deployment nginx --revision 3
Melakukan rollback update dengan kubectl rollout undo
Anda dapat melakukan rollback peluncuran objek menggunakan perintah kubectl rollout undo
.
Misalnya, untuk melakukan rollback ke Deployment nginx
versi sebelumnya, jalankan perintah berikut:
kubectl rollout undo deployments nginx
Atau, sebagai contoh lain, untuk melakukan rollback ke revisi ketiga Deployment, jalankan perintah berikut:
kubectl rollout undo deployment nginx --to-revision 3
Pertimbangan untuk StatefulSet dan DaemonSet
StatefulSet sejak Kubernetes 1.7 dan DaemonSet sejak Kubernetes 1.6 menggunakan strategi update guna mengonfigurasi dan menonaktifkan update berkelanjutan otomatis untuk container, label, permintaan/batas resource, dan anotasi untuk Pod-nya. Strategi update dikonfigurasi menggunakan kolom spec.updateStrategy
.
Kolom spec.updateStrategy.type
menerima OnDelete
atau
RollingUpdate
sebagai nilai.
OnDelete
adalah perilaku default jika spec.updateStrategy.type
tidak ditentukan. OnDelete
mencegah pengontrol memperbarui Pod-nya secara
otomatis. Anda harus menghapus Pod secara manual agar pengontrol membuat Pod baru yang mencerminkan perubahan yang Anda buat. OnDelete
berguna jika Anda memilih untuk mengupdate Pod secara manual.
RollingUpdate
menerapkan update berkelanjutan otomatis untuk Pod di
StatefulSet. RollingUpdate
menyebabkan pengontrol menghapus dan membuat ulang setiap
Pod-nya satu per satu. Fungsi tersebut menunggu hingga Pod yang diupdate
berjalan dan siap sebelum mengupdate pendahulunya.
Pengontrol StatefulSet mengupdate semua Pod dalam urutan ordinal terbalik dengan tetap mematuhi jaminan StatefulSet.
Menggunakan strategi RollingUpdate
Anda dapat menggunakan strategi RollingUpdate
untuk otomatis mengupdate semua Pod dalam
StatefulSet atau DaemonSet.
Misalnya, untuk mem-patch StatefulSet web
guna menerapkan strategi
RollingUpdate
, jalankan perintah berikut:
kubectl patch statefulset web -p '{"spec":{"updateStrategy":{"type":"RollingUpdate"}}}'
Selanjutnya, buat perubahan pada spec.template
StatefulSet. Misalnya, Anda dapat menggunakan kubectl set
untuk mengubah image container. Pada contoh berikut, StatefulSet web
ditetapkan agar container nginx
menjalankan image
nginx-slim:0.7
:
kubectl set image statefulset web nginx=nginx-slim:0.7
Untuk memastikan bahwa Pod di StatefulSet yang menjalankan container nginx
sedang diupdate, jalankan perintah berikut:
kubectl get pods -l app=nginx -w
Outputnya mirip dengan hal berikut ini:
NAME READY STATUS RESTARTS AGE
web-0 1/1 Running 0 7m
web-1 1/1 Running 0 7m
web-2 1/1 Running 0 8m
web-2 1/1 Terminating 0 8m
web-2 1/1 Terminating 0 8m
web-2 0/1 Terminating 0 8m
web-2 0/1 Terminating 0 8m
web-2 0/1 Terminating 0 8m
web-2 0/1 Terminating 0 8m
web-2 0/1 Pending 0 0s
web-2 0/1 Pending 0 0s
web-2 0/1 ContainerCreating 0 0s
web-2 1/1 Running 0 19s
web-1 1/1 Terminating 0 8m
web-1 0/1 Terminating 0 8m
web-1 0/1 Terminating 0 8m
web-1 0/1 Terminating 0 8m
web-1 0/1 Pending 0 0s
web-1 0/1 Pending 0 0s
web-1 0/1 ContainerCreating 0 0s
web-1 1/1 Running 0 6s
web-0 1/1 Terminating 0 7m
web-0 1/1 Terminating 0 7m
web-0 0/1 Terminating 0 7m
web-0 0/1 Terminating 0 7m
web-0 0/1 Terminating 0 7m
web-0 0/1 Terminating 0 7m
web-0 0/1 Pending 0 0s
web-0 0/1 Pending 0 0s
web-0 0/1 ContainerCreating 0 0s
web-0 1/1 Running 0 10s
Pod di StatefulSet diupdate dalam urutan ordinal terbalik. Pengontrol StatefulSet menghentikan setiap Pod, dan menunggu hingga Pod bertransisi ke Berjalan dan Siap sebelum mengupdate Pod berikutnya.
Mempartisi RollingUpdate
Anda dapat menentukan parameter partition
untuk kolom RollingUpdate
StatefulSet.
Jika Anda menentukan partition
, semua Pod dengan angka ordinal yang lebih besar dari
atau sama dengan nilai partition
akan diperbarui. Semua Pod dengan angka ordinal
yang kurang dari nilai partition
tidak akan diupdate dan, meskipun
dihapus, akan dibuat ulang pada versi sebelumnya.
Jika nilai partition
lebih besar dari jumlah replicas
, update tidak
akan diterapkan ke Pod-nya. Partisi berguna jika Anda ingin melakukan update,
meluncurkan canary, atau melakukan peluncuran bertahap.
Misalnya, untuk mempartisi StatefulSet web
, jalankan perintah berikut:
kubectl patch statefulset web -p '{"spec":{"updateStrategy":{"type":"RollingUpdate","rollingUpdate":{"partition":3}}}}'
Hal ini menyebabkan Pod dengan angka ordinal yang lebih besar dari atau sama dengan 3
akan diupdate.
Parameter maxUnavailable
dan maxSurge
DaemonSet
Parameter maxUnavailable
dan maxSurge
opsional DaemonSet adalah turunan dari kolom rollingUpdate
DaemonSet.
maxUnavailable
menentukan jumlah maksimum Pod DaemonSet yang
tidak tersedia selama update. Nilai default-nya, jika dihilangkan, adalah 1
.
maxSurge
adalah jumlah maksimum Pod yang dapat ditingkatkan skalanya selama update.
Nilai default-nya, jika dihilangkan, adalah 0
.
Kedua nilai tidak boleh 0
jika nilai lainnya adalah 0
. Kedua nilai tersebut bisa berupa
angka absolut atau persentase.
Untuk mempelajari lebih lanjut, lihat DaemonSetSpec.
Mengupdate dengan strategi OnDelete
Jika lebih memilih untuk mengupdate StatefulSet atau DaemonSet secara manual, Anda dapat menghilangkan kolom spec.updateStrategy
, yang menginstruksikan pengontrol untuk menggunakan strategi OnDelete
.
Untuk mengupdate pengontrol yang menggunakan strategi OnDelete
, Anda harus menghapus Pod-nya secara manual setelah mengubah template Pod-nya.
Misalnya, Anda dapat menetapkan StatefulSet web
agar menggunakan image
nginx-slim:0.7
:
kubectl set image statefulset web nginx=nginx-slim:0.7
Kemudian, untuk menghapus Pod web
pertama, jalankan perintah berikut:
kubectl delete pod web-0
Untuk mengamati saat Pod dibuat ulang oleh StatefulSet dan bertransisi ke Berjalan dan Siap, jalankan perintah berikut:
kubectl get pod web-0 -w
Output perintah ini akan mirip dengan berikut ini:
NAME READY STATUS RESTARTS AGE
web-0 1/1 Running 0 54s
web-0 1/1 Terminating 0 1m
web-0 0/1 Terminating 0 1m
web-0 0/1 Terminating 0 1m
web-0 0/1 Terminating 0 1m
web-0 0/1 Pending 0 0s
web-0 0/1 Pending 0 0s
web-0 0/1 ContainerCreating 0 0s
web-0 1/1 Running 0 3s
Mengupdate Tugas
Tugas baru dan Pod-nya akan berjalan dengan konfigurasi baru saat Anda mengupdate konfigurasi Tugas. Setelah memperbarui Tugas, Anda harus menghapus Tugas lama dan Pod-nya secara manual, jika diperlukan.
Untuk menghapus Tugas dan semua Pod-nya, jalankan perintah berikut:
kubectl delete job my-job
Untuk menghapus Tugas, tetapi tetap menjalankan Pod-nya, tentukan flag --cascade=false
:
kubectl delete job my-job --cascade=false
Anda juga dapat menjalankan kubectl describe deployment nginx
, yang menghasilkan lebih banyak
informasi tentang Deployment.