Skip to content
Santekno.com | Level Up Your Engineering Skills
ID
📖 0%
Kubernetes

Memahami Kubernetes Deployments

· 9 mnt baca ·Ihsan Arif

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.

deployment mechanism

Membuat Kubernetes Deployment

Ketika kita ingin membuat file deployment Kubernetes tipe yang kita buat harunsya menggunakan

yml
1kind: Deployment

Pada 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

yml
 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-end

Jika sudah selesai kita coba jalankan perintah dibawah untuk membuat proses deployment Kubernetes.

bash
1➜ kubectl create -f code/deployments/deployment-definition.yaml

Untuk melihat proses deployment sudah berjalan atau tidak bisa kita lihat dengan perintah ini.

bash
1➜ kubectl get deployments
2NAME               READY   UP-TO-DATE   AVAILABLE   AGE
3myapp-deployment   4/4     4            4           9s

Terlihat 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

bash
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          4d20h

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

bash
 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 8

Dan kita ingin lihat detail secara keseluruhan dari Cluster, PODs, Replicate dan Deployment kita bisa ketik dengan perintah ini.

bash
 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       4d20h

Update 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

bash
1➜ kubectl rollout status deployment/myapp-deployment 
2deployment "myapp-deployment" successfully rolled out

Kita sudah mencoba rollout deployment, dan kita lihat perintah yang sudah kita lakukan dengan cara melihatnya

bash
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

yml
1replicas: 6

Agar kita lihat bagaimana status rollout-nya kita akan coba hapus terlebih dahulu deployment yang sebelumnya dengan perintah ini.

bash
1➜ kubectl delete deployment myapp-deployment 
2deployment.apps "myapp-deployment" deleted

dan kita coba lagi buat ulang dengan perintah

bash
1➜ kubectl create -f code/deployments/deployment-definition.yaml
2deployment.apps/myapp-deployment created

jika sudah create langsung jalankan perintah dibawah ini.

bash
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 out

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

bash
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 created

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

bash
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

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

bash
1➜ kubectl edit deployment myapp-deployment --record
2Flag --record has been deprecated, --record will be removed in the future
3deployment.apps/myapp-deployment edited

lalu cari containers image dan tambahkan menjadi seperti ini

bash
1- image: nginx:1.18

Dan akan terlihat hasilnya pada deskripsi menjadi seperti dibawah ini.

bash
 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 1

Pada 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

bash
1Containers:
2   nginx-container:
3    Image:        nginx:1.18

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

bash
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 updated

Kita lihat terlebih dahulu history

bash
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=true

Dan coba kita lihat detail setelah kita upgrade dengan image versi yang tidak ada, maka akan terlihat seperti ini

bash
 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       2m1s

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

bash
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       2m1s

Lalu bagaimana caranya agar kita bisa mengembalikan ke versi sebelumnya? yaitu dengan cara rollback dengan perintah ini.

bash
1➜   kubectl rollout undo deployment/myapp-deployment         
2deployment.apps/myapp-deployment rolled back

Sukses rollback maka akan terlihat kembali menjadi semula bisa dilihat dengan perintah ini.

bash
 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       9m57s

Maka deployment kita akan kembali ke semula dengan versi nginx:1.18

IH
Ihsan Arif
Backend engineer & penulis di Santekno. Aktif menulis tentang Go, Laravel, dan arsitektur backend modern.
Follow

💬 Komentar