Giả sử bây giờ mình muốn triển khai nhiều ứng dụng, hoặc là mình cần cập nhật một phiên bản mới. Tuy nhiên, khi cập nhật mình không muốn cập nhật hết cùng một lúc vì nó sẽ ảnh hưởng đến user. Và đôi khi trong quá trình cập nhật, mình gặp phải một số lỗi không mong muốn thì mình sẽ muốn khôi phục lại, hoặc là mình sẽ cập nhật nhưng mà mình lại không muốn nó khả dụng luôn, những vấn đề này nó sẽ liên quan đến Deployment K8s. Trong bài viết này, chúng ta sẽ tìm hiểu chi tiết về Kubernetes Deployment là gì, cách hoạt động và triển khai.
Xem thêm:
Containerd là gì ? So sánh Docker và Containerd
Container runtime là gì ? 2 loại phổ biến
1. Kubernetes Deployment là gì?
Hiểu đơn giản, Deployment trong Kubernetes là một “kế hoạch” triển khai ứng dụng. Nó giúp bạn:
- Triển khai ứng dụng mới.
- Cập nhật phiên bản mà không gây gián đoạn dịch vụ.
- Quản lý vòng đời của các Pod đang chạy.
- Và quay về phiên bản cũ nếu có sự cố xảy ra.
Bạn không cần phải xoá tay rồi tạo lại từng Pod như trước nữa, chỉ cần thay đổi file YAML, Kubernetes sẽ lo tất cả.

2. Lợi ích của Deployment
- Nâng cấp liền mạch: Deployment cung cấp hai cách triển khai chính: Recreate và RollingUpdate. Cả hai đều được thực hiện tự động, giúp quá trình nâng cấp trở nên đơn giản và hiệu quả.
- Hoàn tác thay đổi: Lịch sử các phiên bản được lưu trữ, bạn có thể dễ dàng hoàn tác các thay đổi bằng cách rollback về phiên bản trước đó.
- Tạm dừng và tiếp tục: Bạn có thể tạm dừng quá trình triển khai và tiếp tục khi cần thiết.
- Quản lý Pod: Deployment quản lý các Pod trong k8s. Tự động thay thế các Pod bị lỗi bằng các Pod mới, đảm bảo ứng dụng luôn sẵn sàng.
3. Deploymeny hoạt động như thế nào?
Deployment hoạt động dựa trên các template ( file định nghĩa về cấu hình và thiết lập của Pod). Như ở hình dưới, Deployment sẽ sinh ra một ReplicaSet, và ReplicaSet sẽ chịu trách nhiệm tạo ra các Pod dựa trên cấu hình (template) bạn cung cấp.
Nếu bạn cập nhật image hoặc số replica, Kubernetes sẽ:
- Tạo ReplicaSet mới
- Cập nhật dần dần các Pod
- Xoá ReplicaSet cũ khi không còn dùng nữa

deployments.yaml:
apiVersion: apps/v1
kind: Deployment
metadata:
name: deployment-1
spec:
replicas: 2
selector:
matchLabels:
name: busybox-pod
template:
metadata:
labels:
name: busybox-pod
spec:
containers:
- name: busybox-container
image: busybox888
command:
- sh
- "-c"
- echo Hello Kubernetes! && sleep 3600
4. Các thao tác với Kubernetes Deployments
– How many Deployments exist on the system?
controlplane ~ ➜ kubectl get deployments NAME READY UP-TO-DATE AVAILABLE AGE frontend-deployment 0/4 4 0 6s
– Create a new Deployment with the below attributes using your own deployment definition file.
Name: httpd-frontend;
Replicas: 3;
Image: httpd:2.4-alpine
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: httpd-frontend
spec:
replicas: 3
selector:
matchLabels:
name: httpd-frontend
template:
metadata:
labels:
name: httpd-frontend
spec:
containers:
- name: httpd-frontend
image: httpd:2.4-alpine
5. Hai kiểu cập nhật phổ biến
Recreate: Xoá bỏ tất cả các phiên bản cũ trước, khi triển khai phiên bản mới. Gây gián đoạn dịch vụ trong quá trình chuyển đổi.
Rolling Update: Cập nhật từng phiên bản một, đảm bảo dịch vụ luôn hoạt động.

Recreate: Các sự kiện sẽ cho thấy replica set cũ bị thu nhỏ xuống 0 trước, sau đó replica set mới được mở rộng lên 5.
Rolling Update: Các sự kiện sẽ cho thấy replica set cũ và mới được thu nhỏ và mở rộng từng phần một cách đồng thời.

6. Rollout và Revision là gì?
Mỗi lần bạn cập nhật Deployment (ví dụ đổi image), Kubernetes sẽ tạo một Revision mới. Nhờ đó bạn có thể:
- Theo dõi lịch sử thay đổi
- Rollback lại phiên bản cũ nếu cần
Xem rollout hiện tại:
kubectl rollout status deployment <tên-deploy>
Rollback:
kubectl rollout undo deployment <tên-deploy>

7. Rollback
Khái niệm: Quay lại phiên bản trước của Deployment từ đó tạo ra số lượng Pod cần thiết để đáp ứng số lượng
Kết quả: Các pod trong replica set mới sẽ bị xoá, các pod trong replica set cũ sẽ được khởi động lại.
Khi nâng cấp ứng dụng, Deployment sẽ tạo ra một replica set mới, triển khai Pod mới và đồng thời loại bỏ các pod trong replica set cũ.

8. Một số lệnh kubectl quản lý Deployment
| Lệnh | Chức năng |
|---|---|
k create deploy nginx-deploy --image=nginx:1.20 --replicas=3 |
Tạo một deployment tên nginx-deploy với 3 pod chạy nginx. |
k get deploy |
Liệt kê tất cả các deployment trong namespace hiện tại. |
k get deploy -n <namespace> |
Liệt kê deployment trong namespace cụ thể. |
k describe deploy <tên> |
Xem chi tiết một deployment, gồm sự kiện, pod mẫu, tình trạng. |
k delete deploy <tên> |
Xóa deployment và toàn bộ pod liên quan. |
k scale deploy <tên> --replicas=5 |
Thay đổi số lượng pod của deployment. |
k autoscale deploy <tên> --min=2 --max=10 --cpu-percent=70 |
Tự động scale pod theo mức CPU. |
k set image deploy/<tên> <container>=<image> |
Cập nhật image, tự động rolling update. |
k rollout undo deploy <tên> |
Rollback về phiên bản trước đó. |
k expose deploy <tên> --port=80 --type=NodePort |
Tạo service để truy cập từ bên ngoài. |
k get po -l app=<label> |
Liệt kê các pod theo nhãn (label). |
k logs -l app=<label> |
Xem log tất cả container/pod có nhãn phù hợp. |
k debug deploy/<tên> -it --image=busybox -- sh |
Debug deployment bằng cách gắn container khác. |
Cảm ơn các bạn đã tham khảo kubernetes cơ bản trên ttnguyen.net.
Bài viết liên quan: