# Kubernetes Deployment - Triển khai ứng dụng bằng Deployment Deployment là một supervisor (kịch bản thực hiện) cho các Pod, cung cấp cho bạn quyền kiểm soát chi tiết về cách thức và thời điểm một phiên bản Pod mới được triển khai cũng như quay trở lại trạng thái trước đó. [![kubernetes-deployment.png](https://laptrinh.vn/uploads/images/gallery/2022-03/scaled-1680-/kubernetes-deployment.png)](https://laptrinh.vn/uploads/images/gallery/2022-03/kubernetes-deployment.png) ##### 1. Tạo Kubernetes Deployment - File: `nginx-deployment.yaml`
```YAML apiVersion: apps/v1 kind: Deployment metadata: name: nginx-deployment labels: app: nginx spec: replicas: 3 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx:1.14.2 ports: - containerPort: 80 ``` \- Giải thích: Trong ví dụ trên: - Deployment được tạo với tên `nginx-deployment` đã được tạo, được chỉ định bởi trường `metadata.name` - Deployment được tạo với 3 replicated Pod, được chỉ định bởi trường spec.replicas - Trường `spec.selector` định nghĩa cách Deployment tìm thấy Pod cần quản lý. Trong trường hợp này, chúng ta sử dụng label của Pod (`app: nginx`). Tuy nhiên, có thể thực hiện các quy tắc lựa chọn phức tạp hơn, miễn là bản thân mẫu Pod thỏa mãn quy tắc. - Trường template chứa các thông tin sau: - template.metadata: Label (nhãn) của Pod `app:nginx` được chỉ định bởi trường `metadata.labels` - template.spec: Đặc điểm kỹ thuật của Deployment - Trong ví dụ này, Pod có một container, chạy nginx image version 1.14.2 (từ docker hub) - name: Tên container - image: Docker image - ports: Các port của container tương ứng với port của image sau khi chạy \- Thực hiện: ```shell kubectl apply -f nginx-deployment.yaml ```
- Kiểm tra:
```shell kubectl get deployments ```
```shell NAME READY UP-TO-DATE AVAILABLE AGE nginx-deployment 0/3 0 0 1s ``` Khi bạn kiểm tra Deployment, các trường sau được hiển thị: - NAME: Liệt kê tên của các Triển khai trong không gian tên. - READY: Hiển thị số lượng bản sao của ứng dụng có sẵn cho người dùng của bạn. Nó theo mẫu đã sẵn sàng / mong muốn. - UP-TO-DATE: Hiển thị số lượng bản sao đã được cập nhật để đạt được trạng thái mong muốn. - AVAILABLE: Hiển thị số lượng bản sao của ứng dụng có sẵn cho người dùng của bạn. - AGE: Hiển thị lượng thời gian ứng dụng đã chạy. - Để kiểm tra trạng thái thực hiện của Deployment, thực hiện `kubectl rollout status deployment/nginx-deployment`
```shell Waiting for rollout to finish: 2 out of 3 new replicas have been updated... deployment "nginx-deployment" successfully rolled out ``` - Kiểm tra số lượng ReplicaSet được tạo bởi Deployment, thực hiện: ```shell kubectl get rs ``` ```shell NAME DESIRED CURRENT READY AGE nginx-deployment-75675f5897 3 3 3 18s ``` ReplicaSet hiển thị các trường sau: - NAME: Liệt kê tên của ReplicaSets trong không gian tên. - DESIRED: Hiển thị số lượng bản sao mong muốn của ứng dụng mà bạn xác định khi tạo Triển khai. Đây là trạng thái mong muốn. - CURRENT: Hiển thị số lượng bản sao hiện đang chạy. - READY: Hiển thị số lượng bản sao của ứng dụng có sẵn cho người dùng của bạn. - AGE: Hiển thị lượng thời gian ứng dụng đã chạy. - Để kiểm tra Pod được tạo, thực hiện: ```shell kubectl get pods --show-labels ``` ```shell NAME READY STATUS RESTARTS AGE LABELS nginx-deployment-75675f5897-7ci7o 1/1 Running 0 18s app=nginx,pod-template-hash=3123191453 nginx-deployment-75675f5897-kzszj 1/1 Running 0 18s app=nginx,pod-template-hash=3123191453 nginx-deployment-75675f5897-qqcnn 1/1 Running 0 18s app=nginx,pod-template-hash=3123191453 ``` ##### 2. Cập nhật Deployment \- Thực hiện cập nhật nginx Pod sử dụng image version `nginx:1.16.1` từ version `nginx:1.14.2` ```shell kubectl set image deployment.v1.apps/nginx-deployment nginx=nginx:1.16.1 ``` hoặc sử dụng: ```shell kubectl set image deployment/nginx-deployment nginx=nginx:1.16.1 ``` Kết quả: ```shell deployment.apps/nginx-deployment image updated ``` Tuy nhiên, chúng ta có thể edit Deployment và thay đổi `.spec.template.spec.containers[0].image` từ `nginx:1.14.2` thành `nginx:1.16.1`: ```shell kubectl edit deployment/nginx-deployment ``` Kết quả: ```shell deployment.apps/nginx-deployment edited ``` \- Kiểm tra trạng thái Deployment rollout, ReplicaSet, Pod theo các command ở trên để kiểm tra chi tiết. ##### 3. Kiểm tra chi tiết Deployment \- Kiểm tra chi tiết Deployment, thực hiện: ```shell kubectl describe deployments ``` \- Kết quả: ```shell Name: nginx-deployment Namespace: default CreationTimestamp: Thu, 30 Nov 2017 10:56:25 +0000 Labels: app=nginx Annotations: deployment.kubernetes.io/revision=2 Selector: app=nginx 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: app=nginx Containers: nginx: Image: nginx:1.16.1 Port: 80/TCP Environment: Mounts: Volumes: Conditions: Type Status Reason ---- ------ ------ Available True MinimumReplicasAvailable Progressing True NewReplicaSetAvailable OldReplicaSets: NewReplicaSet: nginx-deployment-1564180365 (3/3 replicas created) Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal ScalingReplicaSet 2m deployment-controller Scaled up replica set nginx-deployment-2035384211 to 3 Normal ScalingReplicaSet 24s deployment-controller Scaled up replica set nginx-deployment-1564180365 to 1 Normal ScalingReplicaSet 22s deployment-controller Scaled down replica set nginx-deployment-2035384211 to 2 Normal ScalingReplicaSet 22s deployment-controller Scaled up replica set nginx-deployment-1564180365 to 2 Normal ScalingReplicaSet 19s deployment-controller Scaled down replica set nginx-deployment-2035384211 to 1 Normal ScalingReplicaSet 19s deployment-controller Scaled up replica set nginx-deployment-1564180365 to 3 Normal ScalingReplicaSet 14s deployment-controller Scaled down replica set nginx-deployment-2035384211 to 0 ``` ##### 4. Deployment Rollover Mỗi khi Deployment controller quan sát thấy một kịch bản triển khai Deployment mới (cập nhật), một ReplicaSet mới được tạo để quản lý các Pod. Nếu Deployment được update, ReplicaSet đang tồn tại có label trùng `.spec.selector` nhưng không trùng `template.spec.selector` sẽ bị scaled down. Cuối cùng, một ReplicaSet mới sẽ được scaled tới .spec.replicas và tất cả các ReplicateSet cũ sẽ bị scaled về 0 Nếu chúng ta cập nhật Deployment trong khi Deployment rollout hiện tại đang trong quá trình thực thi, Deployment sẽ tạo một ReplicaSet mới theo bản cập nhật và bắt đầu scaling up, và ReplicaSet hiện tại sẽ được thêm vào danh sách ReplicaSet cũ để thực hiện scaling down **Ví dụ:** Trong trường hợp chúng ta tạo Deployment để tạo 5 replicas của `nginx:1.14.2`, nhưng sau đó thực hiện cập nhật Deployment để tạo 5 replicas của `nginx:1.16.1`, khi mới chỉ 3 replicas của `nginx:1.14.2` đã được tạo. Trong trường hợp này, Deployment sẽ ngay lập tức killing 3 Pod `nginx:1.14.2` (mà không chờ đến lúc tạo đủ 5 pod `nginx:1.14.2`) đã được tạo này, sau đó thực hiện tạo pod `nginx:1.16.1` theo kịch bản Deployment mới. ##### 5. Rolling Back a Deployment continue..