Deployment adalah objek Kubernetes yang mendeklarasikan template Pod beserta jumlah replikanya, lalu mengelola peralihan dari versi lama ke versi baru secara bertahap. Objek ini berada satu lapisan di atas ReplicaSet dan menjadi cara standar menjalankan aplikasi yang tidak berhenti. Topik ini membahas struktur manifest, rantai kepemilikan dari Pod ke ReplicaSet lalu ke Deployment, serta strategi RollingUpdate dengan parameter maxSurge dan maxUnavailable.
Deployment sebagai pengelola ReplicaSet#
Membuat Pod secara manual mengikat pengelolaan pada objek yang tidak punya mekanisme pemulihan. Apabila Pod dihapus, tidak ada yang membuat ulang, dan setiap perubahan harus dilakukan per Pod. ReplicaSet memperbaiki bagian replikasi, tetapi tidak menawarkan strategi peralihan versi. Deployment melengkapi lapisan terakhir, yaitu mengelola sekumpulan ReplicaSet beserta urutan pembuatannya.
Rantai kepemilikannya berurutan dan eksplisit dari Pod ke ReplicaSet lalu ke Deployment. Deployment memiliki ReplicaSet yang dibuatnya melalui bidang metadata.ownerReferences, dan setiap ReplicaSet memiliki sekumpulan Pod yang dihasilkannya. Apabila Deployment dihapus, penghapusan berjalan turun dari Deployment ke ReplicaSet lalu ke Pod secara otomatis. Urutan ini juga menjadi dasar pencatatan revisi, karena setiap versi template Pod diwakili oleh satu ReplicaSet tersendiri.
Manifest Deployment memuat seluruh lapisan tersebut dalam satu berkas. Bagian spec.template berisi definisi Pod yang diwariskan ke ReplicaSet, sedangkan bagian spec.strategy mengatur cara peralihannya:
apiVersion: apps/v1
kind: Deployment
metadata:
name: catatan
labels:
app: catatan
spec:
replicas: 5
selector:
matchLabels:
app: catatan
strategy:
type: RollingUpdate
rollingUpdate:
maxSurge: 1
maxUnavailable: 1
template:
metadata:
labels:
app: catatan
spec:
containers:
- name: catatan
image: nginx:1.26
ports:
- containerPort: 80Bidang spec.selector pada Deployment tidak boleh berubah setelah objek dibuat, karena selector menentukan ReplicaSet mana yang berada di bawah kendalinya. Template Pod justru boleh berubah, dan perubahan itulah yang memicu rollout baru. Nilai replicas: 5 pada manifest menjadi jumlah replika yang diwariskan ke ReplicaSet aktif.
Strategi RollingUpdate#
Strategi RollingUpdate menggantikan Pod lama dengan Pod baru secara bertahap, sehingga kapasitas layanan tidak pernah jatuh sampai nol. Dua parameter mengendalikan seberapa agresif peralihan tersebut. maxSurge menyatakan jumlah Pod tambahan yang boleh dibuat di atas jumlah replika normal, sedangkan maxUnavailable menyatakan jumlah Pod yang boleh tidak tersedia selama proses berjalan. Keduanya ditulis sebagai bilangan bulat atau persentase, dengan pembulatan ke atas untuk maxSurge dan ke bawah untuk maxUnavailable.
Pada Deployment dengan sepuluh replika, maxSurge: 25% berarti tiga Pod tambahan, sedangkan maxUnavailable: 25% berarti dua Pod boleh hilang. Nilai default keduanya adalah 25 persen. Strategi Recreate merupakan alternatif yang menghapus seluruh Pod lama sebelum Pod baru dibuat, sehingga terjadi jeda tanpa kapasitas dan hanya cocok untuk aplikasi yang menerima waktu henti.
Simulasi berikut menghitung perputaran langkah demi langkah untuk Deployment dengan lima replika, maxSurge 1, dan maxUnavailable 1. Pod baru perlu waktu untuk siap, sehingga pembuatan dan penghapusan bergantian satu per satu:
import math
REPLIKA = 5 # spec.replicas yang diinginkan
MAX_SURGE = 1 # pod tambahan yang boleh dibuat di atas jumlah normal
MAX_UNAVAIL = 1 # pod yang boleh tidak tersedia selama perputaran
LAMA_MAKS = REPLIKA + MAX_SURGE # batas total pod saat perputaran
SIAP_MIN = REPLIKA - MAX_UNAVAIL # pod yang harus tetap tersedia
lama, baru, langkah = REPLIKA, 0, 0
print(f"{'langkah':>7} {'aksi':<15} {'lama':>4} {'baru':>4} {'total':>5}")
print(f"{'awal':>7} {'-':<15} {lama:>4} {baru:>4} {lama + baru:>5}")
while lama > 0:
langkah += 1
if lama + baru < LAMA_MAKS:
# ruang surge tersedia, pod baru dibuat dan menunggu siap
baru += 1
aksi = "buat pod baru"
else:
# pod baru sudah siap, satu pod lama dihapus
lama -= 1
aksi = "hapus pod lama"
print(f"{langkah:>7} {aksi:<15} {lama:>4} {baru:>4} {lama + baru:>5}")
# konversi persentase: maxSurge dibulatkan ke atas, maxUnavailable ke bawah
for jumlah in (5, 10):
surge = math.ceil(jumlah * 25 / 100)
unavail = math.floor(jumlah * 25 / 100)
print(f"{jumlah} replika dengan 25%: maxSurge {surge}, maxUnavailable {unavail}")langkah aksi lama baru total
awal - 5 0 5
1 buat pod baru 5 1 6
2 hapus pod lama 4 1 5
3 buat pod baru 4 2 6
4 hapus pod lama 3 2 5
5 buat pod baru 3 3 6
6 hapus pod lama 2 3 5
7 buat pod baru 2 4 6
8 hapus pod lama 1 4 5
9 buat pod baru 1 5 6
10 hapus pod lama 0 5 5
5 replika dengan 25%: maxSurge 2, maxUnavailable 1
10 replika dengan 25%: maxSurge 3, maxUnavailable 2Tabel di atas memperlihatkan total Pod yang naik ke enam pada setiap langkah pembuatan, sesuai batas maxSurge, lalu turun ke lima setelah satu Pod lama berhenti. Ketersediaan tidak pernah jatuh di bawah empat Pod sesuai batas maxUnavailable. Baris terakhir menunjukkan aturan pembulatan persentase, yaitu ke atas untuk maxSurge dan ke bawah untuk maxUnavailable. Diagram berikut merangkum keadaan dalam tiga tahap, mulai dari Pod lama yang berjalan penuh, keadaan puncak saat Pod tambahan dibuat, sampai seluruh Pod beralih ke versi baru:
Pemilihan nilai kedua parameter bergantung pada sifat aplikasi. Deployment dengan satu replika biasanya menggunakan maxSurge 1 dan maxUnavailable 0, karena kehadiran Pod lama lebih penting daripada kecepatan peralihan, dan Pod baru dijamin siap lebih dahulu sebelum Pod lama berhenti. Kluster dengan banyak replika lebih cocok dengan persentase, karena perputaran tetap proporsional saat jumlah replika berubah.
Memantau rollout#
Perputaran yang sedang berjalan dapat dipantau tanpa membuka dasbor. Perintah kubectl rollout status menunggu sampai Deployment dinyatakan selesai sambil mencetak kemajuannya, sedangkan kubectl get deploy merangkum keadaan dalam kolom READY, UP-TO-DATE, dan AVAILABLE. Kolom UP-TO-DATE adalah jumlah replika yang telah menggunakan template terbaru, sehingga selisih antara READY dan UP-TO-DATE menandakan Pod baru yang masih dalam proses.
# tidak-dijalankan
# terapkan manifest Deployment ke kluster
kubectl apply -f deployment.yaml
# pantau perputaran sampai dinyatakan selesai
kubectl rollout status deployment catatan
# ringkas keadaan Deployment setelah rollout
kubectl get deploydeployment.apps/catatan created
Waiting for deployment "catatan" rollout to finish: 0 of 5 updated replicas are available...
deployment "catatan" successfully rolled out
NAME READY UP-TO-DATE AVAILABLE AGE
catatan 5/5 5 5 41sKeluaran di atas memperlihatkan urutan yang perlu dipahami. Pesan Waiting muncul selama Pod baru dibuat dan menunggu keadaan siap, pesan successfully rolled out menandakan seluruh replika menggunakan template terbaru, dan tabel akhir menunjukkan lima Pod siap dari lima yang diinginkan. Apabila perputaran macet, kolom UP-TO-DATE yang tertinggal menjadi petunjuk pertama untuk menyelidiki keadaan Pod barunya.
Ringkasan#
- Deployment mengelola sekumpulan ReplicaSet, sehingga rantai kepemilikan berbentuk Pod, ReplicaSet, lalu Deployment, dan penghapusan berjalan turun secara otomatis.
- Perubahan template Pod membuat ReplicaSet baru, sedangkan ReplicaSet lama dipertahankan dengan jumlah nol sebagai revisi.
- Strategi RollingUpdate mengganti Pod secara bertahap dengan batas maxSurge untuk kelebihan kapasitas dan maxUnavailable untuk Pod yang boleh tidak tersedia.
- Persentase dibulatkan ke atas untuk maxSurge dan ke bawah untuk maxUnavailable.
Referensi#
- Deployments — Kubernetes — Dokumentasi konsep Deployment, termasuk strategi pembaruan dan hubungannya dengan ReplicaSet.
- Deployment v1 — Kubernetes API Reference — Referensi API untuk seluruh bidang spec dan status Deployment.
- ReplicaSet — Kubernetes — Dokumentasi ReplicaSet sebagai objek yang dibuat dan dikelola Deployment.