avatar

Quản lý Pod với ReplicationController và Deployment

Trong bài này chúng ta sẽ cùng nhau tìm hiểu về cách quản lý Pod trong Kubernetes

Đăng vào
83 phút

title

Mục lục

1. Giới thiệu chung

Ở bài trước, chúng ta đã đóng gói container ứng dụng với pod và triển khai pod trên Kubernetes. Tuy nhiên, cách khai trực tiếp này có một số vấn đề. Giả sử vì một lý do nào đó mà pod chạy ứng dụng bị crash hoặc bị xóa mất, lúc này các request gọi vào ứng dụng sẽ bị lỗi. Để giải quyết vấn đề trên, chúng ta có thể tăng số lượng pod chạy ứng dụng và phải đảm bảo một số lượng pod nhất định cùng chạy trên một thời điểm để khi một pod bị lỗi thì các request gọi vào ứng dụng vẫn được xử lý bởi các pod còn lại.

Kubernetes có các object để giúp tăng hoặc giảm số lượng pod và tự động quản lý pod của ứng dụng như: ReplicationController, ReplicaSet và Deployment. Bài này chúng ta sẽ tìm hiểu các object trên và sẽ đi qua những phần sau:

  • ReplicationController, ReplicaSet trong Kubernetes là gì?
  • Cách tạo và triển khai ứng dụng với ReplicationController.
  • Deployment trong Kubernetes là gì? Tại sao lại cần Deployment?
  • Cách tạo và triển khai ứng dụng với với Deployment.

2. Tạo và quản lý Pod với ReplicationController

Ở phần này, chúng ta sẽ tìm hiểu cách tạo và quản lý Pod với ReplicationController thông qua việc triển khai một ứng dụng spring boot.

2.1. ReplicationController là gì? Tại sao lại cần ReplicationController?

ReplicationController là một object của Kubernetes. Khi triển khai ứng dụng trên kubernetes thông qua ReplicationController thì sẽ giúp ta giải quyết một số vấn đề như sau:

  • Đảm bảo số lượng pod nhất định của ứng dụng chạy trên cùng một thời điểm. Ví dụ ta muốn ứng dụng chạy trên 3 pod trên một thời điểm, trong trường hợp nào đó mà một hoặc hai pod bị vấn đề (bị xóa, crash,..) không xử lý được request từ client thì vẫn còn những pod khác xử lý để tránh request đến ứng dụng bị lỗi. Các pod mới cũng sẽ được tạo thêm để đảm bảo số lượng pod trên một thời điểm.

  • Có thể tăng (scale up) hoặc giảm (scale down) số lượng pod của ứng dụng theo mong muốn. Ví dụ có transfer-service chịu trách nhiệm chuyển tiền. Ngày bình thường thì có thể chạy một hoặc 2 pod là đủ để xử lý request rồi, nhưng những ngày đặc biệt (nhận lương, hoặc ngày lễ mua sắm,...) có thể lượng request sẽ nhiều thì ta có thể tăng số lượng pod của ứng dụng lên để đáp ứng lượng request. Còn khi qua những ngày đặc biệt này thì có thể giảm số lượng pod đi về như cũ.

Bạn có thể tham khảo thêm về ReplicationController ở docs chính thức của Kubernetes.

2.2. Tạo và triển khai ứng dụng với ReplicationController

1. Tạo ReplicationController bằng file YAML

Tạo file students-replicationController.yaml để cấu hình ReplicationController cho Students service:

k8s/students-replicationController.yaml
apiVersion: v1
kind: ReplicationController
metadata:
  name: students-service
spec:
  # Số lượng Pod muốn chạy tại một thời điểm.
  replicas: 3
  # selector sử dụng để tìm các pods có cùng labels "app: students-service" để quản lý.
  selector:
    app: students-service
  # Phần này định nghĩa podTemplate để ReplicationController tạo.
  template:
    metadata:
      name: students-service
      # Labels của pod.
      labels:
        app: students-service
    spec:
      containers:
        - name: students-service
          image: thanhnb1/students-service:latest
          # Định nghĩa các biến môi trường sẽ được thêm vào container
          env:
          - name: SERVER_PORT
            value: "8080"
          - name: MYSQL_URL
            value: "jdbc:mysql://mysql:3306/students"
          - name: MYSQL_USERNAME
            value: "students"
          - name: MYSQL_PASSWORD
            value: "VNTechies2023"
          ports:
            - containerPort: 8080

