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

شب ۱۱: نصب Traefik روی Docker Swarm

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

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

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

  • استقرار Traefik به‌عنوان سرویس Swarm با ارائه‌دهنده و محل برچسب درست.
  • انتشار پورت‌های ورودی و اتصال سرویس‌های مسیریابی‌شده به یک overlay.
  • اعتبارسنجی وضعیت مطلوب، taskها و ترافیک.

تمرین عملی

docker info --format '{{.Swarm.LocalNodeState}}'
# Disposable lab only, if inactive:
docker swarm init --advertise-addr MANAGER_IP
docker network create --driver=overlay --attachable traefik-public
# swarm.yml
services:
  traefik:
    image: traefik:v3.7
    command:
      - --providers.swarm=true
      - --providers.swarm.exposedbydefault=false
      - --providers.swarm.network=traefik-public
      - --entrypoints.web.address=:80
      - --api.dashboard=true
      - --ping=true
      - --accesslog=true
    ports:
      - target: 80
        published: 80
        protocol: tcp
        mode: ingress
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock:ro
    networks: [traefik-public]
    deploy:
      placement:
        constraints: [node.role == manager]
      labels:
        traefik.enable: "true"
        traefik.http.routers.dashboard.rule: "Host(`dashboard.swarm.example.test`) && (PathPrefix(`/api`) || PathPrefix(`/dashboard`))"
        traefik.http.routers.dashboard.service: api@internal
        traefik.http.services.traefik.loadbalancer.server.port: "8080"
  whoami:
    image: traefik/whoami:v1.11
    networks: [traefik-public]
    deploy:
      replicas: 2
      labels:
        traefik.enable: "true"
        traefik.http.routers.whoami.rule: "Host(`whoami.swarm.example.test`)"
        traefik.http.routers.whoami.entrypoints: web
        traefik.http.services.whoami.loadbalancer.server.port: "80"
networks:
  traefik-public:
    external: true
docker stack config -c swarm.yml > rendered-swarm.yml
docker stack deploy --prune -c swarm.yml edge
docker stack services edge
docker service ps edge_traefik --no-trunc
docker service logs --since 5m edge_traefik
curl -fsS --resolve whoami.swarm.example.test:80:127.0.0.1 \
  http://whoami.swarm.example.test/

فهرست اعتبارسنجی

  • task مربوط به Traefik روی manager موردنظر در وضعیت Running است.
  • تمام برچسب‌های مسیر در تنظیمات تولیدشده زیر deploy.labels قرار دارند.
  • هر دو سرویس در traefik-public مشترک‌اند.
  • پورت پشت‌صحنه صریح است، حتی اگر ایمیج فقط یک پورت expose کند.
  • Whoami از طریق تمام گره‌های ورودی موردنظر پاسخ 200 می‌دهد.
  • داشبورد بدون احراز هویت رها نشده است؛ پیش از استفادهٔ واقعی احراز هویت شب ۰۸ را از طریق فایل یا config اضافه کنید.

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

  • docker stack deploy کلیدهای پشتیبانی‌نشدهٔ Compose را نادیده می‌گیرد؛ همیشه docker stack config و هشدارها را بررسی کنید.
  • مسیریاب غایب است: deploy.labels، برچسب فعال‌سازی، انتخاب ارائه‌دهنده و دسترسی به API مدیر را بررسی کنید.
  • درخواست فقط به بعضی گره‌ها می‌رسد: routing mesh، فایروال، دسترس‌پذیری گره و حالت انتشار پورت را بررسی کنید.
  • خطای 502 پشت‌صحنه: عضویت overlay و پورت صریح سرویس را بررسی کنید.

خودآزمایی

  1. چرا به‌جای docker compose up از docker stack deploy استفاده می‌کنیم؟ سرویس‌های Swarm را می‌سازد و معنای deploy را اجرا می‌کند.
  2. کدام ارائه‌دهنده در نسخهٔ ۳ سرویس‌های Swarm را کشف می‌کند؟ swarm.
  3. چرا برچسب داشبورد پورت پشت‌صحنهٔ صوری دارد؟ کشف Swarm حتی برای مسیریابی به api@internal انتظار پورت سرویس دارد.
  4. اثبات کنید: گرهٔ task، حالت انتشار پورت، عضویت overlay و یک مسیر موفق را نشان دهید.