شب ۰۲: نگهداری Traefik با Docker Swarm¶
بخش ۰۲ از مجموعهٔ آموزش Traefik در ۳۰ شب؛ هر جلسه برای ۶۰ تا ۹۰ دقیقه مطالعه، تمرین عملی، بررسی نتیجه و تمرین رفع خرابی طراحی شده است. مثالها مطابق منبع با Traefik Proxy v3.7 نوشته شدهاند؛ برای محیط عملیاتی نسخهٔ اصلاحی آزمودهشده یا digest مشخصی را ثابت کنید. تمرینها را روی میزبان یا کلاستر آزمایشگاهی اجرا کنید.
فهرست کامل دورهٔ ترافیک در ۳۰ شب
هدفهای یادگیری¶
- تدوین سیاست نگهداری Swarm بر پایهٔ دسترسی به manager، جانمایی، شبکهها و بهروزرسانی تدریجی.
- درک تفاوت راهبرد گواهی در طرحهای تکنمونهای و چندنمونهای Traefik.
- تمرین بازرسی سرویس، نگهداری گره و بازگشت به نسخهٔ قبلی.
فهرست روشهای پیشنهادی¶
- برای کشف سرویسهای Swarm از
providers.swarmاستفاده کنید، نهproviders.docker. - برچسبهای مسیر را زیر
deploy.labelsبگذارید و پورت هر سرویس پشتصحنه را صریحاً تعیین کنید. - taskهای ناظر API را فقط جایی اجرا کنید که دسترسی امن به API یک manager دارند.
- از شبکهٔ overlay رمزگذاریشده و قابلاتصال و محدودیتهای ارائهدهنده استفاده کنید.
- گزینههای
update_config،rollback_config، بررسی سلامت و خاتمهٔ آرام را تنظیم کنید. - برای دسترسپذیری بالا، صدور و توزیع گواهی را به سامانهای خارجی بسپارید؛ فایل JSON محلی ACME را میان نمونهها مشترک نکنید.
- از بستهٔ stack، منابع secret/config و quorum مدیران پشتیبان بگیرید؛ پشتیبان کانتینرها کافی نیست.
تمرین عملی: بازرسی و بهروزرسانی ایمن¶
# stack-maintenance.yml
services:
traefik:
image: traefik:v3.7
command:
- --providers.swarm=true
- --providers.swarm.exposedbydefault=false
- --providers.swarm.network=traefik-public
- --entrypoints.web.address=:80
- --entrypoints.websecure.address=:443
- --ping=true
ports:
- target: 80
published: 80
mode: host
- target: 443
published: 443
mode: host
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
networks: [traefik-public]
deploy:
placement:
constraints: [node.role == manager]
update_config:
parallelism: 1
order: start-first
failure_action: rollback
monitor: 30s
rollback_config: {parallelism: 1, order: stop-first}
restart_policy: {condition: on-failure, delay: 5s}
networks:
traefik-public:
external: true
docker info --format '{{.Swarm.LocalNodeState}} {{.Swarm.ControlAvailable}}'
docker node ls
docker network create --driver overlay --attachable --opt encrypted traefik-public
docker stack config -c stack-maintenance.yml > rendered-stack.yml
docker stack deploy -c stack-maintenance.yml edge
docker service ps edge_traefik --no-trunc
docker service inspect edge_traefik --pretty
docker service logs --since 10m edge_traefik
یک عملیات نگهداری کنترلشده را روی گرهٔ آزمایشگاهی تمرین کنید:
docker node update --availability drain NODE_NAME
docker service ps edge_traefik
docker node update --availability active NODE_NAME
# Update and watch convergence; use an exact tested image in real operations.
docker service update --image traefik:v3.7 edge_traefik
docker service inspect edge_traefik --format '{{.UpdateStatus.State}}'
docker service rollback edge_traefik
روش انتشار پورت را آگاهانه انتخاب کنید. mode: host واسطهگری routing mesh را حذف میکند، اما به اجرای Traefik روی تمام گرههای ورودی یا متعادلکنندهٔ بار بالادستی نیاز دارد که فقط گرههای واجد شرایط را هدف بگیرد. حالت ingress از طریق routing mesh روی تمام گرهها ترافیک میپذیرد. مشخص کنید کدام سامانه مسئول حفظ IP کلاینت و بررسی سلامت است.
نکتههای عیبیابی¶
- مسیریابها دیده نمیشوند: احتمالاً برچسبها زیر
labelsسطح سرویس قرار دارند، نهdeploy.labels. - خطای 502 پس از کشف سرویس: برچسب پورت پشتصحنه یا شبکهٔ overlay مشترک وجود ندارد.
- task در حالت pending میماند: هیچ manager با محدودیتهای جانمایی، منابع و پورت سازگار نیست.
- بهروزرسانی start-first با پورت میزبان شکست میخورد: task قدیمی و جدید نمیتوانند روی یک گره به یک پورت متصل شوند؛ چند گرهٔ واجد شرایط یا
stop-firstبه کار ببرید. - خرابی ACME یا گواهیهای ناسازگار: چند task همزمان وضعیت محلی یا مشترک ACME را مینویسند.
خودآزمایی¶
- برچسبهای Traefik در stack کجا قرار میگیرند؟ در
deploy.labels. - چرا
start-firstممکن است با پورتهای حالت host تعارض داشته باشد؟ دو task روی یک گره نمیتوانند به پورت منتشرشدهٔ یکسان متصل شوند. - با جایگزینی task چه چیزهایی باقی میماند؟ وضعیت مطلوب Swarm، تنظیمات و secretها و ذخیرهساز خارجی؛ نه وضعیت فایلسیستم کانتینر.
- اثبات کنید: یک گرهٔ آزمایشگاهی واجد شرایط را drain کنید و محل اجرای task جایگزین را نشان دهید.