Tạo file courses-replicationController.yaml để cấu hình ReplicationController cho Courses service:

k8s/courses-replicationController.yaml
apiVersion: v1
kind: ReplicationController
metadata:
  name: courses-service
spec:
  # Số lượng Pod muốn chạy tại một thời điểm.
  replicas: 3
  # Label sử dụng để tìm các pods có cùng labels "app: courses-service" để quản lý.
  selector:
    app: courses-service
  # Phần này định nghĩa podTemplate để ReplicationController tạo.
  template:
    metadata:
      name: courses-service
      # Labels của pod.
      labels:
        app: courses-service
    spec:
      containers:
        - name: courses-service
          image: thanhnb1/courses-service:latest
          env:
          - name: SERVER_PORT
            value: "8080"
          - name: MYSQL_URL
            value: "jdbc:mysql://mysql:3306/courses"
          - name: MYSQL_USERNAME
            value: "courses"
          - name: MYSQL_PASSWORD
            value: "VNTechies2023"

          # Cấu hình URI gọi đến Students service. Trong thực tế sẽ cấu hình đến Object Service trong Kubernetes
          # nhưng vì chưa tìm hiểu đến object Service này (sẽ tìm hiểu trong bài sau) nên sẽ để IP và PORT của pod.
          - name: STUDENTS_URI
            value: http://10.1.28.78:8080
          ports:
            - containerPort: 8080

Các thành phần trong ReplicationController:

TênĐịnh nghĩa
apiVersionVersion của Kubernetes API mà bạn sử dụng để tạo object/resource. Như file đây là v1.
kindLoại object/resource của Kubernetes. Như file trên là ReplicationController.
metadataCác thông tin như: name, labels, namespace và các thông tin khác của object/resource.
specMô tả các thành phần của ReplicationController như: replicas, selector, và podTemplate.
spec.replicasMô tả số lượng pod sẽ được ReplicationController tạo và quản lý. Với cả hai file trên đều là 3, lúc này ReplicationController sẽ đảm bảo số lượng pod luôn là 3 trên một thời điểm.
spec.selectorMô tả các labels selector mà ReplicationController sẽ dùng để tìm và quản lý pod có cùng labels. Với ReplicationController tên students-service thì sẽ tìm các pod có labels là: app: students-service. Tương tự với ReplicationController tên courses-service thì sẽ tìm các pod có labels là: name: courses-service.
spec.templateMô tả podTemplate mà ReplicationController sẽ tạo gồm tên container, image sẽ dùng là gì? và mô tả các port của container.

2. Triển khai ReplicationController trên Kubernetes

# Lấy danh sách pods. Hiện tại không có Pod nào trên namespace default.

kubectl get pods
No resources found in default namespace.

Triển khai ReplicationController trên Kubernetes bằng lệnh kubectl apply -f <file-path>

kubectl apply -f students-replicationController.yaml
replicationcontroller/students-service created

kubectl apply -f courses-replicationController.yaml
replicationcontroller/courses-service created

# Lấy danh sách pod. Hiện tại thì mỗi service đang có 3 pod vì các service đều định nghĩa `replicas: 3`.
kubectl get po
NAME                     READY   STATUS    RESTARTS       AGE
students-service-hfzzz   1/1     Running   0              26s
students-service-z6tmt   1/1     Running   0              26s
students-service-lqnkr   1/1     Running   0              26s
courses-service-9tk57    1/1     Running   0              13s
courses-service-7nlc2    1/1     Running   0              13s
courses-service-2dtc4    1/1     Running   0              13s

# Lấy danh sách `ReplicationController`
kubectl get rc
NAME               DESIRED   CURRENT   READY   AGE
students-service   3         3         3       3m21s
courses-service    3         3         3       3m7s

