یکی از امکانات کلاسترهای ارائهشده توسط همروش، ارائهی 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 موجود است.