Задача:
Получить доступ к Kubernetes Dashboard по доменному имени, а не используя "kubectl proxy". Так же подключение должно осуществляться по HTTPS, но при этом вести на внутренний локальный адрес, доступный только через VPN, и не используя для этого никаких Ingress'ов.
Редактируем деплоймент "kubernetes-dashboard":
kubectl edit deployments.apps -n kubernetes-dashboard kubernetes-dashboard
Приводим аргументы к следующему виду:
spec:
containers:
- args:
- --namespace=kubernetes-dashboard
- --enable-insecure-login
- --insecure-port=8443
А так же для "livenessProbe" меняем "scheme: HTTPS" на "scheme: HTTP":
livenessProbe:
failureThreshold: 3
httpGet:
path: /
port: 8443
scheme: HTTP
initialDelaySeconds: 30
periodSeconds: 10
Теперь дашборд будет доступен по HTTP.
В консоли AWS переходим в "Certificate Manager", выбираем регион, в котором развернут EKS и делаем запрос на сертификат для нужного домена. После того, как сертификат валидирован, копируем его ARN.
Создаем манифест с Kubernetes сервисом.
kubernetes-dashboard-internal.yaml:
apiVersion: v1
kind: Service
metadata:
labels:
k8s-app: kubernetes-dashboard
annotations:
service.beta.kubernetes.io/aws-load-balancer-internal: 0.0.0.0/0
service.beta.kubernetes.io/aws-load-balancer-ssl-cert: 'arn:aws:acm:<AWS_REGION>:<ACCOUNT_ID>:certificate/<CERTIFICATE_ID>'
service.beta.kubernetes.io/aws-load-balancer-backend-protocol: http
service.beta.kubernetes.io/aws-load-balancer-ssl-ports: "*"
name: kubernetes-dashboard-internal
namespace: kubernetes-dashboard
spec:
ports:
- port: 443
protocol: TCP
targetPort: 8443
selector:
k8s-app: kubernetes-dashboard
sessionAffinity: None
type: LoadBalancer
Применим его:
kubectl apply -f kubernetes-dashboard-internal.yaml
Теперь остается только создать ALIAS запись в Route53 на внутреннее имя созданного LoadBalancer'а, посмотреть его имя можно так:
kubectl get svc -n kubernetes-dashboard kubernetes-dashboard-internal
Теперь из внутренних сетей AWS или используя VPN, по доменному имени будет доступен Kubernetes Dashboard.