# DESIRED=3. Trạng thái mong muốn trên Kubernetes có 3 pod trên cùng một thời điểm (`replicas=3`).
# CURRENT=3. Trạng thái hiện tại trên Kubernetes, đang có 3 pod điều running trên cùng một thời điểm.
# READY=3. Số lượng pod hiện tại running trên Kubernetes.

3. Test ReplicationController trên Kubernetes

  1. Thực hiện xóa Pod xem ReplicationController có tạo mới pod hay không?

Chúng ta tạo ra ReplicationController để giúp quản lý các pod có cùng labels. Phải đảm bảo rằng số lượng Pod chạy trên cùng một thời điểm là giống như định nghĩa. Giả sử khi có một hoặc nhiều pod bị crash hoặc bị xóa thì phải tạo một hoặc nhiều pod mới sao cho đủ số lượng pod chạy trên một thời điểm.

# 1. Xóa pod "students-service-hfzzz" của students-service.
kubectl delete po/students-service-hfzzz
pod "students-service-hfzzz" deleted

# 2. Xóa pod "courses-service-2dtc4" của courses-service.
kubectl delete po/courses-service-2dtc4
pod "courses-service-2dtc4" deleted

# 3. Khi lấy danh sách ReplicationController
kubectl get rc -w
NAME               DESIRED   CURRENT   READY   AGE
students-service   3         3         3       22m
courses-service    3         3         3       22m

# Chỗ này khi vừa xóa pod "students-service-hfzzz"
# thì CURRENT(số pod hiện tại) = 2 vì DESIRED(số pod mong muốn) = 3
# nên ReplicationController phải tạo thêm 1 pod nữa để CURRENT = DESIRED.
students-service   3         2         2       22m
students-service   3         3         2       22m
students-service   3         3         3       22m

# 4. Lấy danh sách pods
kubectl get po
NAME                     READY   STATUS    RESTARTS       AGE
students-service-z6tmt   1/1     Running   0              9m27s
students-service-lqnkr   1/1     Running   0              9m27s
courses-service-9tk57    1/1     Running   0              9m14s
courses-service-7nlc2    1/1     Running   0              9m14s

# Hai Pod dưới này được ReplicationController tạo mới.
students-service-rjswf   1/1     Running   0              15s
courses-service-tl44v    1/1     Running   0              5s
  1. Thay đổi podTemplate

Thay đổi image tag của container từ latest sang v2 của Students-service còn đối với Courses-service thì cũng tương tự.

k8s/students-replicationController.yaml
apiVersion: v1
kind: ReplicationController
metadata:
  name: students-service
spec:
  # Số lượng Pod muốn chạy tại một thời điểm.
  replicas: 3
  # Label sử dụng để tìm các pods có cùng labels "app: students-service" để quản lý.
  selector:
    app: students-service
  # Phần này định nghĩa podTemplate để ReplicationController tạo.
  template:
    metadata:
      name: students-service
      # Labels của pod.
      labels:
        app: students-service
    spec:
      containers:
        - name: students-service
          image: thanhnb1/students-service:v2 # Thay đổi từ latest sang v2.
          env:
          - name: SERVER_PORT
            value: "8080"
          - name: MYSQL_URL
            value: "jdbc:mysql://mysql:3306/students"
          - name: MYSQL_USERNAME
            value: "students"
          - name: MYSQL_PASSWORD
            value: "VNTechies2023"
          ports:
            - containerPort: 8080

Thực hiện triển khai lại ReplicationController của Students-service đã được thay đổi contaimer image.

kubectl apply -f students-replicationController.yaml
replicationcontroller/students-service configured

# 1. Lấy danh sách pod
kubectl get po
NAME                     READY   STATUS    RESTARTS       AGE
students-service-z6tmt   1/1     Running   0              37m
students-service-lqnkr   1/1     Running   0              37m
courses-service-9tk57    1/1     Running   0              36m
courses-service-7nlc2    1/1     Running   0              36m
courses-service-tl44v    1/1     Running   0              27m
students-service-s4htf   1/1     Running   0              14m

