بلاگ/راه‌اندازی Traefik به‌عنوان Ingress Controller در کلاستر Kubernetes خودمیزبان با HTTPS خودکار
به‌روز شده

راه‌اندازی Traefik به‌عنوان Ingress Controller در کلاستر Kubernetes خودمیزبان با HTTPS خودکار

1405/06/303 بازدید
راه‌اندازی Traefik به‌عنوان Ingress Controller در کلاستر Kubernetes خودمیزبان با HTTPS خودکار

راه‌اندازی Traefik به‌عنوان Ingress Controller در کلاستر Kubernetes خودمیزبان با HTTPS خودکار

داشبورد Traefik و ترافیک ورودی به کلاستر Kubernetes

اگر روی یک کلاستر Kubernetes خودمیزبان (روی VPS یا سرور اختصاصی) از ingress-nginx استفاده می‌کنید، احتمالاً شنیده‌اید که این پروژه در حال بازنشستگی است و نگهداری فعال آن به‌مرور کاهش پیدا می‌کند. این یعنی زمان خوبی است که یک جایگزین پایدارتر را امتحان کنید. Traefik یکی از گزینه‌های اصلی است: یک Ingress Controller ابری با پیکربندی ساده و پشتیبانی داخلی از صدور خودکار گواهی SSL.

در این مقاله مراحل نصب Traefik روی یک کلاستر Kubernetes خودمیزبان، تنظیم مسیریابی ترافیک به سرویس‌ها، و فعال‌سازی HTTPS خودکار با Let's Encrypt را قدم‌به‌قدم بررسی می‌کنیم.

چرا الان باید سراغ Traefik بروید

ingress-nginx سال‌ها گزینهٔ پیش‌فرض بیشتر پروژه‌های Kubernetes بوده، اما تیم نگهداری آن اعلام کرده که این پروژه به سمت حالت نگهداری محدود می‌رود و توسعهٔ فعال روی آن متوقف می‌شود. برای کلاستری که در تولید اجرا می‌شود، این ریسک قابل‌قبولی نیست.

Traefik چند مزیت مشخص دارد که برای کلاستر خودمیزبان اهمیت بیشتری پیدا می‌کند:

  • صدور و تمدید گواهی SSL از Let's Encrypt به‌صورت داخلی، بدون نیاز به نصب جداگانهٔ cert-manager.
  • داشبورد وب برای مشاهدهٔ روت‌ها و سرویس‌ها بدون نیاز به دستورات kubectl مکرر.
  • تشخیص خودکار سرویس‌های جدید از طریق CRDهایی مثل IngressRoute، در کنار پشتیبانی کامل از منبع Ingress استاندارد.
  • توسعهٔ فعال و جایگاه مشخص در اکوسیستم CNCF.

پیش‌نیازها

قبل از شروع، این موارد باید آماده باشد:

  • یک کلاستر Kubernetes در حال اجرا (نصب‌شده با kubeadm، k3s یا مشابه) روی VPS یا سرور اختصاصی.
  • دسترسی kubectl با مجوز کافی برای ساخت namespace و CRD.
  • Helm نسخه ۳ روی ماشینی که از آن به کلاستر متصل می‌شوید.
  • یک یا چند دامنه که رکورد DNS آن‌ها (A یا AAAA) به IP عمومی نود یا لودبالانسر کلاستر اشاره کند.
  • باز بودن پورت‌های ۸۰ و ۴۴۳ روی فایروال سرور، چون Let's Encrypt برای اعتبارسنجی چالش HTTP به پورت ۸۰ نیاز دارد.

روی کلاستر خودمیزبان معمولاً لودبالانسر ابری وجود ندارد، پس یا از MetalLB برای اختصاص IP به سرویس Traefik استفاده می‌کنید یا آن را با نوع NodePort و مستقیماً روی IP نود منتشر می‌کنید.

نصب Traefik با Helm

ابتدا ریپازیتوری Helm رسمی Traefik را اضافه کنید:

helm repo add traefik https://traefik.github.io/charts
helm repo update

یک فایل values.yaml بسازید تا endpointهای وب و امن، و تنظیمات پایه را مشخص کنید:

ports:
  web:
    port: 8000
    redirectTo:
      port: websecure
  websecure:
    port: 8443

service:
  type: LoadBalancer   # روی VPS/سرور اختصاصی بدون MetalLB از NodePort استفاده کنید

ingressClass:
  enabled: true
  isDefaultClass: true

نصب را با Helm انجام دهید:

kubectl create namespace traefik
helm install traefik traefik/traefik -n traefik -f values.yaml

بعد از چند ثانیه، وضعیت Pod و Service را بررسی کنید:

kubectl get pods -n traefik
kubectl get svc -n traefik

اگر از NodePort استفاده کرده‌اید، پورت‌های نگاشت‌شده را از خروجی kubectl get svc بردارید و ترافیک ۸۰/۴۴۳ سرور را با iptables یا ابزار فایروال به همان پورت‌ها هدایت کنید.

مسیریابی ترافیک با IngressRoute

Traefik یک CRD به‌نام IngressRoute معرفی می‌کند که کنترل بیشتری نسبت به Ingress استاندارد می‌دهد. برای یک سرویس نمونه:

