پرش به محتویات

آموزش کوبرنتیز؛ شب چهارم: 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 دیده‌ام.
kubectl delete namespace course-night-4