# 2. Describe pod cuả Students-service thì vẫn thấy container trong đó sử dụng image tag là: latest.
kubectl describe po/students-service-z6tmt | grep Image
    Image:          thanhnb1/students-service:latest
    Image ID:       docker.io/thanhnb1/students-service@sha256:7512e73aa6da24b147b7b7297315c1

Khi thực hiện triển khai lại ReplicationController của Students-service đã sửa container image tag từ latest sang v2 thì khi lấy danh sách pod thì vẫn thấy những pod cũ và vẫn đang chạy container image tag latest không cập nhật lại image mới là v2. Để pod cập nhật image tag mới thì sẽ phải xóa pod cũ đi, lúc này ReplicationController sẽ tạo lại pod theo podTemplate mới với image tag là v2.

RC update podTemplate

Credit: Internet

Thực hiện xóa pod "students-service-s4htf" thì lúc này ReplicationController của Students-service sẽ tạo pod theo podTemplate mới.

# 1. Xóa pod students-service-s4htf
kubectl delete po/students-service-s4htf
pod "students-service-s4htf" deleted

# 2. Lấy danh sách pods
kubectl get po
NAME                     READY   STATUS    RESTARTS       AGE
students-service-z6tmt   1/1     Running   0              45m
students-service-lqnkr   1/1     Running   0              45m
courses-service-9tk57    1/1     Running   0              45m
courses-service-7nlc2    1/1     Running   0              45m
courses-service-tl44v    1/1     Running   0              35m
students-service-2fr8r   1/1     Running   0              10s # Pod được ReplicationController tạo mới.

# 3. Kiểm tra image tag của pod `students-service-2fr8r`mới được tạo bởi ReplicationController.
# Thấy pod mới tạo đã đổi image tag từ latest sang v2.
 kubectl describe po/students-service-2fr8r | grep Image
    Image:          thanhnb1/students-service:v2
    Image ID:       docker.io/thanhnb1/students-service@sha256:973f21b057444709e82821b686b32e2f37e7e8705a8994e3b19ee946b8616f57

# 4. Còn các pod cũ thì vẫn image tag là latest không được cập nhật sang v2.
 kubectl describe po/students-service-lqnkr | grep Image
    Image:          thanhnb1/students-service:latest
    Image ID:       docker.io/thanhnb1/students-service@sha256:7512e73aa6da24b147b7b7297315c1067156a0d1c0634ff4f776b5f7b0d0c8cc
  1. Tăng/giảm số lượng pods (Horizonetally scaling pods)

ReplicationController sẽ đảm bảo số lượng pod chạy trên Kubernetes cluster trong cùng một thời điểm. Để định nghĩa số lượng pod mong muốn ta sử dụng replicas: <pod-number>. Trong ví dụ trên, chúng ta đang định nghĩa replicas: 3. Để tăng/giảm số lượng pod ta có thể sửa trong ReplicationController YAML file tại trường replicas: <pod-number>, hoặc sử dụng lệnh kubectl scale rc <replicationController-name> --replicas=<pod-number>.

  • Tăng/giảm số lượng pod bằng cách sửa trường replicas: <pod-number> từ 3 lên 10 trong file YAML:
kubectl apply -f students-replicationController.yaml
replicationcontroller/students-service configured

# Lấy danh sách pod, những pod được tạo thêm thì sẽ sử dụng podTemplate mới image tag là `v2`.
kubectl get po
NAME                     READY   STATUS    RESTARTS       AGE
students-service-z6tmt   1/1     Running   0              65m
students-service-lqnkr   1/1     Running   0              65m
courses-service-9tk57    1/1     Running   0              65m
courses-service-7nlc2    1/1     Running   0              65m
courses-service-tl44v    1/1     Running   0              56m
students-service-2fr8r   1/1     Running   0              20m
students-service-4p6hs   1/1     Running   0              17s # pod mới tạo thêm, image tag mới là v2.
students-service-xpd6b   1/1     Running   0              17s # pod mới tạo thêm, image tag mới là v2.
students-service-ltvgl   1/1     Running   0              17s # pod mới tạo thêm, image tag mới là v2.
students-service-6bkvh   1/1     Running   0              17s # pod mới tạo thêm, image tag mới là v2.
students-service-9hd4w   1/1     Running   0              17s # pod mới tạo thêm, image tag mới là v2.
students-service-twrxq   1/1     Running   0              17s # pod mới tạo thêm, image tag mới là v2.
students-service-q6d5q   1/1     Running   0              17s # pod mới tạo thêm, image tag mới là v2.
  • Tăng/giảm số lượng pod bằng cách sử dụng lệnh:
