Kita akan belajar bagaimana Kubernetes bekerja dalam proses deployment. Kuberntes bisa memberikan beberapa tags environment sehingga kita bisa tahu deployment itu dengan label apa.
Mekanisme Kubernetes bekerja untuk memastikan sumber daya yang dibutuhkan ada di cluster dan mencapai keadaan yang diinginkan. Hal ini menghilangkan kebutuhan untuk memperbarui dan menyebarkan aplikasi secara manual, yang memakan waktu dan dapat menyebabkan kesalahan manusia.
Pada kesempatan ini kita hanya mencoba men-deploy PODs single instance dari aplikasi yang sudah kita buat. Dan kita akan mencoba juga men-deploy menggunakan replication controllers atau replica set.
Kubernetes Deployment ini jika kita lihat dibawah terdapat pada cangkupan hirarki paling atas yang mana kita bisa memanage PODs dan replica set dalam satu file.

Membuat Kubernetes Deployment
Ketika kita ingin membuat file deployment Kubernetes tipe yang kita buat harunsya menggunakan
1kind: DeploymentPada file deployment sama halnya seperti sebelumnya pada ReplicaSet tetapi yang berbeda hanya fields kind saja.
Kita coba buat file YAML dengan nama deployment-definition.yaml dengan isi seperti
1apiVersion: apps/v1
2kind: Deployment
3metadata:
4 name: myapp-deployment
5 labels:
6 app: myapp
7 type: front-end
8spec:
9 template:
10 metadata:
11 name: myapp-pod
12 labels:
13 app: myapp
14 type: front-end
15 spec:
16 containers:
17 - name: nginx-container
18 image: nginx
19 replicas: 4
20 selector:
21 matchLabels:
22 type: front-endJika sudah selesai kita coba jalankan perintah dibawah untuk membuat proses deployment Kubernetes.
1➜ kubectl create -f code/deployments/deployment-definition.yamlUntuk melihat proses deployment sudah berjalan atau tidak bisa kita lihat dengan perintah ini.
1➜ kubectl get deployments
2NAME READY UP-TO-DATE AVAILABLE AGE
3myapp-deployment 4/4 4 4 9sTerlihat pada terminal tersebut proses deployment sudah berjalan dengan baik dan PODs sudah tersedia sebanyak 4.
lalu kita lihat replicaset dan PODs-nya dengan perintah ini
1➜ kubectl get replicaset,pods
2NAME DESIRED CURRENT READY AGE
3replicaset.apps/myapp-replicaset 4 4 4 4d20h
4
5NAME READY STATUS RESTARTS AGE
6pod/myapp-replicaset-l568n 1/1 Running 0 4d20h
7pod/myapp-replicaset-ppr52 1/1 Running 0 4d20h
8pod/myapp-replicaset-rbhlp 1/1 Running 0 4d20h
9pod/myapp-replicaset-rrqc2 1/1 Running 0 4d20hSemua sudah berjalan dengan baik dan statusnya pun Running berarti tidak ada PODs yang error atau tidak berjalan dengan baik.
Jika kita ingin lebih detail apa saja informasi yang kita deploy bisa dengan perintah.
1➜ kubectl describe deployment myapp-deployment
2Name: myapp-deployment
3Namespace: default
4CreationTimestamp: Mon, 11 Mar 2024 14:15:46 +0700
5Labels: app=myapp
6 type=front-end
7Annotations: deployment.kubernetes.io/revision: 1
8Selector: type=front-end
9Replicas: 4 desired | 4 updated | 4 total | 4 available | 0 unavailable
10StrategyType: RollingUpdate
11MinReadySeconds: 0
12RollingUpdateStrategy: 25% max unavailable, 25% max surge
13Pod Template:
14 Labels: app=myapp
15 type=front-end
16 Containers:
17 nginx-container:
18 Image: nginx
19 Port: <none>
20 Host Port: <none>
21 Environment: <none>
22 Mounts: <none>
23 Volumes: <none>
24Conditions:
25 Type Status Reason
26 ---- ------ ------
27 Available True MinimumReplicasAvailable
28 Progressing True NewReplicaSetAvailable
29OldReplicaSets: <none>
30NewReplicaSet: myapp-replicaset (4/4 replicas created)
31Events:
32 Type Reason Age From Message
33 ---- ------ ---- ---- -------
34 Normal ScalingReplicaSet 4m57s deployment-controller Scaled down replica set myapp-replicaset to 4 from 8Dan kita ingin lihat detail secara keseluruhan dari Cluster, PODs, Replicate dan Deployment kita bisa ketik dengan perintah ini.
1➜ kubectl get all
2NAME READY STATUS RESTARTS AGE
3pod/myapp-replicaset-l568n 1/1 Running 0 4d20h
4pod/myapp-replicaset-ppr52 1/1 Running 0 4d20h
5pod/myapp-replicaset-rbhlp 1/1 Running 0 4d20h
6pod/myapp-replicaset-rrqc2 1/1 Running 0 4d20h
7
8NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
9service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 11d
10
11NAME READY UP-TO-DATE AVAILABLE AGE
12deployment.apps/myapp-deployment 4/4 4 4 5m59s
13
14NAME DESIRED CURRENT READY AGE
15replicaset.apps/myapp-replicaset 4 4 4 4d20hUpdate dan Rollback Kubernetes Deployments
Ketika kita sedang melakukan deployment Service kita, suatu ketika terjadi hal yang memang tidak diinginkan pada versi terbaru tersebut atau ditemukan Error yang mengakibatkan service kita tidak berjalan dengan baik.
Maka, kita perlu ada mekanisme Rollout untuk mengembalikan service kita ke versi yang stable atau sebelumnya.
Cara rollout ini kita bisa lakukan dengan perintah
1➜ kubectl rollout status deployment/myapp-deployment
2deployment "myapp-deployment" successfully rolled outKita sudah mencoba rollout deployment, dan kita lihat perintah yang sudah kita lakukan dengan cara melihatnya
1➜ kubectl rollout history deployment/myapp-deployment
2deployment.apps/myapp-deployment
3REVISION CHANGE-CAUSE
41 <none>Misalkan kita akan simulasi ketika deployment yang kita terjadi hal yang membuat error. Ubah file YAML deployment yang sudah kita buat tadi pada
1replicas: 6Agar kita lihat bagaimana status rollout-nya kita akan coba hapus terlebih dahulu deployment yang sebelumnya dengan perintah ini.
1➜ kubectl delete deployment myapp-deployment
2deployment.apps "myapp-deployment" deleteddan kita coba lagi buat ulang dengan perintah
1➜ kubectl create -f code/deployments/deployment-definition.yaml
2deployment.apps/myapp-deployment createdjika sudah create langsung jalankan perintah dibawah ini.
1➜ kubectl rollout status deployment/myapp-deployment
2Waiting for deployment "myapp-deployment" rollout to finish: 0 of 6 updated replicas are available...
3Waiting for deployment "myapp-deployment" rollout to finish: 1 of 6 updated replicas are available...
4Waiting for deployment "myapp-deployment" rollout to finish: 2 of 6 updated replicas are available...
5Waiting for deployment "myapp-deployment" rollout to finish: 3 of 6 updated replicas are available...
6Waiting for deployment "myapp-deployment" rollout to finish: 4 of 6 updated replicas are available...
7Waiting for deployment "myapp-deployment" rollout to finish: 5 of 6 updated replicas are available...
8deployment "myapp-deployment" successfully rolled outBisa kita lihat status setiap PODs berjalan satu persatu untuk di deploy. Jika kita ingin menyimpan perintah-perintah yang sudah kita pakai maka kita bisa lakukan saat menjalankan buat deployment kita tambahkan --record seperti dibawah ini.
1➜ kubectl create -f code/deployments/deployment-definition.yaml --record
2Flag --record has been deprecated, --record will be removed in the future
3deployment.apps/myapp-deployment createdJika kita lihat memang flag --record ini kedepannya akan decprecated oleh tim Kubernetes tetapi saat ini masih kita bisa pakai.
Lalu kita lihat history perintah yang telah kita simpan dengan perintah dibawah ini.
1➜ kubectl rollout history deployment/myapp-deployment
2deployment.apps/myapp-deployment
3REVISION CHANGE-CAUSE
41 kubectl create --filename=code/deployments/deployment-definition.yaml --record=trueKita coba ubah file YAML yang sudah kita buat dengan merubah versi image dari container yang diset, misalkan kita akan upgrade ke versi 1.18 maka kita ubah dengan perintah ini.
1➜ kubectl edit deployment myapp-deployment --record
2Flag --record has been deprecated, --record will be removed in the future
3deployment.apps/myapp-deployment editedlalu cari containers image dan tambahkan menjadi seperti ini
1- image: nginx:1.18Dan akan terlihat hasilnya pada deskripsi menjadi seperti dibawah ini.
1➜ kubectl describe deployment myapp-deployment
2Name: myapp-deployment
3Namespace: default
4CreationTimestamp: Mon, 11 Mar 2024 14:50:06 +0700
5Labels: app=myapp
6 type=front-end
7Annotations: deployment.kubernetes.io/revision: 2
8 kubernetes.io/change-cause: kubectl edit deployment myapp-deployment --record=true
9Selector: type=front-end
10Replicas: 6 desired | 6 updated | 6 total | 6 available | 0 unavailable
11StrategyType: RollingUpdate
12MinReadySeconds: 0
13RollingUpdateStrategy: 25% max unavailable, 25% max surge
14Pod Template:
15 Labels: app=myapp
16 type=front-end
17 Containers:
18 nginx-container:
19 Image: nginx:1.18
20 Port: <none>
21 Host Port: <none>
22 Environment: <none>
23 Mounts: <none>
24 Volumes: <none>
25Conditions:
26 Type Status Reason
27 ---- ------ ------
28 Available True MinimumReplicasAvailable
29 Progressing True NewReplicaSetAvailable
30OldReplicaSets: myapp-deployment-84ccc5558 (0/0 replicas created)
31NewReplicaSet: myapp-deployment-7cd6f9c5d4 (6/6 replicas created)
32Events:
33 Type Reason Age From Message
34 ---- ------ ---- ---- -------
35 Normal ScalingReplicaSet 7m58s deployment-controller Scaled up replica set myapp-deployment-84ccc5558 to 6
36 Normal ScalingReplicaSet 70s deployment-controller Scaled up replica set myapp-deployment-7cd6f9c5d4 to 2
37 Normal ScalingReplicaSet 70s deployment-controller Scaled down replica set myapp-deployment-84ccc5558 to 5 from 6
38 Normal ScalingReplicaSet 70s deployment-controller Scaled up replica set myapp-deployment-7cd6f9c5d4 to 3 from 2
39 Normal ScalingReplicaSet 45s deployment-controller Scaled down replica set myapp-deployment-84ccc5558 to 4 from 5
40 Normal ScalingReplicaSet 45s deployment-controller Scaled up replica set myapp-deployment-7cd6f9c5d4 to 4 from 3
41 Normal ScalingReplicaSet 43s deployment-controller Scaled down replica set myapp-deployment-84ccc5558 to 3 from 4
42 Normal ScalingReplicaSet 43s deployment-controller Scaled up replica set myapp-deployment-7cd6f9c5d4 to 5 from 4
43 Normal ScalingReplicaSet 40s deployment-controller Scaled down replica set myapp-deployment-84ccc5558 to 2 from 3
44 Normal ScalingReplicaSet 36s (x3 over 40s) deployment-controller (combined from similar events): Scaled down replica set myapp-deployment-84ccc5558 to 0 from 1Pada fiels Annotations terlihat telah mendapatkan update revisi dengan nama deployment.kubernetes.io/revision: 2 karena kita telah melakukan update terhadap container image versi nginx menjadi 1.18.
Pada informasi containers pun sudah berubah menjadi seperti ini
1Containers:
2 nginx-container:
3 Image: nginx:1.18Bagiaman ketika kita ingin mengupdate image container tersebut tetapi ternyata versi tersebut tidak tersedia atau anggaplah service kita terjadi error maka kita akan coba simulasikan dengan pertama kita update image dengan perintah dibawah ini.
1➜ kubectl set image deployment myapp-deployment nginx-container=nginx:1.18-does-not-exist --record
2Flag --record has been deprecated, --record will be removed in the future
3deployment.apps/myapp-deployment image updatedKita lihat terlebih dahulu history
1➜ kubectl rollout history deployment/myapp-deployment
2deployment.apps/myapp-deployment
3REVISION CHANGE-CAUSE
41 kubectl create --filename=code/deployments/deployment-definition.yaml --record=true
52 kubectl set image deployment myapp-deployment nginx=nginx:1.18-does-not-exist --record=true
63 kubectl set image deployment myapp-deployment nginx-container=nginx:1.18-does-not-exist --record=trueDan coba kita lihat detail setelah kita upgrade dengan image versi yang tidak ada, maka akan terlihat seperti ini
1➜ kubectl get deployment,pods,replicaset
2NAME READY UP-TO-DATE AVAILABLE AGE
3deployment.apps/myapp-deployment 5/6 3 5 16m
4
5NAME READY STATUS RESTARTS AGE
6pod/myapp-deployment-7cd6f9c5d4-bg67z 1/1 Running 0 9m15s
7pod/myapp-deployment-7cd6f9c5d4-bt7qr 1/1 Running 0 9m15s
8pod/myapp-deployment-7cd6f9c5d4-fvnrq 1/1 Running 0 8m45s
9pod/myapp-deployment-7cd6f9c5d4-lqdwj 1/1 Running 0 9m15s
10pod/myapp-deployment-7cd6f9c5d4-rksfz 1/1 Running 0 8m50s
11pod/myapp-deployment-86c74f6c5d-fpv4n 0/1 ImagePullBackOff 0 2m1s
12pod/myapp-deployment-86c74f6c5d-pz6hk 0/1 ImagePullBackOff 0 2m1s
13pod/myapp-deployment-86c74f6c5d-sfbvb 0/1 ErrImagePull 0 2m1s
14
15NAME DESIRED CURRENT READY AGE
16replicaset.apps/myapp-deployment-7cd6f9c5d4 5 5 5 9m15s
17replicaset.apps/myapp-deployment-84ccc5558 0 0 0 16m
18replicaset.apps/myapp-deployment-86c74f6c5d 3 3 0 2m1sKita bisa lihat pada deployment terdapat status READY 5/6 itu artinya terdapat satu PODs yang sedang proses upgrade versinya tetapi terjadi error dan pada UP-TO-DATE terlihat ada 3 PODs baru yang akan menjalankan versi terbaru tetapi terjadi error, lalu status AVAILABLE ada 5 PODs yang mana ini masih pada versi sebelumnya.
Kalau kita lihat lebih detail lagi maka pada PODs terlihat 3 dengan status ImagePullBackOff atau ErrImagePull dan 5 dengan status Running.
Kubernetes ini ketika ingin mengupdate deployment sejatinya dia akan membuat ReplicaSet baru sampai berjalan semuanya baru nanti ReplicaSet yang lama akan terhapus, berbeda kasusnya ketika terjadi kesalahan maka akan terlihat seperti ini.
1NAME DESIRED CURRENT READY AGE
2replicaset.apps/myapp-deployment-7cd6f9c5d4 5 5 5 9m15s
3replicaset.apps/myapp-deployment-84ccc5558 0 0 0 16m
4replicaset.apps/myapp-deployment-86c74f6c5d 3 3 0 2m1sLalu bagaimana caranya agar kita bisa mengembalikan ke versi sebelumnya? yaitu dengan cara rollback dengan perintah ini.
1➜ kubectl rollout undo deployment/myapp-deployment
2deployment.apps/myapp-deployment rolled backSukses rollback maka akan terlihat kembali menjadi semula bisa dilihat dengan perintah ini.
1➜ kubectl get deployment,pods,replicaset
2NAME READY UP-TO-DATE AVAILABLE AGE
3deployment.apps/myapp-deployment 6/6 6 6 23m
4
5NAME READY STATUS RESTARTS AGE
6pod/myapp-deployment-7cd6f9c5d4-bg67z 1/1 Running 0 17m
7pod/myapp-deployment-7cd6f9c5d4-bt7qr 1/1 Running 0 17m
8pod/myapp-deployment-7cd6f9c5d4-fvnrq 1/1 Running 0 16m
9pod/myapp-deployment-7cd6f9c5d4-lqdwj 1/1 Running 0 17m
10pod/myapp-deployment-7cd6f9c5d4-rksfz 1/1 Running 0 16m
11pod/myapp-deployment-7cd6f9c5d4-rqcdv 1/1 Running 0 23s
12
13NAME DESIRED CURRENT READY AGE
14replicaset.apps/myapp-deployment-7cd6f9c5d4 6 6 6 17m
15replicaset.apps/myapp-deployment-84ccc5558 0 0 0 23m
16replicaset.apps/myapp-deployment-86c74f6c5d 0 0 0 9m57sMaka deployment kita akan kembali ke semula dengan versi nginx:1.18