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.