kubectl scale rc students-service --replicas=3
replicationcontroller/students-service scaled

# lấy danh sách pod.
kubectl get po
NAME                     READY   STATUS    RESTARTS       AGE
students-service-z6tmt   1/1     Running   0              68m
students-service-lqnkr   1/1     Running   0              68m
courses-service-9tk57    1/1     Running   0              68m
courses-service-7nlc2    1/1     Running   0              68m
courses-service-tl44v    1/1     Running   0              58m
students-service-2fr8r   1/1     Running   0              23m

3. Triển khai ứng dụng với Deployment trong Kubernetes

Ở phần 2 chúng ta đã tìm hiểu về ReplicationController. Nó giúp chúng ta đảm bảo số lượng pod của ứng dụng chạy trên cùng một thời điểm, cũng như dễ dàng có thể tăng hoặc giảm số lượng pod. Nhưng có vấn đề khi cập nhật podTemplate thì các pod hiện tại sẽ không được cập nhật mà phải xóa các pod hiện tại đi để ReplicationController tạo mới các pod theo podTemplate mới. Vấn đề này sẽ được giải quyết với Deployment trong Kubernetes.

3.1. Deployment trong Kubernetes là gì? Tại sao lại cần sử dụng Deployment?

Deployment là một object của Kubernetes. Khi triển khai ứng dụng thông qua Deployment thì sẽ giúp ta giải quyết một số vấn đề như sau:

  • Đảm bảo số lượng pod nhất định của ứng dụng chạy trên cùng một thời điểm và có thể tăng (scale up) hoặc giảm (scale down) số lượng pod của ứng dụng theo mong muốn. Khá giống với ReplicationController tuy nhiên Deployment lại sử dụng một object khác đó là ReplicaSet. Object này hoạt động khá tương tự như ReplicationController, ReplicaSet giống như bản nâng cấp của ReplicationController. Bạn có thể tham khảo thêm sự khác nhau của hai object này ở đây.

  • Có các chiến lược thay đổi hoặc nâng cấp ứng dụng (deployment strategy). Mô tả cách mà thay đổi hoặc nâng cấp ứng dụng, tùy vào mục đích mà sẽ sử dụng những chiến lược khác nhau. Deployment sẽ sử dụng RollingUpdate làm chiến lược mặc định.

  • Có thể rollback giữa các phiên bản của ứng dụng. Ví dụ khi nâng cấp phiên bản mới của ứng dụng (image tag mới) mà những thay đổi này có vấn đề nào đó thì ta có thể rollback về các phiên bản trước đó của ứng dụng.

Bạn có thể tham khảo thêm về Deployment ở docs chính thức của Kubernetes.

3.2. Tạo và triển khai ứng dụng với Deployment

1. Tạo Deployment bằng file YAML

Tạo file students-deployment.yaml để cấu hình Deployment cho Students service:

k8s/students-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: students-service
  labels:
    app: students-service
spec:
  selector:
    matchLabels:
      app: students-service
  replicas: 3
  strategy:
    rollingUpdate:
      maxSurge: 25%
      maxUnavailable: 25%
    type: RollingUpdate
  template:
    metadata:
      labels:
        app: students-service
    spec:
      containers:
        - name: students-service
          image: thanhnb1/students-service:latest
          env:
          - name: SERVER_PORT
            value: "8080"
          - name: MYSQL_URL
            value: "jdbc:mysql://mysql:3306/students"
          - name: MYSQL_USERNAME
            value: "students"
          - name: MYSQL_PASSWORD
            value: "VNTechies2023"
          ports:
            - containerPort: 8080
      restartPolicy: Always

Tạo file courses-deployment.yaml để cấu hình Deployment cho Courses service:

k8s/courses-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: courses-service
  labels:
    app: courses-service