apiVersion: traefik.io/v1alpha1
kind: IngressRoute
metadata:
  name: app-route
  namespace: default
spec:
  entryPoints:
    - websecure
  routes:
    - match: Host(`app.example.com`)
      kind: Rule
      services:
        - name: app-service
          port: 80

اگر ترجیح می‌دهید همان منبع Ingress استاندارد Kubernetes را نگه دارید (مثلاً برای سازگاری با ابزارهای دیگر)، Traefik آن را هم پشتیبانی می‌کند؛ کافی است ingressClassName: traefik را در تعریف Ingress اضافه کنید.

نمودار مسیریابی ترافیک از Traefik به سرویس‌های داخل کلاستر Kubernetes با IngressRoute

صدور خودکار گواهی SSL با Let's Encrypt

بخش اصلی مهاجرت از ingress-nginx همین‌جاست. برای فعال‌سازی، این تنظیمات را به values.yaml اضافه کنید:

certificatesResolvers:
  letsencrypt:
    acme:
      email: admin@example.com
      storage: /data/acme.json
      httpChallenge:
        entryPoint: web

persistence:
  enabled: true
  path: /data

سپس در IngressRoute مسیر TLS را با اشاره به همین resolver تعریف کنید:

spec:
  entryPoints:
    - websecure
  routes:
    - match: Host(`app.example.com`)
      kind: Rule
      services:
        - name: app-service
          port: 80
  tls:
    certResolver: letsencrypt

با اولین درخواست HTTPS به این دامنه، Traefik خودش چالش HTTP-01 را با Let's Encrypt رد و بدل می‌کند و گواهی را صادر و ذخیره می‌کند. تمدید هم به همین شکل خودکار انجام می‌شود، بدون نیاز به کرون‌جاب یا اسکریپت جداگانه.

اگر دامنه پشت CDN یا فایروالی است که پورت ۸۰ را می‌بندد، به‌جای httpChallenge از dnsChallenge با provider دامنهٔ خودتان استفاده کنید تا اعتبارسنجی از طریق رکورد TXT انجام شود؛ همین روش اعتبارسنجی DNS در ساخت گواهی SSL وایلدکارد با Certbot هم به‌کار می‌رود.

مقایسهٔ Traefik و ingress-nginx

برای تصمیم‌گیری سریع، تفاوت‌های اصلی این دو را کنار هم می‌گذاریم:

ویژگیTraefikingress-nginx
صدور خودکار SSLداخلی، بدون ابزار جانبینیاز به نصب جداگانهٔ cert-manager
روش پیکربندیCRD اختصاصی (IngressRoute) + Ingress استانداردعمدتاً از طریق annotation روی Ingress
داشبورد مدیریتیدارد، به‌صورت پیش‌فرضندارد
وضعیت نگهداری پروژهتوسعهٔ فعالدر مسیر بازنشستگی
منحنی یادگیریکمی بیشتر به‌خاطر CRD جدیدآشناتر برای کسانی که با annotation کار کرده‌اند

اگر کلاستر شما از قبل روی ingress-nginx تنظیم شده و annotationهای زیادی دارد، مهاجرت را می‌توانید تدریجی انجام دهید: Traefik را در کنار ingress-nginx نصب کنید، سرویس‌ها را یکی‌یکی به IngressClass جدید منتقل کنید، و در پایان ingress-nginx را حذف کنید.

نکات نگهداری و عیب‌یابی رایج

  • اگر گواهی صادر نمی‌شود، اول لاگ Pod را بررسی کنید: kubectl logs -n traefik deploy/traefik. بیشتر مواقع دلیل، بسته بودن پورت ۸۰ روی فایروال سرور است.
  • فایل acme.json باید مجوز دسترسی 600 داشته باشد؛ در غیر این صورت Traefik از نوشتن روی آن خودداری می‌کند و گواهی صادر نمی‌شود.
  • برای دیدن داشبورد، آن را عمومی منتشر نکنید. از kubectl port-forward برای دسترسی موقت و محلی استفاده کنید:
kubectl port-forward -n traefik deploy/traefik 9000:9000
  • اگر بعد از نصب هنوز ترافیک به سرویس نمی‌رسد، مطمئن شوید IngressClass پیش‌فرض کلاستر روی Traefik تنظیم شده یا آن را به‌صراحت در منبع Ingress مشخص کرده‌اید.
  • برای مانیتورینگ دقیق‌تر ترافیک و وضعیت Podها فراتر از داشبورد پیش‌فرض Traefik، می‌توانید Grafana و Prometheus را در همان کلاستر Kubernetes نصب کنید.

جمع‌بندی

Traefik برای کلاستر Kubernetes خودمیزبان یک جایگزین عملی برای ingress-nginx است: نصب با Helm ساده است، صدور و تمدید گواهی SSL از Let's Encrypt داخلی و خودکار انجام می‌شود، و داشبورد داخلی مدیریت روزمره را ساده‌تر می‌کند.

اگر برای اجرای این کلاستر به منابع بیشتری نیاز دارید یا می‌خواهید نودهای جدید با IP عمومی و تحویل سریع راه‌اندازی کنید، سرورهای ابری آریانت گزینهٔ مناسبی برای این کار هستند:

مشاهدهٔ سرورهای ابری آریانت