شب ۰۴: نگهداری Traefik با Kubernetes¶
بخش ۰۴ از مجموعهٔ آموزش Traefik در ۳۰ شب؛ هر جلسه برای ۶۰ تا ۹۰ دقیقه مطالعه، تمرین عملی، بررسی نتیجه و تمرین رفع خرابی طراحی شده است. مثالها مطابق منبع با Traefik Proxy v3.7 نوشته شدهاند؛ برای محیط عملیاتی نسخهٔ اصلاحی آزمودهشده یا digest مشخصی را ثابت کنید. تمرینها را روی میزبان یا کلاستر آزمایشگاهی اجرا کنید.
فهرست کامل دورهٔ ترافیک در ۳۰ شب
هدفهای یادگیری¶
- مدیریت چرخهٔ عمر مستقل chart، کنترلر، CRDها، RBAC، مسیرها و secretها.
- طراحی دسترسپذیری و مالکیت مسیرها پیش از نصب.
- تمرین بررسی تفاوتها، ارتقا، بازگشت و اختلال گره.
فهرست روشهای پیشنهادی¶
- نسخهٔ Helm chart و ایمیج را ثابت و values بازبینیشده و manifestهای تولیدشده را بایگانی کنید.
- CRDهای لازم را آگاهانه و پیش از منابع وابسته نصب یا ارتقا دهید.
- در صورت امکان کشف را به namespace محدود کنید و ارجاع نامحدود میان namespaceها ندهید.
- حداقل دو نمونه در گرهها یا ناحیههای مختلف با منابع مشخص، PDB و خاتمهٔ آرام اجرا کنید.
- داشبورد و متریکها را محافظت و مدیریت را از مسیرهای عمومی جدا کنید.
- از Kubernetes Secrets، cert-manager یا PKI خارجی استفاده کنید؛ فایل JSON مشترک ACME برای نمونهها طراحی نکنید.
- مالکیت IngressClass و GatewayClass را بررسی کنید تا دو کنترلر مسیرهای یکسان را تصاحب نکنند.
تمرین عملی: بازبینی فایل values نزدیک به محیط عملیاتی¶
# values-maintenance.yaml
deployment:
replicas: 2
terminationGracePeriodSeconds: 60
podAnnotations:
prometheus.io/scrape: "true"
podDisruptionBudget:
enabled: true
minAvailable: 1
resources:
requests: {cpu: 100m, memory: 128Mi}
limits: {cpu: "1", memory: 512Mi}
affinity:
podAntiAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 100
podAffinityTerm:
topologyKey: kubernetes.io/hostname
labelSelector:
matchLabels: {app.kubernetes.io/name: traefik}
providers:
kubernetesCRD:
enabled: true
allowCrossNamespace: false
kubernetesIngress:
enabled: true
publishedService:
enabled: true
logs:
general: {level: INFO}
access: {enabled: true, format: json}
metrics:
prometheus: {}
helm repo add traefik https://traefik.github.io/charts
helm repo update
helm search repo traefik/traefik --versions | head
helm show crds traefik/traefik --version CHART_VERSION > reviewed-crds.yaml
helm template traefik traefik/traefik --version CHART_VERSION \
--namespace traefik -f values-maintenance.yaml > rendered.yaml
kubectl apply --server-side --dry-run=server -f rendered.yaml
helm upgrade --install traefik traefik/traefik --version CHART_VERSION \
-n traefik --create-namespace -f values-maintenance.yaml --wait --timeout 5m
kubectl -n traefik rollout status deploy/traefik
helm history traefik -n traefik
از وضعیت مطلوب و موجودی منابع پشتیبان بگیرید، نه podهای موقت:
helm get values traefik -n traefik -a > backup-values.yaml
helm get manifest traefik -n traefik > backup-manifest.yaml
kubectl get ingress,ingressroute,middleware,secret -A -o yaml > route-inventory.yaml
helm rollback traefik REVISION -n traefik --wait
پشتیبان secretها حساس است؛ از سامانهٔ پشتیبانگیری رمزگذاریشدهٔ کلاستر استفاده کنید. دستور سادهٔ بالا فقط برای موجودی مسیرهای غیرمحرمانه مناسب است و اگر Secretها را شامل شود باید فیلتر یا رمزگذاری شود.
نکتههای عیبیابی¶
- انتشار Helm موفق است اما CRها شکست میخورند: CRDها وجود ندارند یا ناسازگارند؛
kubectl api-resourcesو رویدادهای منابع را بررسی کنید. - فقط یک نمونه زمانبندی میشود: anti-affinity بیش از حد سختگیرانه است یا منابع کافی نیست.
- کنترلر اشتباه مسیرها را میگیرد:
ingressClassName، IngressClass، GatewayClass و گزینههای کنترلر را بررسی کنید. - drain قطعی ایجاد میکند: نمونهها روی یک گره یا ناحیهاند، PDB وجود ندارد یا نادرست است، یا متعادلکنندهٔ بار خارجی دیر به وضعیت سلامت جدید میرسد.
- بازگشت، CRDها را به نسخهٔ قبل نمیبرد: Helm تمام مسائل چرخهٔ عمر CRD را ایمن حل نمیکند؛ سازگاری CRD را صریحاً مدیریت کنید.
خودآزمایی¶
- چرا manifestهای تولیدشده را بایگانی میکنیم؟ پیشفرضها و قالبهای chart را ثبت میکنند که values بهتنهایی نشان نمیدهد.
- چرا بازگشت Helm ممکن است ناقص باشد؟ CRDها و وضعیت خارجی، چرخهٔ عمر و الزامات سازگاری مستقل دارند.
- پس از ارتقا چه وضعیتهایی باید بررسی شوند؟ روند انتشار Deployment، podها و readiness، سرویسها و endpointها، شرایط و رویدادهای مسیر و ترافیک آزمایشی.
- اثبات کنید: chart را تولید کنید، dry-run سمت سرور بگیرید و تمام اشیای سراسری کلاستر را مشخص کنید.