spec:
  selector:
    matchLabels:
      app: courses-service
  replicas: 3
  strategy:
    rollingUpdate:
      maxSurge: 25%
      maxUnavailable: 25%
    type: RollingUpdate
  template:
    metadata:
      labels:
        app: courses-service
    spec:
      containers:
        - name: courses-service
          image: thanhnb1/courses-service:latest
          env:
          - name: SERVER_PORT
            value: "8080"
          - name: MYSQL_URL
            value: "jdbc:mysql://mysql:3306/courses"
          - name: MYSQL_USERNAME
            value: "courses"
          - name: MYSQL_PASSWORD
            value: "VNTechies2023"

          # Cấu hình URI gọi đến Students service. Trong thực tế sẽ cấu hình đến Object Service trong Kubernetes
          # nhưng vì chưa tìm hiểu đến object Service này (sẽ tìm hiểu trong bài sau) nên sẽ để IP và PORT của pod.
          - name: STUDENTS_URI
            value: http://10.1.28.78:8080
          ports:
            - containerPort: 8080
      restartPolicy: Always

Các thành phần trong Deployment:

TênĐịnh nghĩa
apiVersionVersion của Kubernetes API mà bạn sử dụng để tạo object/resource. Như file trên thì apiVersion: apps/v1.
kindLoại object/resource của Kubernetes, Như file trên thì kind: Deployment.
metadataCác thông tin như: name, labels, namespace và các thông tin khác của object/resource. Như file trên tên của Deployment Courses service là: name: courses-service và labels: app: courses-service. Tương tự với Deployment của Students Serivce sẽ là: name: students-service và labels: app: students-service.
specMô tả các thành phần của Deployment như: selector, replicas, strategy và podTemplate.
spec.selectorReplicaSet sẽ dùng để tìm và quản lý pod có cùng labels. Như file trên ReplicaSet của Courses service sẽ tìm các pod có labels là: app: courses-service. Tương tự ReplicaSet của Students service sẽ là: app: students-service.
spec.replicasDeployment sẽ sử dụng ReplicaSet để tạo và quản lý pod. Như file trên thì replicas: 3 tức là ReplicaSet sẽ đảm bảo có 3 pod chạy trên một thời điểm.
spec.strategyMô tả chiến lược khi thực hiện update ứng dụng. Deployment cung cấp nhiều chiến lược như: Recreate, RollingUpdate,... Trong trường hợp này là sử dụng chiến lược RollingUpdate.
spec.templateMô tả podTemplate mà ReplicaSet sẽ tạo và quản lý.

2. Triển khai Deployment trên Kubernetes

Triển khai Students Deployment bằng lệnh: kubectl apply -f <path-deployment-file>

kubectl apply -f students-deployment.yaml
deployment.apps/students-service created

# Lấy danh sách pods
kubectl get po
NAME                                READY   STATUS    RESTARTS        AGE
students-service-5f4569998f-sqwhw   1/1     Running   0               36s
students-service-5f4569998f-q8jwm   1/1     Running   0               36s
students-service-5f4569998f-7qvgt   1/1     Running   0               36s

# Lấy danh sách ReplicaSet
kubectl get rs
NAME                          DESIRED   CURRENT   READY   AGE
students-service-5f4569998f   3         3         3       77s

# Lấy danh sách Deployment
kubectl get deployment
NAME               READY   UP-TO-DATE   AVAILABLE   AGE
students-service   3/3     3            3           82s

Triển khai Courses Deployment bằng lệnh: kubectl apply -f <path-deployment-file>

kubectl apply -f courses-deployment.yaml
deployment.apps/courses-service created

# Lấy danh sách pods
kubectl get po
NAME                                READY   STATUS    RESTARTS        AGE
courses-service-97f8d658d-cp6nm     1/1     Running   0               14s
courses-service-97f8d658d-jfvxw     1/1     Running   0               14s
courses-service-97f8d658d-jp498     1/1     Running   0               14s

# Lấy danh sách ReplicaSet
kubectl get rs
NAME                          DESIRED   CURRENT   READY   AGE
courses-service-97f8d658d     3         3         3       72s

