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

شب ۲۴: دسترس‌پذیری بالا و ارتقا در Kubernetes

بخش ۲۴ از مجموعهٔ آموزش Traefik در ۳۰ شب؛ هر جلسه برای ۶۰ تا ۹۰ دقیقه مطالعه، تمرین عملی، بررسی نتیجه و تمرین رفع خرابی طراحی شده است. مثال‌ها مطابق منبع با Traefik Proxy v3.7 نوشته شده‌اند؛ برای محیط عملیاتی نسخهٔ اصلاحی آزموده‌شده یا digest مشخصی را ثابت کنید. تمرین‌ها را روی میزبان یا کلاستر آزمایشگاهی اجرا کنید.

فهرست کامل دورهٔ ترافیک در ۳۰ شب

هدف‌های یادگیری

  • اجرای نمونه‌ها در دامنه‌های خرابی مختلف با اختلال کنترل‌شده.
  • تولید خروجی، dry-run، ارتقا، مشاهده و بازگشت انتشارهای Helm.
  • تمرین drain گره بدون ازدست‌دادن تمام ظرفیت ورودی.

تمرین عملی: values دسترس‌پذیری بالا و ارتقای کنترل‌شده

deployment:
  replicas: 3
  terminationGracePeriodSeconds: 60
  minReadySeconds: 10
podDisruptionBudget:
  enabled: true
  minAvailable: 2
resources:
  requests: {cpu: 200m, memory: 256Mi}
  limits: {cpu: "1", memory: 512Mi}
affinity:
  podAntiAffinity:
    preferredDuringSchedulingIgnoredDuringExecution:
      - weight: 100
        podAffinityTerm:
          topologyKey: kubernetes.io/hostname
          labelSelector:
            matchLabels: {app.kubernetes.io/name: traefik}
topologySpreadConstraints:
  - maxSkew: 1
    topologyKey: kubernetes.io/hostname
    whenUnsatisfiable: ScheduleAnyway
    labelSelector:
      matchLabels: {app.kubernetes.io/name: traefik}

ساختار کلیدهای chart ممکن است تغییر کند. این فایل را با helm show values نسخهٔ ثابت‌شده مقایسه و پیش از اعمال، Deployment و PDB تولیدشده را تأیید کنید.

helm get values traefik -n traefik -a > before-values.yaml
helm get manifest traefik -n traefik > before-manifest.yaml
helm template traefik traefik/traefik --version NEW_CHART_VERSION \
  -n traefik -f values-ha.yaml > candidate.yaml
kubectl apply --dry-run=server -f candidate.yaml
diff -u before-manifest.yaml candidate.yaml || true
helm upgrade traefik traefik/traefik --version NEW_CHART_VERSION \
  -n traefik -f values-ha.yaml --wait --timeout 10m --atomic
kubectl -n traefik rollout status deploy/traefik
kubectl -n traefik get pod -o wide
helm history traefik -n traefik

گزینهٔ --atomic ارتقای ناموفق Helm را برمی‌گرداند، اما جای اعتبارسنجی را نمی‌گیرد و تمام تغییرات CRD یا وضعیت خارجی را حل نمی‌کند.

فقط worker آزمایشگاهی یا موقت را، پس از بررسی ظرفیت و PDBها، drain کنید:

kubectl get nodes
kubectl get pdb -A
kubectl cordon LAB_NODE
kubectl drain LAB_NODE --ignore-daemonsets --delete-emptydir-data --timeout=10m
kubectl -n traefik get pod -o wide --watch
kubectl uncordon LAB_NODE

بازگشت دستی انتشار:

helm rollback traefik PREVIOUS_REVISION -n traefik --wait --timeout 10m
kubectl -n traefik rollout status deploy/traefik

فهرست بهره‌برداری

  • یادداشت‌های مهاجرت Traefik و chart، شامل تغییرات لازم CRD و RBAC، را مرور کنید.
  • ظرفیت تحمل یک pod خارج از دسترس و خرابی یک گره را تأیید کنید.
  • readiness را معنادار نگه دارید و مهلت خاموشی را بیشتر از زمان لازم برای تخلیهٔ اتصال قرار دهید.
  • انتشار Kubernetes، مسیرهای آزمایشی خارجی، نرخ خطا و تأخیر را پایش کنید.
  • پس از همگرایی کنترلر، conditions مربوط به IngressRoute و Gateway را اعتبارسنجی کنید.

نکته‌های عیب‌یابی

  • drain مسدود است: PDB به‌درستی جلوی اخراج ناامن را می‌گیرد یا جایگزین ظرفیت کافی ندارد.
  • انتشار متوقف می‌شود: شکست readiness، کمبود منابع یا خطای دریافت ایمیج، RBAC یا تنظیمات را بررسی کنید.
  • بازگشت Helm موفق است اما مسیرها خراب‌اند: CRD یا وضعیت خارجی گواهی و متعادل‌کنندهٔ بار ناسازگار است.
  • تمام نمونه‌ها روی یک گره‌اند: برچسب‌های selector یا کلیدهای توپولوژی با podهای تولیدشده منطبق نیستند یا محدودیت‌ها صرفاً ترجیحی‌اند.

خودآزمایی

  1. PDB در برابر چه چیزی محافظت می‌کند؟ اختلال‌های داوطلبانه؛ کنترلر نمونه‌ها نیست و در برابر ازکارافتادن گره محافظت نمی‌کند.
  2. چرا خروجی تولیدشدهٔ chart را بررسی می‌کنیم؟ کلیدها و پیش‌فرض‌های values و رفتار قالب در نسخه‌های chart تغییر می‌کنند.
  3. چرا از بیرون کلاستر آزمون می‌کنیم؟ آمادگی pod، DNS عمومی، متعادل‌کنندهٔ بار، TLS و مسیرها را پوشش نمی‌دهد.
  4. اثبات کنید: گره را drain کنید، ترافیک آزمایشی را حفظ کنید، ارتقا دهید و به revision ثبت‌شده برگردید.