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

شب ۰۲: نگه‌داری 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 را می‌نویسند.

خودآزمایی

  1. برچسب‌های Traefik در stack کجا قرار می‌گیرند؟ در deploy.labels.
  2. چرا start-first ممکن است با پورت‌های حالت host تعارض داشته باشد؟ دو task روی یک گره نمی‌توانند به پورت منتشرشدهٔ یکسان متصل شوند.
  3. با جایگزینی task چه چیزهایی باقی می‌ماند؟ وضعیت مطلوب Swarm، تنظیمات و secretها و ذخیره‌ساز خارجی؛ نه وضعیت فایل‌سیستم کانتینر.
  4. اثبات کنید: یک گرهٔ آزمایشگاهی واجد شرایط را drain کنید و محل اجرای task جایگزین را نشان دهید.