# Lấy danh sách Deployment
kubectl get deployment
NAME               READY   UP-TO-DATE   AVAILABLE   AGE
courses-service    3/3     3            3           3m29s

Khi triển khai Deployment trên Kubernetes thì sẽ tạo ra:

  • Pod: Các pod trên được tạo theo podTemplate được mô tả ở phần spec.template trong file Deployment.
  • ReplicaSet: ReplicaSet sẽ giúp tạo và quản lý pod nhằm đảm bảo số lượng pod chạy trên cùng một thời điểm. Deployment có thể có nhiều ReplicaSet mỗi lần thay đổi podTemplate thì sẽ đều tạo ra một ReplicaSet mới.

3. Test Deployment trên Kubernetes

  1. Thực hiện thay đổi podTemplate

Thực hiện cập nhật podTemplate của Deployment Students service, đổi image tag của container từ: latest sang v2 rồi sau đó triển khai lại Deployment.

# Thay đổi container image từ `latest` sang `v2` và triển khai lại deployment.
kubectl apply -f students-deployment.yaml
deployment.apps/students-service configured

# Lấy danh sách pods trong quá trình update.
# Các pod cũ sẽ bị thay thế như thế nào tùy thuộc vào Deployment strategy được định nghĩa là gì?
kubectl get po -w
NAME                                READY   STATUS    RESTARTS        AGE
students-service-5f4569998f-sqwhw   1/1     Running   0               22m
students-service-5f4569998f-q8jwm   1/1     Running   0               22m           # pod cũ
students-service-5f4569998f-7qvgt   1/1     Running   0               22m
students-service-64cd4c84b6-bxchk   0/1     Pending   0               0s            # pod mới
students-service-64cd4c84b6-bxchk   0/1     ContainerCreating   0               0s  # pod mới
students-service-64cd4c84b6-bxchk   1/1     Running             0               2s  # pod mới (running).
students-service-5f4569998f-q8jwm   1/1     Terminating         0               22m # pod cũ sẽ bị xóa đi (Terminating).
students-service-64cd4c84b6-f5cts   0/1     Pending             0               0s
students-service-64cd4c84b6-f5cts   0/1     ContainerCreating   0               0s
students-service-5f4569998f-q8jwm   1/1     Terminating         0               22m # pod cũ sẽ bị xóa đi (Terminating).
students-service-64cd4c84b6-f5cts   0/1     ContainerCreating   0               0s
students-service-5f4569998f-q8jwm   0/1     Terminating         0               22m # pod cũ sẽ bị xóa đi (Terminating).
students-service-5f4569998f-q8jwm   0/1     Terminating         0               22m # pod cũ sẽ bị xóa đi (Terminating).
students-service-64cd4c84b6-f5cts   1/1     Running             0               2s
students-service-5f4569998f-sqwhw   1/1     Terminating         0               22m
students-service-64cd4c84b6-tgdjt   0/1     Pending             0               0s
students-service-64cd4c84b6-tgdjt   0/1     ContainerCreating   0               0s
students-service-5f4569998f-sqwhw   1/1     Terminating         0               22m
students-service-64cd4c84b6-tgdjt   0/1     ContainerCreating   0               0s
students-service-5f4569998f-sqwhw   0/1     Terminating         0               22m
students-service-64cd4c84b6-tgdjt   1/1     Running             0               2s
students-service-5f4569998f-7qvgt   1/1     Terminating         0               22m
students-service-5f4569998f-7qvgt   0/1     Terminating         0               22m

# Lấy danh sách pods sau quá trình thay đổi podTemplate.
kubectl get po
NAME                                READY   STATUS    RESTARTS        AGE
students-service-64cd4c84b6-bxchk   1/1     Running   0               13m
students-service-64cd4c84b6-f5cts   1/1     Running   0               13m
students-service-64cd4c84b6-tgdjt   1/1     Running   0               13m

# Lấy danh sách ReplicaSet sau khi thay đổi podTemplate.
 kubectl get rs
NAME                          DESIRED   CURRENT   READY   AGE
students-service-64cd4c84b6   3         3         3       14m
students-service-5f4569998f   0         0         0       36m

