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

شب ۱۶: نصب Traefik به‌عنوان job در Nomad

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

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

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

  • اجرای Traefik به‌صورت system job روی clientهای ورودی واجد شرایط.
  • تولید تنظیمات محافظت‌شدهٔ کشف هنگام اجرای allocation.
  • اعتبارسنجی allocationها، بررسی سرویس، کشف و ترافیک.

تمرین عملی

job آزمایشگاه فرض می‌کند Nomad Variables فعال است و nomad/jobs/traefik دارای آیتم provider_token است. سیاست ACL آن در شب ۱۸ ساخته می‌شود.

فایل راه‌اندازی مختص allocation که job تولید می‌کند این ساختار YAML را دارد؛ جای‌نگهدار توکن فقط باید توسط قالب secret جایگزین شود:

entryPoints:
  web: {address: ":80"}
  websecure: {address: ":443"}
  traefik: {address: ":8080"}
providers:
  nomad:
    endpoint:
      address: http://127.0.0.1:4646
      token: RENDER_AT_RUNTIME
    exposedByDefault: false
    watch: true
    constraints: "Tag(`edge.public=true`)"
ping: {entryPoint: traefik}
# traefik.nomad
job "traefik" {
  datacenters = ["dc1"]
  type = "system"
  constraint { attribute = "${node.class}"; value = "ingress" }

  group "edge" {
    network {
      mode = "host"
      port "web"       { static = 80 }
      port "websecure" { static = 443 }
      port "admin"     { static = 8080 }
    }

    service {
      name = "traefik"
      port = "admin"
      provider = "nomad"
      tags = ["edge.public=false"]
      check { type = "http"; path = "/ping"; interval = "10s"; timeout = "2s" }
    }

    task "traefik" {
      driver = "docker"
      config {
        image        = "traefik:v3.7"
        network_mode = "host"
        args         = ["--configFile=/secrets/traefik.yml"]
      }
      template {
        destination = "secrets/traefik.yml"
        perms        = "0600"
        change_mode  = "restart"
        data = <<-EOH
entryPoints:
  web: {address: ":80"}
  websecure: {address: ":443"}
  traefik: {address: ":8080"}
providers:
  nomad:
    endpoint:
      address: "http://127.0.0.1:4646"
      token: "{{ with nomadVar "nomad/jobs/traefik" }}{{ .provider_token }}{{ end }}"
    exposedByDefault: false
    watch: true
    constraints: "Tag(`edge.public=true`)"
api: {dashboard: true}
ping: {entryPoint: traefik}
accessLog: {format: json}
EOH
      }
      resources { cpu = 300; memory = 256 }
    }
  }
}

مثال از HTTP روی loopback برای ارتباط با agent محلی Nomad استفاده می‌کند. در استقرار امن‌تر، TLS عامل را فعال کنید، در صورت نیاز CA و اعتبارنامهٔ کلاینت را mount کنید، از https://127.0.0.1:4646 استفاده کنید و به‌جای insecureSkipVerify، طراحی نام و آدرس گواهی را بررسی کنید. دسترسی TCP/8080 را با فایروال به شبکهٔ مدیریت و بررسی سلامت متعادل‌کنندهٔ بار محدود کنید؛ ثبت آن در Nomad دسترسی عمومی نامحدود را توجیه نمی‌کند.

nomad job validate traefik.nomad
nomad job plan traefik.nomad
nomad job run traefik.nomad
nomad job status traefik
nomad alloc logs -stderr ALLOC_ID traefik
nomad service info traefik
curl -fsS --resolve whoami.nomad.example.test:80:INGRESS_IP \
  http://whoami.nomad.example.test/

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

  • هر client واجد شرایط با node.class=ingress یک allocation دریافت می‌کند.
  • پیش از زمان‌بندی، پورت‌های ثابت آزادند.
  • فایل توکن تولیدشده مجوز 0600 دارد و در Git، لاگ یا خروجی نیست.
  • بررسی /ping موفق است؛ Traefik خودش را با مسیر پیش‌فرض منتشر نمی‌کند.
  • تگ‌های سرویس Whoami یک مسیر و endpointهای سالم می‌سازند.
  • متعادل‌کنندهٔ بار خارجی فقط clientهای ورودی سالم و واجد شرایط را هدف می‌گیرد.

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

  • allocation وجود ندارد: محدودیت کلاس گره با هیچ گرهی منطبق نیست؛ metadata و کلاس گره‌ها را بررسی کنید.
  • خطای address already in use: فرایند یا allocation دیگری پورت ثابت ۸۰ یا ۴۴۳ را گرفته است.
  • مجوز قالب رد می‌شود: هویت بار کاری قابلیت خواندن Nomad Variable را ندارد.
  • ارائه‌دهنده پاسخ 403 می‌گیرد: سیاست توکن کشف ناکافی یا منقضی است؛ آن را با توکن مدیریتی جایگزین نکنید.

خودآزمایی

  1. چرا اینجا system job به کار می‌بریم؟ روی هر client واجد شرایط یک task ورودی قرار می‌دهد.
  2. چرا به Traefik تگ edge.public=false می‌دهیم؟ برای جلوگیری از کشف خود و حلقه‌های قاعدهٔ پیش‌فرض.
  3. چه چیزی در این قالب restart ایجاد می‌کند؟ تغییر secret یا تنظیمات تولیدشده، چون change_mode = "restart" است.
  4. اثبات کنید: یک allocation برای هر گرهٔ واجد شرایط و مسیر کشف‌شده از job مربوط به whoami نشان دهید.