Melakukan update berkelanjutan


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:

  1. Buka halaman Workloads di konsol Google Cloud.

    Buka Workloads

  2. Pilih beban kerja yang ingin diperbarui.

  3. Di halaman Deployment details, klik Actions > Rolling update.

  4. Pada dialog Update berkelanjutan, tetapkan gambar beban kerja.

  5. 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.

Langkah selanjutnya