Khi thực hiện thay đổi podTemplate và triển khai lại Deployment thì thấy có replicaSet students-service-64cd4c84b6 được tạo mới và replicaSet trước đó đã giảm số lượng pod về 0. Khi thay đổi podTemplate thì Deployment sẽ tạo một replicaSet mới. Các pod (phiên bản mới) sẽ thay thế dần dần các pod (phiên bản cũ) cho đến khi các pod (phiên bản cũ) đã được thay thế hết bằng các pod (phiên bản mới). Cách mà Deployment cập nhật phiên bản của ứng dụng đó gọi các các chiến lược Deployment (Deployment Strategy). Deployment sử dụng RollingUpdate là chiến lược mặc định.

  1. Thực hiện rollback giữa các phiên bản của ứng dụng.

Khi triển khai ứng dụng bằng Deployment lần đầu thì sẽ là phiên bản đầu tiên nên REVISION = 1. Ở phần trên đã thay đổi podTemplate (từ latest sang v2) và triển khai lại Deployment nên sẽ có thêm một phiên bản mới của Deployment lúc này REVISION = 2. REVISION sẽ theo dõi những thay đổi được thực hiện trên Deployment và cho phép rollback giữa các phiên bản của deployment ứng dung nếu cần thiết.

# 1. Lấy danh sách phiên bản của Deployment ứng dụng.
kubectl rollout history deployment/students-service
deployment.apps/students-service
REVISION  CHANGE-CAUSE
1         <none>
2         <none>

# 2. Có thể thêm CHANGE-CAUSE bằng lệnh dưới đây để dễ dàng rollback giữa các phiên bản hơn.
kubectl annotate deployment/<DEPLOYMENT_NAME> kubernetes.io/change-cause="thêm mô tả"

kubectl annotate deployment/students-service kubernetes.io/change-cause="change image tag from latest to v2"
deployment.apps/students-service annotated

# Lấy danh sách phiên bản của Deployment ứng dụng.
kubectl rollout history deployment/students-service
deployment.apps/students-service
REVISION  CHANGE-CAUSE
1         <none>
2         change image tag from latest to v2

# Kiểm tra phiên bản hiện tại của Deployment ứng dụng
kubectl get deployment/students-service -o yaml | grep deployment.kubernetes.io/revision:
  deployment.kubernetes.io/revision: "2"

# Thực hiện rollback về phiên bản cụ thể nào đó từ revision: "2" => revision: "1" (rollback lại image tag là latest).
kubectl rollout undo deployment/students-service --to-revision=1
deployment.apps/students-service rolled back

# Danh sách pod mới
kubectl get po
NAME                                READY   STATUS    RESTARTS        AGE
students-service-5f4569998f-jrlmc   1/1     Running   0               18s
students-service-5f4569998f-dz9f8   1/1     Running   0               15s
students-service-5f4569998f-5ppwq   1/1     Running   0               12s

# Kiểm tra phiên bản hiện tại ứng dụng.
 kubectl describe po/students-service-5f4569998f-jrlmc | grep Image
    Image:          thanhnb1/students-service:latest
    Image ID:       docker.io/thanhnb1/students-service@sha256:7512e73aa6da24b147b7b7297315c1067156a0d1c0634ff4f776b5f7b0d0c8cc

4. Tổng kết

Qua này này chúng ta đã tìm hiều về cách triển khai ứng dụng và quản lý pod của ứng dụng bằng các object trong Kubernetes như: ReplicationController và Deployment. Chúng ta đã tìm hiểu:

  • Triển khai ứng dụng với ReplicationController và Deployment.
  • Thực hiện tăng/giảm số lượng pod của ứng dụng.
  • Thực hiện cập nhật podTemplate với ReplicationController và cập nhật podTemplate với Deployment.
  • Thực hiện rollback các phiên bản trước đó của ứng dụng khi triển khai ứng dụng với Deployment.

Ở bài viết sau chúng ta sẽ tìm hiểu về cách truy cập ứng dụng từ bên ngoài cụm Kubernetes và cách các ứng dụng kết nối, liên lạc với nhau bên trong cụm Kubernetes.