Deployments
1. Bốn nhu cầu của production
| Nhu cầu | Cách Deployment đáp ứng |
|---|---|
| Chạy nhiều instance | replicas: 3 (nhờ ReplicaSet bên dưới) |
| Rolling update – nâng cấp không downtime | kubectl set image ... hoặc sửa YAML rồi apply |
| Rollback khi bản mới lỗi | kubectl rollout undo |
| Pause / resume để gom nhiều thay đổi | kubectl rollout pause / resume |
💡
Khi pause, thay đổi replicas vẫn có hiệu lực ngay. Chỉ các thay đổi trong Pod template (image, resources, env…) được giữ lại, đợi resume mới rollout một lần.
2. Bốn lớp
- Container – ứng dụng thật. Không bao giờ chạy một mình, luôn nằm trong Pod.
- Pod – vỏ bọc cho container: IP, mạng, volume dùng chung.
- ReplicaSet – cứ vài giây đếm Pod có label khớp, thiếu thì tạo, thừa thì xóa. Nhưng chỉ biết đếm, không quan tâm phiên bản, không có lịch sử.
- Deployment – giải quyết điểm yếu của ReplicaSet bằng một mẹo:
Mỗi phiên bản của Pod template có một ReplicaSet riêng.
Khi đổi image 1.26 → 1.27
- Không sửa RS cũ. Tạo RS mới cho bản 1.27.
- Tăng dần RS mới (0 → 1 → 2 → 3), giảm dần RS cũ (3 → 2 → 1 → 0) – đó là rolling update.
- Giữ lại RS cũ ở 0 Pod. Rollback = tăng RS cũ lên lại.
3. File YAML
Gần như giống hệt ReplicaSet, chỉ khác kind:
apiVersion: apps/v1
kind: Deployment # chỗ duy nhất khác ReplicaSet
metadata:
name: myapp-deployment
labels:
app: myapp
spec:
replicas: 3 # chuyển xuống ReplicaSet
selector:
matchLabels:
app: myapp
template: # Pod template, cũng chuyển xuống ReplicaSet
metadata:
labels:
app: myapp
spec:
containers:
- name: nginx-container
image: nginx:1.26
| Thành phần | Ý nghĩa |
|---|---|
selector.matchLabels | Điều kiện để ch ọn Pod |
template.metadata.labels | Label gán cho Pod được tạo |
⚠️ Hai phần này phải khớp nhau, nếu không apiserver từ chối.
4. Đặt tên và pod-template-hash
- RS tên
<deployment>-<hash>, Pod tên<rs>-<5 ký tự ngẫu nhiên>. <hash>làpod-template-hash: băm từ nội dung Pod template. Deployment gắn label này vào RS và Pod để các RS của cùng Deployment không giành Pod của nhau.
kubectl get pods --show-labels
# ... app=myapp,pod-template-hash=7d4b9c8f6
5. Lệnh thường dùng
kubectl create deployment myapp --image=nginx:1.26 --replicas=3
kubectl get deployments # viết tắt: kubectl get deploy
kubectl describe deployment myapp
kubectl get deployment myapp -o yaml
kubectl scale deployment myapp --replicas=5
kubectl set image deployment/myapp nginx=nginx:1.27
kubectl set env deployment/myapp KEY=value
kubectl rollout status deployment/myapp
kubectl rollout history deployment/myapp
kubectl rollout undo deployment/myapp
kubectl rollout pause deployment/myapp
kubectl rollout resume deployment/myapp
kubectl get pods -l app=myapp
cảnh báo
kubectl get all không phải "tất cả"get all chỉ hiện Pod, Service, Deployment, ReplicaSet, DaemonSet, StatefulSet, Job… Không hiện ConfigMap, Secret, PVC, Ingress…
6. Certification Tip: tạo object bằng lệnh
Trong kỳ thi, viết YAML từ đầu vừa chậm vừa dễ sai thụt lề. Dùng lệnh imperative để tạo nhanh, hoặc để sinh file YAML mẫu rồi sửa.
| Mục đích | Lệnh |
|---|---|
| Tạo Pod nginx | kubectl run nginx --image=nginx |
| Sinh YAML Pod (không tạo) | kubectl run nginx --image=nginx --dry-run=client -o yaml |
| Tạo Deployment | kubectl create deployment nginx --image=nginx |
| Sinh YAML Deployment | kubectl create deployment nginx --image=nginx --dry-run=client -o yaml |
| Tạo Deployment 4 replica | kubectl create deployment nginx --image=nginx --replicas=4 |
| Scale sau khi tạo | kubectl scale deployment nginx --replicas=4 |
| Sinh YAML, sửa rồi tạo | kubectl create deployment nginx --image=nginx --dry-run=client -o yaml > nginx-deployment.yaml |
--dry-run=client: kubectl chỉ kiểm tra lệnh hợp lệ, không gửi lên cluster.-o yaml: in object ra dạng YAML.