Monday, January 20, 2025

[Kubernetes 7] Deployment trong Kubernetes triển khai cập nhật và scale

-

Deployment quản lý một nhóm các Pod – các Pod được nhân bản, nó tự động thay thế các Pod bị lỗi, không phản hồi bằng pod mới nó tạo ra. Như vậy, deployment đảm bảo ứng dụng của bạn có một (hay nhiều) Pod để phục vụ các yêu cầu.

Deployment sử dụng mẫu Pod (Pod template – chứa định nghĩa / thiết lập về Pod) để tạo các Pod (các nhân bản replica), khi template này thay đổi, các Pod mới sẽ được tạo để thay thế Pod cũ ngay lập tức.

1. Triên khai deployment

Ví dụ khai báo file Deployment sau

cat > ./pushgateway_deployment.yaml << OEF
apiVersion: apps/v1
kind: Deployment
metadata:
  name: deployapp # tên của deployment
spec:
  replicas: 3 # số POD tạo ra
  selector:
    matchLabels:
      label: monitor # thiết lập các POD do deploy quản lý, là POD có nhãn  "label=monitor"
  template: # Định nghĩa mẫu POD, khi cần Deploy sử dụng mẫu này để tạo Pod
    metadata:
      name: monitorApp
      labels:
        label: monitor
    spec:
      containers:
      - name: pushgateway
        image: prom/pushgateway
        resources:
          limits:
            memory: "128Mi"
            cpu: "100m"
        ports:
          - containerPort: 9091
OEF

Thực hiện lệnh sau để triển khai

root@k8s-standalone:/home# kubectl apply -f pushgateway_deployment.yaml 
deployment.apps/deployapp created

Khi Deployment tạo ra, tên của nó là deployapp, có thể kiểm tra với lệnh:

root@k8s-standalone:/home# kubectl get deploy -o wide
NAME        READY   UP-TO-DATE   AVAILABLE   AGE   CONTAINERS    IMAGES             SELECTOR
deployapp   3/3     3            3           17s   pushgateway   prom/pushgateway   label=monitor

Deploy này quản sinh ra một ReplicasSet và quản lý nó, gõ lệnh sau để hiện thị các ReplicaSet

root@k8s-standalone:/home# kubectl get rs -o wide
NAME                   DESIRED   CURRENT   READY   AGE   CONTAINERS    IMAGES             SELECTOR
deployapp-847484d8c5   3         3         3       29s   pushgateway   prom/pushgateway   label=monitor,pod-template-hash=847484d8c5

Đến lượt ReplicaSet do Deploy quản lý lại thực hiện quản lý (tạo, xóa) các Pod, để xem các Pod

root@k8s-standalone:/home# kubectl get po -o wide -l "label=monitor"
NAME                         READY   STATUS    RESTARTS   AGE   IP              NODE             NOMINATED NODE   READINESS GATES
deployapp-847484d8c5-9mc4c   1/1     Running   0          96s   10.244.20.152   k8s-standalone   <none>           <none>
deployapp-847484d8c5-kdb27   1/1     Running   0          96s   10.244.20.153   k8s-standalone   <none>           <none>
deployapp-847484d8c5-r4cvv   1/1     Running   0          96s   10.244.20.154   k8s-standalone   <none>           <none>

Thông tin chi tiết về deploy

root@k8s-standalone:/home# kubectl describe deploy/deployapp
Name:                   deployapp
Namespace:              default
CreationTimestamp:      Sun, 02 Oct 2022 12:56:06 +0000
Labels:                 <none>
Annotations:            deployment.kubernetes.io/revision: 1
Selector:               label=monitor
Replicas:               3 desired | 3 updated | 3 total | 3 available | 0 unavailable
StrategyType:           RollingUpdate
MinReadySeconds:        0
RollingUpdateStrategy:  25% max unavailable, 25% max surge
Pod Template:
  Labels:  label=monitor
  Containers:
   pushgateway:
    Image:      prom/pushgateway
    Port:       9091/TCP
    Host Port:  0/TCP
    Limits:
      cpu:        100m
      memory:     128Mi
    Environment:  <none>
    Mounts:       <none>
  Volumes:        <none>
Conditions:
  Type           Status  Reason
  ----           ------  ------
  Available      True    MinimumReplicasAvailable
  Progressing    True    NewReplicaSetAvailable
OldReplicaSets:  <none>
NewReplicaSet:   deployapp-847484d8c5 (3/3 replicas created)
Events:
  Type    Reason             Age   From                   Message
  ----    ------             ----  ----                   -------
  Normal  ScalingReplicaSet  2m4s  deployment-controller  Scaled up replica set deployapp-847484d8c5 to 3

2. Cập nhật Deployment

Bạn có thể cập một Deployment bằng cách sử đổi mẫu (template) của Pod, khi template cập nhật thì nó tự động triển khai ra các Pod.

Có 2 cách sửa đổi, cách 1 bạn thay đổi trong file yaml rồi apply lại, ví dụ như dưới mình sửa đổi replicas từ 3 thành 5, có 2 pod mới đã được tạo.

