No menu items!
No menu items!
More

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

    Bài viết gần đây

    spot_img

    Related Stories

    Leave A Reply

    Please enter your comment!
    Please enter your name here

    Đăng ký nhận thông tin bài viết qua email