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

شب ۰۳: نگه‌داری Traefik با HashiCorp Nomad

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

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

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

  • نگه‌داری Traefik به‌عنوان بار کاری Nomad با کمترین دسترسی لازم برای کشف سرویس.
  • انتخاب کشف بومی Nomad یا Consul Catalog بر اساس سامانهٔ ثبت سرویسی که واقعاً اداره می‌کنید.
  • برنامه‌ریزی به‌روزرسانی تدریجی، جانمایی پورت ثابت، اطلاعات محرمانه و بازیابی.

فهرست روش‌های پیشنهادی

  • فقط مسیر کشف موردنظر، یعنی nomad بومی یا consulCatalog، را فعال کنید.
  • مقدار exposedByDefault: false را تنظیم و کشف را با تگ‌های سرویسی غیر از traefik.* محدود کنید.
  • اتصال API با اعتبارسنجی TLS و توکن ACL با دامنهٔ دسترسی محدود به کار ببرید.
  • watch: true را ترجیح دهید و رفتار throttle را برای تغییرات ناگهانی ثبت سرویس تنظیم کنید.
  • بررسی‌های سرویس را تعریف کنید و مشخص کنید endpointهای دارای هشدار باید ترافیک بگیرند یا نه.
  • فایل‌های job و تنظیمات ایستا و پویا را در Git نگه دارید؛ secretها را هنگام اجرا تولید و تزریق کنید.
  • نسخه‌های job در Nomad را ثبت و job revert را تمرین کنید.

تمرین عملی: ساخت سیاست کشف سرویس

# traefik.yml — static configuration
entryPoints:
  web: {address: ":80"}
  websecure: {address: ":443"}
providers:
  nomad:
    endpoint:
      address: "https://nomad.service.consul:4646"
      token: "RENDER_AT_RUNTIME"
      tls:
        ca: /secrets/nomad-ca.pem
    exposedByDefault: false
    watch: true
    throttleDuration: 2s
    constraints: "Tag(`edge.public=true`)"
api: {dashboard: true}
ping: {}

RENDER_AT_RUNTIME جای‌نگهدار است، نه مقدار واقعی استقرار. یک job قابل‌اتکا در Nomad توکن را در فایل راه‌اندازی مختص allocation می‌نویسد یا گزینهٔ معادل را از منبع تأییدشدهٔ secret تزریق می‌کند. مقدار واقعی را هرگز commit نکنید.

# Operational portions of traefik.nomad
job "traefik" {
  type = "system"
  group "edge" {
    network {
      mode = "host"
      port "http"  { static = 80 }
      port "https" { static = 443 }
    }
    update {
      max_parallel      = 1
      health_check      = "checks"
      min_healthy_time  = "15s"
      healthy_deadline  = "3m"
      auto_revert       = true
    }
    restart { attempts = 3; interval = "10m"; delay = "5s"; mode = "delay" }
    service {
      name = "traefik"
      port = "http"
      provider = "nomad"
      tags = ["edge.public=false"]
      check { type = "http"; path = "/ping"; interval = "10s"; timeout = "2s" }
    }
  }
}
nomad status
nomad node status
nomad job plan traefik.nomad
nomad job run traefik.nomad
nomad job status traefik
nomad alloc status ALLOCATION_ID
nomad alloc logs ALLOCATION_ID traefik
nomad job history traefik
nomad job revert -check-index CURRENT_JOB_MODIFY_INDEX traefik PREVIOUS_VERSION

برنامهٔ نگه‌داری: روزانه درخواست‌های آزمایشی و وضعیت allocationها و بررسی‌ها؛ هفتگی انقضای توکن و گواهی و صلاحیت clientها. پیش از تغییر، nomad job plan را اجرا کنید، شاخص تغییر و نسخهٔ job را ثبت کنید و معیارهای تأیید یا بازگشت را تعیین کنید.

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

  • ارائه‌دهنده خطای 403 می‌گیرد: سیاست ACL و namespace توکن را بررسی کنید، نه تنظیمات TLS را.
  • allocation در حالت pending است: پورت‌های ثابت اشغال‌اند یا هیچ گره‌ای شرایط محدودیت‌ها را ندارد.
  • سرویس وجود دارد اما مسیر نه: تگ‌های فعال‌سازی یا محدودیت لازم وجود ندارند یا قالبشان نادرست است.
  • پشت‌صحنه به رابط شبکهٔ اشتباه اشاره می‌کند: address_mode سرویس و حالت شبکهٔ task را بررسی کنید.
  • کشف سرویس ناپایدار است: بررسی‌های سلامت و تنظیمات watch/throttle ارائه‌دهنده را بازبینی کنید.

خودآزمایی

  1. چه زمانی Consul Catalog مناسب است؟ وقتی Consul مرجع ثبت سرویس است یا یکپارچگی Connect لازم است.
  2. چرا کشف را دو بار محدود می‌کنیم؟ فعال‌سازی صریح به‌علاوهٔ محدودیت مالکیت یا محیط، احتمال انتشار تصادفی را کاهش می‌دهد.
  3. هدف امن بازگشت در Nomad را چه چیزی مشخص می‌کند؟ نسخهٔ بازبینی‌شدهٔ job همراه با خروجی‌های تولیدشده و شواهد اعتبارسنجی.
  4. اثبات کنید: سیاست و توکن مورد استفادهٔ Traefik را بدون چاپ مقدار محرمانه مشخص کنید.