آموزش کوبرنتیز؛ شب چهارم: Deployment، ReplicaSet و Rollout¶
در این درس Workloadهای Stateless و چندنمونهای را مدیریت میکنیم، نسخهٔ تازهای منتشر میکنیم و پس از یک انتشار ناموفق به نسخهٔ سالم برمیگردیم.
ساخت و ردیابی Deployment¶
فایل deployment.yaml را ایجاد کنید:
apiVersion: apps/v1
kind: Deployment
metadata:
name: web
namespace: course-night-4
labels:
app: web
spec:
replicas: 2
revisionHistoryLimit: 5
strategy:
type: RollingUpdate
rollingUpdate:
maxUnavailable: 0
maxSurge: 1
selector:
matchLabels:
app: web
template:
metadata:
labels:
app: web
spec:
containers:
- name: nginx
image: nginx:alpine
ports:
- name: http
containerPort: 80
آن را اجرا و وضعیت انتشار را دنبال کنید:
kubectl create namespace course-night-4
kubectl apply -f deployment.yaml
kubectl rollout status deployment/web --namespace course-night-4
kubectl get deployment,replicaset,pod --namespace course-night-4
زنجیرهٔ مالکیت Deployment، ReplicaSet و Pod را ببینید:
kubectl get replicasets --namespace course-night-4 \
-o custom-columns='RS:.metadata.name,OWNER:.metadata.ownerReferences[0].name,DESIRED:.spec.replicas'
kubectl get pods --namespace course-night-4 \
-o custom-columns='POD:.metadata.name,OWNER:.metadata.ownerReferences[0].name,IMAGE:.spec.containers[0].image'
Scale کردن، Revision تازه نیست¶
kubectl scale deployment/web --namespace course-night-4 --replicas=3
kubectl get deployment,replicaset,pod --namespace course-night-4
kubectl rollout history deployment/web --namespace course-night-4
تغییر تعداد Replicaها، Pod Template را عوض نمیکند؛ در نتیجه Revision یا ReplicaSet جدیدی نمیسازد.
انتشار نسخهٔ تازه¶
علت تغییر را ثبت و Image را بهروز کنید:
kubectl annotate deployment/web \
--namespace course-night-4 \
kubernetes.io/change-cause='Update nginx to 1.27-alpine' \
--overwrite
kubectl set image deployment/web \
--namespace course-night-4 \
nginx=nginx:1.27-alpine
kubectl rollout status deployment/web --namespace course-night-4
kubectl rollout history deployment/web --namespace course-night-4
kubectl get replicasets --namespace course-night-4
چون Image بخشی از Pod Template است، این بار ReplicaSet تازهای میبینید.
انتشار ناموفق و Rollback¶
عمداً Tag نامعتبری منتشر کنید:
kubectl set image deployment/web \
--namespace course-night-4 \
nginx=nginx:this-tag-does-not-exist
kubectl rollout status deployment/web \
--namespace course-night-4 \
--timeout=60s
kubectl get pods --namespace course-night-4
kubectl describe deployment web --namespace course-night-4
kubectl get events --namespace course-night-4 \
--sort-by=.metadata.creationTimestamp
پس از تشخیص خطا، به Revision سالم قبلی برگردید:
kubectl rollout undo deployment/web --namespace course-night-4
kubectl rollout status deployment/web --namespace course-night-4
تمرین Self-healing¶
kubectl get pods --namespace course-night-4
kubectl delete pod <one-pod-name> --namespace course-night-4
kubectl get pods --namespace course-night-4 --watch
پس از ساختهشدن Pod جایگزین، با Ctrl+C خارج شوید.
چکلیست پایان¶
- زنجیرهٔ Deployment تا Podها را ردیابی کردهام.
- بدون ایجاد Revision تازه، تعداد Replicaها را تغییر دادهام.
- با تغییر Image یک ReplicaSet تازه دیدهام.
- انتشار خراب را عیبیابی و Rollback کردهام.
- Self-healing را پس از حذف Pod دیدهام.