پرش به مطلب اصلی

Ingress Controller

یکی از امکانات کلاسترهای ارائه‌شده توسط هم‌روش، ارائه‌ی Ingress Controller Traefik به‌صورت پیش‌فرض است.

در کلاستر توانایی expose کردن سرویس‌ها به وسیله‌ی آی‌پی (سرویس از نوع LoadBalancer) و دامنه (ingress) وجود دارد.

اکسپوز کردن سرویس با دامنه

برای expose کردن سرویس‌ها توسط دامنه، از traefik استفاده می‌شود. کافی‌ست برای سرویس مورد نظر یک ingress ساخته شود و رکورد dns آن از نوع CNAME به دامنه‌ای به شکل زیر تنظیم شود:

c<CLUSTER_NUMBER>.<CLUSTER_NAME>.hamserver.ir
e.g. c11.hamravesh.hamserver.ir

Middlewares

برای اضافه کردن customization و کانفیگ کردن دامنه‌ها، از یک ریسوس به نام middleware می‌توان استفاده کرد. نحوه‌ی استفاده از آن به این صورت است که پس از ساخت middleware مورد نظر، یک annotation مانند یکی از نمونه‌های زیر می‌بایست به ingress مورد نظر اضافه شود.

traefik.ingress.kubernetes.io/router.middlewares: <namespace>-<middleware>@kubernetescrd

همچنین در صورت نیاز می‌توان چند middleware را chain نمود و در یک ingress استفاده کرد.

traefik.ingress.kubernetes.io/router.middlewares: <namespace1>-<middleware1>@kubernetescrd,<namespace2>-<middleware2>@kubernetescrd,<namespace3>-<middleware3>@kubernetescrd

TODO

در ادامه چند مورد از middleware های پرکاربرد آورده شده است.

ریدایرکت کردن http به https

برای این مورد نیاز است که یک middleware به صورت زیر ساخته شود.

apiVersion: traefik.containo.us/v1alpha1
kind: Middleware
metadata:
name: sample-redirect
namespace: sample
spec:
redirectScheme:
permanent: true
scheme: https

اطلاعات بیشتر در این لینک موجود است.

اضافه کردن Basic Auth

برای اضافه کردن قابلیت basic auth نیاز است که در ابتدا یک secret به صورت زیر ساخته شود.

apiVersion: v1
kind: Secret
metadata:
name: sample-secret
namespace: sample
type: kubernetes.io/basic-auth
data:
username: dXNlcg== # CHANGEME -> username: base64encode(“user”)
password: cGFzc3dvcmQ= # CHANGEME -> password: base64encode(“password”)

که در این secret فیلد‌های username و password می‌بایست مشخصات basic auth مورد نظر باشند. سپس نیاز است یک middleware به صورت زیر ساخته شود.

apiVersion: traefik.io/v1alpha1
kind: Middleware
metadata:
name: sample-auth
namespace: sample
spec:
basicAuth:
secret: sample-secret

اطلاعات بیشتر در مستند سرویس Traefik موجود است.

Debug

برای دیباگ کردن و دیدن ingress های ساخته شده، می‌توان از داشبورد traefik استفاده کرد. نحوه‌ی استفاده از این دشبورد به صورت زیر است.

$ kubectl port-forward -n platform-system svc/traefik-dashboard 9000:9000

سپس با باز کردن آدرس http://localhost:9000 در مرورگر می‌توان این داشبورد را مشاهده کرد.

صدور خودکار سرتیفیکیت tls برای دامنه‌ها

در کلاستر به صورت پیش‌فرض cert-manager دیپلوی شده و می‌توان با استفاده از آن سرتیفیکیت برای سرویس‌ها صادر کرد. به صورت دیفالت از letsencrypt برای صدور certificate ها استفاده می‌شود. برای استفاده از این قابلیت، نیاز هست annotation زیر بر روی ingress مورد نظر زده شود.

cert-manager.io/cluster-issuer: acme-prod

در صورتی که نیاز باشد از CA دیگری برای صدور سرتیفیکیت‌ها استفاده شود، امکان ساخت یک issuer یا cluster issuer جدید وجود دارد.

صدور wildcard certificate

برای این کار نیاز است که یک issuer جدا در نیم‌اسپیس مورد نظر ساخته شود.

apiVersion: cert-manager.io/v1
kind: Issuer
metadata:
name: letsencrypt-prod
namespace: sample
spec:
acme:
privateKeySecretRef:
name: letsencrypt-prod
server: https://acme-v02.api.letsencrypt.org/directory
solvers:
- http01:
ingress:
class: traefik
- dns01:
acmeDNS:
accountSecretRef:
key: acme-dns
name: acme-dns
host: https://auth.acme-dns.io

سپس با استفاده از دستور زیر، credential مربوط به دامنه‌ی مورد نظر گرفته شود.

curl -s -X POST https://auth.acme-dns.io/register | python -m json.tool

سپس credential دامنه یا دامنه‌های مورد نظر به صورت زیر در فایلی به نام acme-dns ذخیره شوند.

{
"sample.com": {
"allowfrom": [],
"fulldomain": "3c45f70f-a8b1-4158-af33-7e6e39e810d1.auth.acme-dns.io",
"password": "rcC6gsH6qvmftIQH_szGJu8owAqB5xRmLiJlHbKn",
"subdomain": "3c45f70f-a8b1-4158-af33-7e6e39e810d1",
"username": "f199691d-27c4-4c77-8b7e-6a537e781516"
}
}

سپس یک secret از این فایل در همان نیم‌اسپیس ساخته شود.

$ kubectl create secret generic acme-dns --from-file PATH_TO_THE_ACME_DNS_FILE -n sample

همچنین نیاز هست رکورد CNAME زیر برای دامنه یا دامنه‌ها تنظیم شود.

_acme-challenge.sample.com -> 3c45f70f-a8b1-4158-af33-7e6e39e810d1.auth.acme-dns.io

در نهایت نیاز است که یک ریسورس از نوع gateway ساخته شود.

apiVersion: gateway.networking.k8s.io/v1alpha2
kind: Gateway
metadata:
annotations:
cert-manager.io/issuer: letsencrypt-prod
name: sample-gateway
namespace: sample
spec:
gatewayClassName: traefik
listeners:
- allowedRoutes:
namespaces:
from: All
name: web
port: 8000
protocol: HTTP
- allowedRoutes:
kinds:
- group: gateway.networking.k8s.io
kind: HTTPRoute
namespaces:
from: All
hostname: "*.sample.com"
name: wildcard
port: 8443
protocol: HTTPS
tls:
certificateRefs:
- group: core
kind: Secret
name: darkube-app-tls
mode: Terminate

سپس با ساختن ingress می‌توان از سرتیفیکیت وایلدکارد استفاده کرد.

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: app
namespace: sample
spec:
rules:
- host: app.sample.com
http:
paths:
- backend:
service:
name: app
port:
name: main
path: /
pathType: Prefix

اطلاعات بیشتر در مستند سرویس Gateway API موجود است.

این صفحه مفید بود؟

با ثبت بازخوردتان در بهبود کیفیت مستندات مشارکت داشته باشید.