Назад | Перейти на главную страницу

Как правильно настроить доступ к панели управления kubernees за входом nginx

Я пытаюсь настроить 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

TL; DR

Вы не можете пройти верификацию (нажав Sign In ничего не делая) из-за отсутствия HTTPS.

Как я уже сказал в комментарии:

Логин недоступен

Если в вашем представлении входа отображается ошибка ниже, это означает, что вы пытаетесь войти через HTTP, и он был отключен из соображений безопасности.

Вход в систему доступен только в том случае, если URL-адрес, используемый для доступа к Dashboard, начинается с:

  • http://localhost/...
  • http://127.0.0.1/...
  • https://<domain_name>/...

Github.com: Kubernetes: Панель управления: Вход недоступен

Вы можете войти в 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 Если эта функция включена, на странице входа будет отображаться кнопка пропуска.

Github.com: Kubernetes: Панель управления: Аргументы

Для определения вашей панели инструментов потребуется 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