Chuyển tới nội dung chính

Deployments

1. Bốn nhu cầu của production​

Nhu cầuCách Deployment đáp ứng
Chạy nhiều instancereplicas: 3 (nhờ ReplicaSet bên dưới)
Rolling update – nâng cấp không downtimekubectl set image ... hoặc sửa YAML rồi apply
Rollback khi bản mới lỗikubectl rollout undo
Pause / resume để gom nhiều thay đổikubectl 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​

  1. Container – ứng dụng thật. Không bao giờ chạy một mình, luôn nằm trong Pod.
  2. Pod – vỏ bọc cho container: IP, mạng, volume dùng chung.
  3. 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ử.
  4. 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​

  1. Không sửa RS cũ. Tạo RS mới cho bản 1.27.
  2. Tăng dần RS mới (0 → 1 → 2 → 3), giảm dần RS cũ (3 → 2 → 1 → 0) – đó là rolling update.
  3. 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.labelsLabel 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 đíchLệnh
Tạo Pod nginxkubectl run nginx --image=nginx
Sinh YAML Pod (không tạo)kubectl run nginx --image=nginx --dry-run=client -o yaml
Tạo Deploymentkubectl create deployment nginx --image=nginx
Sinh YAML Deploymentkubectl create deployment nginx --image=nginx --dry-run=client -o yaml
Tạo Deployment 4 replicakubectl create deployment nginx --image=nginx --replicas=4
Scale sau khi tạokubectl scale deployment nginx --replicas=4
Sinh YAML, sửa rồi tạokubectl 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.