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

اگر روی یک کلاستر 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 اضافه کنید.

صدور خودکار گواهی 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
برای تصمیمگیری سریع، تفاوتهای اصلی این دو را کنار هم میگذاریم:
| ویژگی | Traefik | ingress-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 عمومی و تحویل سریع راهاندازی کنید، سرورهای ابری آریانت گزینهٔ مناسبی برای این کار هستند:




