Danh sách bài viết trong series Học Kubernetes Từ Cơ Bản Đến Chứng Chỉ CKAD
- Lộ Trình Học Kubernetes Từ Cơ Bản Đến Chứng Chỉ CKAD
- Bài 1: Giới Thiệu Kubernetes Và Khái Niệm Cluster Cho CKAD
- Bài 2: Cài Đặt Minikube Và sử dụng kubectl Cơ Bản
- Bài 3: Quản Lý Pod Cơ Bản (Create, Delete, Describe)
- Bài 4: Sử Dụng ConfigMap Và Secret Trong YAML
- Bài 5: Quản Lý Environment Variables Và Command/Args
- Bài 6: Cấu Hình Deployment Và Replica Set
- Bài 7: Thiết Kế Pod Với Nhiều Container
- Bài 8: Sử Dụng Sidecar Và Init Container
- Bài 9: Chia Sẻ Tài Nguyên Giữa Các Container
- Bài 10: Giám Sát Log Và Events Với kubectl logs
- Bài 11: Debug Pod Với kubectl describe Và exec
- Bài 12: Tối Ưu Pod Với Resource Limits Và Requests
- Bài 13: Sử Dụng Liveness Và Readiness Probes
- Bài 14: Tối Ưu Hóa Pod Với HPA (Horizontal Pod Autoscaler)
- Bài 15: Cấu Hình Service (ClusterIP, NodePort)
- Bài 16: Sử Dụng Ingress Và Network Policy
- Bài 17: Quản Lý DNS Và Load Balancing Trong Kubernetes
- Bài 18: Sử Dụng Volume (emptyDir, hostPath)
- Bài 19: Cấu Hình Persistent Volume Và Persistent Volume Claim
- Bài 20: Tổng Kết, Mẹo Thi CKAD, Bài Tập Thực Hành Cuối
Sau khi đã học cách quản lý environment variables và command/args trong Bài 5, chúng ta sẽ kết thúc domain Configuration (chiếm 20% trọng số trong kỳ thi CKAD) bằng việc tìm hiểu Deployment và ReplicaSet. Đây là hai objects quan trọng để quản lý ứng dụng stateless, đảm bảo high availability, scaling, và cập nhật không downtime. Bài này sẽ hướng dẫn bạn cấu hình chúng qua YAML, quản lý rollout/rollback, và áp dụng thực tế trên Minikube.
Trong CKAD, domain Configuration thường yêu cầu bạn tạo Deployment từ YAML, scale ReplicaSet, hoặc xử lý update với strategy cụ thể. Bạn có thể gặp task như deploy một ứng dụng với 3 replicas, rollback khi lỗi, hoặc debug ReplicaSet không match Pods.
Deployment Là Gì Và Tại Sao Nên Sử Dụng?
Deployment là một controller Kubernetes quản lý việc triển khai và cập nhật Pods một cách declarative. Nó sử dụng ReplicaSet để duy trì số lượng Pods mong muốn, hỗ trợ rollout (cập nhật dần dần), rollback (quay lại phiên bản cũ), và scaling (tăng/giảm replicas). Deployment lý tưởng cho stateless apps như web servers, nơi Pods có thể thay thế mà không mất data.
Lợi ích chính:
- Zero-downtime updates: Cập nhật image hoặc config mà không gián đoạn service (rolling update strategy).
- Version history: Tự động tạo ReplicaSet mới cho mỗi update, dễ rollback.
- Scaling: Dễ dàng thay đổi số lượng Pods để handle traffic.
- Self-healing: Tự động recreate Pods nếu crash hoặc node fail.
- Pod template: Định nghĩa spec Pods (containers, volumes, env) trong Deployment.
Deployment không quản lý trực tiếp Pods mà qua ReplicaSet – một layer abstraction để tránh chỉnh sửa thủ công. Trong sản xuất, Deployment là standard cho apps, kết hợp với Services cho exposure.
Dưới đây là sơ đồ kiến trúc Deployment minh họa cách Deployment quản lý ReplicaSets và Pods.
ReplicaSet Là Gì Và Mối Quan Hệ Với Deployment?
ReplicaSet (RS) là controller duy trì số lượng Pods chính xác theo spec, sử dụng selector (labels) để match và manage Pods. Nếu Pods ít hơn replicas, RS tạo thêm nếu nhiều hơn, RS xóa bớt. RS là building block cho Deployment, nhưng hiếm khi dùng trực tiếp vì Deployment cung cấp thêm tính năng update/rollback.
Khác biệt chính:
- ReplicaSet: Chỉ duy trì replicas, không hỗ trợ update (nếu thay đổi template, phải tạo RS mới).
- Deployment: Quản lý nhiều RS (mỗi update tạo RS mới), hỗ trợ strategy như RollingUpdate hoặc Recreate.
ReplicaSet kế thừa từ ReplicationController (cũ), nhưng hỗ trợ set-based selectors (matchExpressions) thay vì equality-based.
Dưới đây là diagram minh họa ReplicaSet, cho thấy cách nó duy trì Pods qua labels.
Bảng So Sánh Deployment Và ReplicaSet
| Tiêu chí | Deployment | ReplicaSet |
|---|---|---|
| Mục đích | Triển khai, update, rollback Pods | Duy trì số lượng Pods cố định |
| Quản lý | Quản lý nhiều RS, hỗ trợ history | Quản lý trực tiếp Pods qua selector |
| Update strategy | RollingUpdate (default), Recreate | Không hỗ trợ, phải xóa và tạo mới |
| Selector | Match labels/expressions | Tương tự |
| Sử dụng | Stateless apps, production | Internal cho Deployment, ít dùng trực tiếp |
| YAML kind | Deployment | ReplicaSet |
| Lệnh tạo imperative | kubectl create deployment |
kubectl create rs |
Cấu Hình Deployment Và ReplicaSet Trong YAML
Ưu tiên declarative YAML cho CKAD. Dưới đây là cấu trúc chi tiết.
YAML Cho ReplicaSet
Cấu trúc cơ bản:
apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: my-rs
labels:
app: myapp
spec:
replicas: 3 # Số lượng Pods
selector:
matchLabels: # Equality-based
app: myapp
matchExpressions: # Set-based (optional)
- key: tier
operator: In
values: [frontend]
template: # Pod template
metadata:
labels:
app: myapp
spec:
containers:
- name: nginx
image: nginx:1.14
ports:
- containerPort: 80
Áp dụng: kubectl apply -f rs.yaml.
YAML Cho Deployment
Cấu trúc mở rộng từ RS:
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-deployment
spec:
replicas: 3
selector:
matchLabels:
app: myapp
template: # Giống RS
metadata:
labels:
app: myapp
spec:
containers:
- name: nginx
image: nginx:1.14
strategy: # Update strategy
type: RollingUpdate # Hoặc Recreate (kill all then create)
rollingUpdate:
maxSurge: 25% # Số Pods thêm tối đa (int hoặc %)
maxUnavailable: 25% # Số Pods unavailable tối đa
minReadySeconds: 10 # Thời gian chờ Pod ready trước khi coi success
revisionHistoryLimit: 10 # Giữ bao nhiêu RS cũ cho rollback
paused: false # Pause rollout (optional)
Dưới đây là diagram quy trình rollout của Deployment, minh họa cách tạo RS mới và scale dần.
Các Lệnh Kubectl Để Quản Lý Deployment Và ReplicaSet
-
Tạo Imperative:
- Deployment:
kubectl create deployment my-dep --image=nginx --replicas=3. - ReplicaSet:
kubectl create rs my-rs --image=nginx --replicas=3(ít dùng).
- Deployment:
-
Get/List:
kubectl get deploymentshoặckubectl get rs.kubectl get deployments -o wide(xem replicas, image).
-
Describe:
kubectl describe deployment my-dep(xem events, conditions, RS liên quan). -
Scale:
kubectl scale deployment my-dep --replicas=5.- Tương tự cho RS:
kubectl scale rs my-rs --replicas=5.
-
Update:
kubectl set image deployment/my-dep nginx=nginx:1.16(trigger rollout).- Edit YAML:
kubectl edit deployment my-dep.
-
Rollout Management (chỉ Deployment):
- Status:
kubectl rollout status deployment/my-dep. - History:
kubectl rollout history deployment/my-dep. - Rollback:
kubectl rollout undo deployment/my-dep --to-revision=2. - Pause/Resume:
kubectl rollout pause deployment/my-dep,kubectl rollout resume deployment/my-dep.
- Status:
-
Delete:
kubectl delete deployment my-dep(xóa cascade RS và Pods).
Liên Hệ Với Chứng Chỉ CKAD
Domain Configuration (20%) thường có task về Deployment/RS, như:
- Tạo Deployment với spec replicas, labels, và strategy.
- Scale RS để match yêu cầu.
- Update image và rollback nếu fail.
Mẹo thi:
- Nhớ labels phải match giữa selector và template để tránh Pods orphan.
- Dùng
kubectl rollout statusđể check tiến trình update. - Thời gian: 5-8 phút/task, verify bằng
get podsvàdescribe. - Luyện: Sử dụng
kubectl explain deployment.spec.strategycho docs. - Thực hành rollback để quen với history.
Thực Hành Thực Tế Trên Minikube
-
Tạo ReplicaSet: Tạo file
rs.yamlnhư trên, rồi:kubectl apply -f rs.yaml kubectl get rs kubectl get pods -l app=myapp # Xem 3 Pods -
Tạo Deployment: Tạo file
dep.yamlnhư trên:kubectl apply -f dep.yaml kubectl get deployments kubectl get rs # Thấy RS do Deployment tạo -
Scale và Update:
kubectl scale deployment my-deployment --replicas=5 kubectl set image deployment/my-deployment nginx=nginx:1.16 kubectl rollout status deployment/my-deployment # Theo dõi kubectl rollout history deployment/my-deployment kubectl rollout undo deployment/my-deployment # Rollback -
Cleanup:
kubectl delete deployment my-deployment, kubectl delete rs my-rs.
Nếu RS không tạo Pods, check labels match bằng describe rs.
Kết Luận
Bài này đã hướng dẫn chi tiết cấu hình Deployment và ReplicaSet, từ YAML đến quản lý rollout. Bạn giờ có thể triển khai apps scalable, sẵn sàng hoàn tất domain Configuration cho CKAD. Tiếp theo, ở Bài 7: Thiết Kế Pod Với Nhiều Container, chúng ta sẽ bước vào domain Multi-Container Pods để tìm hiểu sidecars và init containers.