root@k8s-standalone:/home# kubectl get po -o wide -l "label=monitor"
NAME                         READY   STATUS              RESTARTS   AGE     IP              NODE             NOMINATED NODE   READINESS GATES
deployapp-847484d8c5-9mc4c   1/1     Running             0          3m30s   10.244.20.152   k8s-standalone   <none>           <none>
deployapp-847484d8c5-cnpbp   1/1     Running             0          4s      10.244.20.155   k8s-standalone   <none>           <none>
deployapp-847484d8c5-kdb27   1/1     Running             0          3m30s   10.244.20.153   k8s-standalone   <none>           <none>
deployapp-847484d8c5-r4cvv   1/1     Running             0          3m30s   10.244.20.154   k8s-standalone   <none>           <none>
deployapp-847484d8c5-zpg5q   0/1     ContainerCreating   0          4s      <none>          k8s-standalone   <none>           <none>

Cách thử 2, thay đổi bằng cách edit trực tiếp deployment và lưu lại, bạn sẽ thấy sự thay đổi.

root@k8s-standalone:/home# kubectl edit deploy/deployapp

Khi một Deployment được cập nhật, thì Deployment dừng lại các Pod, scale lại số lượng Pod về 0, sau đó sử dụng template mới của Pod để tạo lại Pod, Pod cũ không xóa hẳng cho đến khi Pod mới đang chạy, quá trình này diễn ra đến đâu có thể xem bằng lệnh kubectl describe deploy/namedeploy. Cập nhật như vậy nó đảm bảo luôn có Pod đang chạy khi đang cập nhật.

Có thể thu hồi lại bản cập nhật bằng cách sử dụng lệnh kubectl rollout undo

Một vài lệnh cập nhật, scale trực tiếp:

Cập nhật image mới trong POD – ví dụ thay image của container node bằng image mới httpd

root@k8s-standalone:/home# kubectl set image deploy/deployapp pushgateway=nginx
deployment.apps/deployapp image updated

Kết quả

root@k8s-standalone:/home# kubectl describe deploy/deployapp
Name:                   deployapp
Namespace:              default
CreationTimestamp:      Sun, 02 Oct 2022 12:56:06 +0000
Labels:                 <none>
Annotations:            deployment.kubernetes.io/revision: 5
                        kubernetes.io/change-cause: kubectl set image deploy/deployapp pushgateway=nginx --record=true
Selector:               label=monitor
Replicas:               5 desired | 5 updated | 7 total | 4 available | 3 unavailable
StrategyType:           RollingUpdate
MinReadySeconds:        0
RollingUpdateStrategy:  25% max unavailable, 25% max surge
Pod Template:
  Labels:  label=monitor
  Containers:
   pushgateway:
    Image:      nginx

Để xem quá trình cập nhật của deployment

root@k8s-standalone:/home# kubectl rollout status deploy/deployapp
deployment "deployapp" successfully rolled out

Khi cập nhật, ReplicaSet cũ sẽ hủy và ReplicaSet mới của Deployment được tạo, tuy nhiên ReplicaSet cũ chưa bị xóa để có thể khôi phục lại về trạng thái trước (rollback).

Bạn cũng có thể cập nhật tài nguyên POD theo cách tương tự, ví dụ giới hạn CPU, Memory cho container với tên app-node

root@k8s-standalone:/home# kubectl set resources deploy/deployapp -c=pushgateway --limits=cpu=200m,memory=200Mi
deployment.apps/deployapp resource requirements updated

Kết quả

root@k8s-standalone:/home# kubectl describe deploy/deployapp
Name:                   deployapp
Namespace:              default
CreationTimestamp:      Sun, 02 Oct 2022 12:56:06 +0000
Labels:                 <none>
Annotations:            deployment.kubernetes.io/revision: 5
                        kubernetes.io/change-cause: kubectl set image deploy/deployapp pushgateway=nginx --record=true
Selector:               label=monitor
Replicas:               5 desired | 5 updated | 7 total | 4 available | 3 unavailable
StrategyType:           RollingUpdate
MinReadySeconds:        0
RollingUpdateStrategy:  25% max unavailable, 25% max surge
Pod Template:
  Labels:  label=monitor
  Containers:
   pushgateway:
    Image:      nginx
    Port:       9091/TCP
    Host Port:  0/TCP
    Limits:
      cpu:        200m
      memory:     200Mi

Rollback Deployment

Kiểm tra các lần cập nhật (revision)

root@k8s-standalone:/home# kubectl rollout history deploy/deployapp
deployment.apps/deployapp 
REVISION  CHANGE-CAUSE
3         kubectl set image deploy/deployapp pushgateway=nginx --record=true
4         kubectl set image deploy/deployapp pushgateway=nginx --record=true
5         kubectl set image deploy/deployapp pushgateway=nginx --record=true

Để xem thông tin bản cập nhật 1 thì gõ lệnh

root@k8s-standalone:/home# kubectl rollout history deploy/deployapp --revision=4
deployment.apps/deployapp with revision #4
Pod Template:
  Labels:       label=monitor
        pod-template-hash=5b847bbb6b
  Annotations:  kubernetes.io/change-cause: kubectl set image deploy/deployapp pushgateway=nginx --record=true
  Containers:
   pushgateway:
    Image:      nginx
    Port:       9091/TCP
    Host Port:  0/TCP
    Limits:
      cpu:      100m
      memory:   128Mi
    Environment:        <none>
    Mounts:     <none>
  Volumes:      <none>

Khi cần quay lại phiên bản cũ nào đó, ví dụ bản revision 1

root@k8s-standalone:/home# kubectl rollout undo deploy/deployapp --to-revision=3
deployment.apps/deployapp rolled back

Kết quả image trước đó là nginx và giờ đã quay về prom/pushgateway, hoặc thông tin resource cpu đã về 100m, memory đã về 128Mi.

root@k8s-standalone:/home# kubectl describe deploy/deployapp
Name:                   deployapp
Namespace:              default
CreationTimestamp:      Sun, 02 Oct 2022 12:56:06 +0000
Labels:                 <none>
Annotations:            deployment.kubernetes.io/revision: 6
                        kubernetes.io/change-cause: kubectl set image deploy/deployapp pushgateway=nginx --record=true
Selector:               label=monitor
Replicas:               5 desired | 5 updated | 5 total | 5 available | 0 unavailable
StrategyType:           RollingUpdate
MinReadySeconds:        0
RollingUpdateStrategy:  25% max unavailable, 25% max surge
Pod Template:
  Labels:  label=monitor
  Containers:
   pushgateway:
    Image:      prom/pushgateway
    Port:       9091/TCP
    Host Port:  0/TCP
    Limits:
      cpu:        100m
      memory:     128Mi
    Environment:  <none>
    Mounts:       <none>
  Volumes:        <none>

Nếu muốn quay lại bản cập nhật trước gần nhất

root@k8s-standalone:/home# kubectl rollout undo deploy/deployapp
deployment.apps/deployapp rolled back

Kết quả cho deployment quay lại bản cập nhật mới nhất

root@k8s-standalone:/home# kubectl describe deploy/deployapp
Name:                   deployapp
Namespace:              default
CreationTimestamp:      Sun, 02 Oct 2022 12:56:06 +0000
Labels:                 <none>
Annotations:            deployment.kubernetes.io/revision: 7
                        kubernetes.io/change-cause: kubectl set image deploy/deployapp pushgateway=nginx --record=true
Selector:               label=monitor
Replicas:               5 desired | 5 updated | 7 total | 4 available | 3 unavailable
StrategyType:           RollingUpdate
MinReadySeconds:        0
RollingUpdateStrategy:  25% max unavailable, 25% max surge
Pod Template:
  Labels:  label=monitor
  Containers:
   pushgateway:
    Image:      nginx
    Port:       9091/TCP
    Host Port:  0/TCP
    Limits:
      cpu:        200m
      memory:     200Mi

3. Scale Deployment

Scale thay đổi chỉ số replica (số lượng POD) của Deployment, ý nghĩa tương tự như scale đối với ReplicaSet trong phần trước. Ví dụ để scale với 10 POD thực hiện lệnh:

root@k8s-standalone:/home# kubectl scale deploy/deployapp --replicas=10
deployment.apps/deployapp scaled

Kết quả

root@k8s-standalone:/home# kubectl get deploy,po
NAME                        READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/deployapp   10/10   10           10          22m

NAME                             READY   STATUS    RESTARTS   AGE
pod/deployapp-54f4cb649f-4nkg9   1/1     Running   0          53s
pod/deployapp-54f4cb649f-9f8bg   1/1     Running   0          53s
pod/deployapp-54f4cb649f-ddj94   1/1     Running   0          2m49s
pod/deployapp-54f4cb649f-dht7w   1/1     Running   0          2m45s
pod/deployapp-54f4cb649f-flwqs   1/1     Running   0          53s
pod/deployapp-54f4cb649f-kfgqz   1/1     Running   0          2m49s
pod/deployapp-54f4cb649f-q9vnv   1/1     Running   0          53s
pod/deployapp-54f4cb649f-r4bx7   1/1     Running   0          2m43s
pod/deployapp-54f4cb649f-rfv2v   1/1     Running   0          2m49s
pod/deployapp-54f4cb649f-v277g   1/1     Running   0          53s

Muốn thiết lập scale tự động với số lượng POD trong khoảng min, max và thực hiện scale khi CPU của POD hoạt động ở mức 50% thì thực hiện

root@k8s-standalone:/home# kubectl autoscale deploy/deployapp --min=2 --max=5 --cpu-percent=50
horizontalpodautoscaler.autoscaling/deployapp autoscaled

Bạn cũng có thể triển khai Scale từ khai báo trong một yaml. Hoặc có thể trích xuất scale ra để chỉnh sửa bằng lệnh dưới

root@k8s-standalone:/home# kubectl get hpa/deployapp -o yaml > hpa.yaml

Đến đây mình đã giới thiệu xong tính năng deployment trong Kubernetes, hi vọng bài viết này sẽ giúp ích cho các bạn.

LEAVE A REPLY

Please enter your comment!
Please enter your name here

4,956FansLike
256FollowersFollow
223SubscribersSubscribe
spot_img

Related Stories