Я пытаюсь настроить nginx ingress для доступа к нескольким службам, например:
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: ingress-monit
spec:
rules:
- host: grafana.localhost
http:
paths:
- path: /
backend:
serviceName: prometheus-grafana
servicePort: 80
- host: kubernetes-dashboard.localhost
http:
paths:
- path: /
backend:
serviceName: kubernetes-dashboard
servicePort: 80
У меня есть доступ к сервису grafana без проблем, моя проблема с kubernetes-dashboard. Я уже настроил kubernetes-dashboard, чтобы разрешить HTTP-трафик с этой конфигурацией
kind: Service
apiVersion: v1
metadata:
labels:
k8s-app: kubernetes-dashboard
name: kubernetes-dashboard
namespace: monit
spec:
ports:
- port: 80
targetPort: 9090
selector:
k8s-app: kubernetes-dashboard
---
kind: Deployment
apiVersion: apps/v1
metadata:
labels:
k8s-app: kubernetes-dashboard
name: kubernetes-dashboard
namespace: monit
spec:
replicas: 1
revisionHistoryLimit: 10
selector:
matchLabels:
k8s-app: kubernetes-dashboard
template:
metadata:
labels:
k8s-app: kubernetes-dashboard
spec:
containers:
- name: kubernetes-dashboard
image: kubernetesui/dashboard:v2.0.0-beta8
imagePullPolicy: Always
ports:
- containerPort: 9090
protocol: TCP
args:
- --namespace=monit
- --insecure-bind-address=0.0.0.0
- --insecure-port=9090
- --enable-insecure-login
# Uncomment the following line to manually specify Kubernetes API server Host
# If not specified, Dashboard will attempt to auto discover the API server and connect
# to it. Uncomment only if the default does not work.
# - --apiserver-host=http://my-address:port
volumeMounts:
- name: kubernetes-dashboard-certs
mountPath: /certs
# Create on-disk volume to store exec logs
- mountPath: /tmp
name: tmp-volume
livenessProbe:
httpGet:
scheme: HTTP
path: /
port: 9090
initialDelaySeconds: 30
timeoutSeconds: 30
securityContext:
allowPrivilegeEscalation: false
readOnlyRootFilesystem: true
runAsUser: 1001
runAsGroup: 2001
volumes:
- name: kubernetes-dashboard-certs
secret:
secretName: kubernetes-dashboard-certs
- name: tmp-volume
emptyDir: {}
serviceAccountName: kubernetes-dashboard
nodeSelector:
"beta.kubernetes.io/os": linux
# Comment the following tolerations if Dashboard must not be deployed on master
tolerations:
- key: node-role.kubernetes.io/master
effect: NoSchedule
У меня также есть действующий токен, который я могу использовать для доступа к панели управления Kubernetes, когда использую ClusterIP. Однако, когда я получаю к нему доступ через ngress, я не могу перейти на страницу входа даже с действующим токеном (см. Снимок экрана).
Я просмотрел журналы Nginx на предмет проблем / ошибок, но все выглядело нормально
$ kubectl logs -n monit ingress-nginx-controller-bbdc786b4-6nl9h -f
192.168.65.3 - - [03/Jun/2020:02:03:13 +0000] "GET /api/v1/csrftoken/login HTTP/1.1" 200 85 "http://kubernetes-dashboard.localhost/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36" 479 0.001 [monit-kubernetes-dashboard-80] [] 10.1.0.123:9090 85 0.001 200 59fc952888dfadf0223740c31e562ef8
192.168.65.3 - - [03/Jun/2020:02:03:13 +0000] "POST /api/v1/login HTTP/1.1" 200 1508 "http://kubernetes-dashboard.localhost/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36" 1545 0.005 [monit-kubernetes-dashboard-80] [] 10.1.0.123:9090 1508 0.005 200 241388246b11031765557475bea603ff
192.168.65.3 - - [03/Jun/2020:02:03:13 +0000] "GET /api/v1/plugin/config HTTP/1.1" 200 185 "http://kubernetes-dashboard.localhost/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36" 477 0.003 [monit-kubernetes-dashboard-80] [] 10.1.0.123:9090 185 0.003 200 45371469793ce4f35c45dec70530bea0
192.168.65.3 - - [03/Jun/2020:02:03:13 +0000] "GET /api/v1/login/status HTTP/1.1" 200 108 "http://kubernetes-dashboard.localhost/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36" 476 0.001 [monit-kubernetes-dashboard-80] [] 10.1.0.123:9090 108 0.001 200 49171f5e9316a2d6da883d1c4f0b50df
192.168.65.3 - - [03/Jun/2020:02:03:13 +0000] "GET /api/v1/login/status HTTP/1.1" 200 108 "http://kubernetes-dashboard.localhost/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36" 476 0.001 [monit-kubernetes-dashboard-80] [] 10.1.0.123:9090 108 0.001 200 c69b9d166f1527f00e7cd175696ec8c7
192.168.65.3 - - [03/Jun/2020:02:03:13 +0000] "GET /api/v1/login/status HTTP/1.1" 200 108 "http://kubernetes-dashboard.localhost/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36" 476 0.001 [monit-kubernetes-dashboard-80] [] 10.1.0.123:9090 108 0.001 200 1f9c27ca407bca57dcc0c26bca65be58
Что мне не хватает в моей конфигурации входящего трафика?
ОБНОВИТЬ: Я попытался настроить https-вход для панели управления с этой конфигурацией
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: https-ingress-monit
annotations:
nginx.ingress.kubernetes.io/backend-protocol: "HTTPS"
spec:
rules:
- host: kubernetes-dashboard.localhost
http:
paths:
- path: /
backend:
serviceName: kubernetes-dashboard
servicePort: 443
Но это похоже не работает, конечная точка не настроена
$ kubectl describe ingress https-ingress-monit -n monit
Name: https-ingress-monit
Namespace: monit
Address: localhost
Default backend: default-http-backend:80 (<error: endpoints "default-http-backend" not found>)
Rules:
Host Path Backends
---- ---- --------
kubernetes-dashboard.localhost
/ kubernetes-dashboard:443 (<error: endpoints "kubernetes-dashboard" not found>)
Annotations: nginx.ingress.kubernetes.io/backend-protocol: HTTPS
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal CREATE 87s nginx-ingress-controller Ingress monit/https-ingress-monit
Normal UPDATE 74s nginx-ingress-controller Ingress monit/https-ingress-monit
Теперь, когда я пытаюсь получить доступ http: //kubernetes-dashboard.localhost/ я вижу 503 Service Temporarily Unavailable
Вы не можете пройти верификацию (нажав Sign In
ничего не делая) из-за отсутствия HTTPS
.
Как я уже сказал в комментарии:
Логин недоступен
Если в вашем представлении входа отображается ошибка ниже, это означает, что вы пытаетесь войти через HTTP, и он был отключен из соображений безопасности.
Вход в систему доступен только в том случае, если URL-адрес, используемый для доступа к Dashboard, начинается с:
http://localhost/...
http://127.0.0.1/...
https://<domain_name>/...
Вы можете войти в Kubernetes Dashboard
без HTTPS только с:
http://localhost/...
http://127.0.0.1/...
Тебе нужно HTTPS
войти в свой Kubernetes Dashboard
с участием:
https://IP.ADDRESS
https://DOMAIN.NAME
endpoints "kubernetes-dashboard" not found
Но это не работает, конечная точка не настроена
Это означает, что Ingress
ресурс не смог найти Endpoint
для отправки трафика. В вашем случае это произошло потому, что:
Ingress
в default
пространство именService
названный kubernetes-dashboard
в monit
пространство именЧтобы это работало, вы можете (одним из способов) сделать другой Ingress
ресурс конкретно в monit
пространство имен.
Вы можете вызвать следующие команды, чтобы получить больше информации о ваших ресурсах:
$ kubectl get services -n monit
$ kubectl get endpoints -n monit
Ресурсы в Kubernetes строго связаны с namespaces
. Подробнее о них можно прочитать здесь: Kubernetes.io: Концепции: Работа с объектами: Пространства имен
У вас есть несколько способов развернуть Kubernetes Dashboard
. Это будет зависеть от решения, которое вы используете (minikube
,bare metal kubeadm cluster
,eks
,gke
, и т.д.).
Общие шаги, которые необходимо предпринять для развертывания Kubernetes Dashboard
с участием Nginx-ingress
:
Nginx-ingress
Dashboard
определениеDashboard
с участием Ingress
Nginx-ingress
Следуйте официальной документации по развертыванию Nginx-ingress
: Kubernetes.github.io: Ingress-nginx: Развернуть
Dashboard
определениеУстановка Kubernetes Dashboard
: Kubernetes.io: панель управления веб-интерфейсом: развертывание
Выше ссылку можно использовать для развертывания Dashboard
но потребуется внести некоторые изменения.
Предположим следующее:
kubernetes-dashboard
пространство имен Dashboard
: - args: - --namespace=kubernetes-dashboard - --enable-insecure-login - --insecure-bind-address=0.0.0.0
Dashboard
прослушивание порта 9090
Services
а также проверки работоспособности, связанные с Dashboard
установить на порт 9090/TCP/HTTP
. Совет для аргументов!
enable-skip-login false Если эта функция включена, на странице входа будет отображаться кнопка пропуска.
Для определения вашей панели инструментов потребуется Service
быть выставленным за пределами кластера. Вы можете создать собственное определение Service
как в примере ниже или отредактируйте определение, включенное в установку YAML
выше.
Пример ниже:
kind: Service
apiVersion: v1
metadata:
name: dashboard-service
namespace: kubernetes-dashboard
labels:
k8s-app: kubernetes-dashboard
spec:
selector:
k8s-app: kubernetes-dashboard
ports:
- port: 80
targetPort: 9090
nodePort: 30001
name: dashboard-port
type: NodePort
Пожалуйста, обратите внимание на деталь:
ports:
- port: 80
targetPort: 9090
nodePort: 30001
name: dashboard-port
Трафик будет отправлен на Dashboard
капсула в порту 9090
как того требуют аргументы Dashboard
сам.
Dashboard
с участием Ingress
Предполагая, что ваш Ingress
правильно развернут, вы можете использовать приведенный ниже пример, чтобы раскрыть Dashboard
:
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: dashboard-ingress
namespace: kubernetes-dashboard
annotations:
kubernetes.io/ingress.class: "nginx"
spec:
tls:
- secretName: tls-secret # NON-EXISTENT
rules:
- host:
http:
paths:
- path: /
backend:
serviceName: dashboard-service
servicePort: dashboard-port
Пожалуйста, внимательно посмотрите на детали:
- secretName: tls-secret # NON-EXISTENT
- он настроит контроллер на использование поддельного сертификата и разрешит HTTPS
связиnamespace: kubernetes-dashboard
- пространство имен точно такое же, как и другие Dashboard
РесурсыserviceName: dashboard-service
- название услуги, связанной с Dashboard
servicePort: dashboard-port
- имя порта службы, связанной с Dashboard
После этих шагов вы сможете ввести IP-адрес или доменное имя в свой веб-браузер и открыть Dashboard
панель.
Убедитесь, что вы подключились к Dashboard
с участием: https://
.
Если вы настроили свой Dashboard
чтобы потребовать аутентификацию, вы должны предоставить токен аутентификации. Вы можете найти свой токен, вызвав команду ниже:
$ kubectl describe secret NAME_OF_THE_SECRET -n NAMESPACE