Дашборд Kubernetes не работает с контроллером Nginx Ingress, ошибка “Клиент отправил HTTP-запрос через HTTPS-сервер”

Вопрос или проблема

ПЕРЕД НАЧАЛОМ: Я посмотрел все посты, связанные с этим, перед тем как задать свой вопрос здесь, но ни одно из предложенных решений мне не помогло – даже добавление следующей аннотации не помогло:

    nginx.ingress.kubernetes.io/backend-protocol: HTTPS

Проблема: Я не могу заставить панель управления Kubernetes работать с Nginx Ingress Controller. Я всегда получаю ошибку “Клиент отправил http-запрос через HTTPS-сервер” при посещении URL-адреса ingress.

Версии ПО:

    helm kubernetes dashboard chart version: 6.0.8
    nginx ingress version: 0.16.1 (nginx-stable)

Контроллер Nginx включен с параметром enableTLSPassthrough=true.

Конфигурационные файлы:
Мой объект Ingress выглядит следующим образом:

    ingress:
     enabled: true
     annotations:
       kubernetes.io/ingress.class: nginx
       nginx.ingress.kubernetes.io/backend-protocol: "HTTPS"
       nginx.ingress.kubernetes.io/force-ssl-redirect: "true"
       nginx.ingress.kubernetes.io/rewrite-target: /
       nginx.ingress.kubernetes.io/secure-backends: "true"
       nginx.ingress.kubernetes.io/ssl-passthrough: "true"
     hosts:
     - k8s-dashboard.hpsc.prod.mycompany.com
     ingressClassName: nginx
     secretName: admin-user
     backend:
       service:
         name: kubernetes-dashboard
       port:
         name: 443
       pathType: ImplementationSpecific
       paths:
       - /
       host: k8s-dashboard.hpsc.prod.mycompany.com
     tls:
     - hosts:
       - k8s-dashboard.hpsc.prod.mycompany.com
       secretName: nginx-custom-certificate-secret

Сгенерированная конфигурация в контроллере Nginx для панели управления Kubernetes выглядит следующим образом:

    upstream kubernetes-dashboard-kubernetes-dashboard-k8s-dashboard.hpsc.prod.mycompany.com-kubernetes-dashboard-443 {
       zone kubernetes-dashboard-kubernetes-dashboard-k8s-dashboard.hpsc.prod.mycompany.com-kubernetes-dashboard-443 256k;
       random two least_conn;
    
    server 10.233.69.180:8443 max_fails=1 fail_timeout=10s max_conns=0;
    
    }
    
    server {
    
    listen 80;
       listen [::]:80;
    
    listen unix:/var/lib/nginx/passthrough-https.sock ssl proxy_protocol;
       set_real_ip_from unix:;
       real_ip_header proxy_protocol;
    
    ssl_certificate /etc/nginx/secrets/kubernetes-dashboard-nginx-custom-certificate-secret;
       ssl_certificate_key /etc/nginx/secrets/kubernetes-dashboard-nginx-custom-certificate-secret;
    
    server_tokens on;
       server_name k8s-dashboard.hpsc.prod.mycompany.com;
    
    set $resource_type "ingress";
       set $resource_name "kubernetes-dashboard";
       set $resource_namespace "kubernetes-dashboard";
    
    if ($scheme = http) {
          return 301 https://$host:443$request_uri;
       }
    
    location / {
          set $service "kubernetes-dashboard";
    
    proxy_http_version 1.1;
          proxy_connect_timeout 60s;
          proxy_read_timeout 60s;
          proxy_send_timeout 60s;
          client_max_body_size 1m;
          proxy_set_header Host $host;
          proxy_set_header X-Real-IP $remote_addr;
          proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
          proxy_set_header X-Forwarded-Host $host;
          proxy_set_header X-Forwarded-Port $server_port;
          proxy_set_header X-Forwarded-Proto $scheme;
          proxy_buffering on;
    
    proxy_pass http://kubernetes-dashboard-kubernetes-dashboard-k8s-dashboard.hpsc.prod.mycompany.com-kubernetes-dashboard-443;
       }
    }

Я заметил, что если я вручную изменю вышеуказанную конфигурацию, заменив http на https в “proxy_pass” (например, https://kubernetes-dashboard-kubernetes-dashboard-……..-443), моя панель управления K8s работает нормально, когда я посещаю https://k8s-dashboard.hpsc.prod.mycompany.com в браузере.

Кто-нибудь может помочь мне это исправить?

Ответ или решение

Понимаю, что у вас возникла проблема с доступом к Kubernetes Dashboard через контроллер Nginx Ingress, когда вы получаете ошибку "Client sent http request over HTTPS Server". Давайте рассмотрим, как это исправить.

Причины проблемы

Ошибка "Client sent http request over HTTPS Server" возникает, когда клиент пытается отправить HTTP-запрос на сервер, настроенный на прием только HTTPS-запросов. Ваша текущая конфигурация указывает, что сервис Kubernetes Dashboard работает по протоколу HTTPS, но конфигурация вашего Ingress не соответствует этому.

Решение

  1. Корректировка аннотаций Ingress: Убедитесь, что вы используете правильные аннотации для вашего Ingress. Вы уже указали следующие аннотации:

    nginx.ingress.kubernetes.io/backend-protocol: "HTTPS"
    nginx.ingress.kubernetes.io/force-ssl-redirect: "true"
    nginx.ingress.kubernetes.io/rewrite-target: /
    nginx.ingress.kubernetes.io/secure-backends: "true"
    nginx.ingress.kubernetes.io/ssl-passthrough: "true"

    Однако, использование ssl-passthrough также требует правильной настройки. Если это не обязательно, попробуйте отключить nginx.ingress.kubernetes.io/ssl-passthrough: "true" и использовать стандартный способ работы Nginx с SSL.

  2. Убедитесь, что сервис работает на порту 443: Ваша конфигурация Ingress указывает, что сервис работает на порту 443:

    backend:
      service:
        name: kubernetes-dashboard
      port:
        name: 443

    Убедитесь, что сервис Kubernetes Dashboard слушает на этом порту и принимает HTTPS-запросы.

  3. Обновите proxy_pass в конфигурации: Если вы обнаружили, что изменение proxy_pass на HTTPS исправляет проблему, возможно, вам нужно убедиться, что Nginx правильно передает запросы. Включив TLS на Ingress, вы должны убедиться, что proxy_pass в конфигурации вызывает судно по HTTPS.

  4. Обновление конфигурации TLS: Убедитесь, что у вас есть корректные сертификаты для nginx-custom-certificate-secret и что они правильно применены в вашем Ingress.

  5. Перепроверка Ingress-контроллера: Убедитесь, что включен правильный Ingress-класс. У вас указано:

    kubernetes.io/ingress.class: nginx
    ingressClassName: nginx

    Убедитесь, что ваш Ingress контроллер правильно настроен на использование этого класса.

Пример исправленной конфигурации Ingress

Вот как может выглядеть исправленная конфигурация вашего Ingress:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: k8s-dashboard
  annotations:
    kubernetes.io/ingress.class: nginx
    nginx.ingress.kubernetes.io/backend-protocol: "HTTPS"
    nginx.ingress.kubernetes.io/force-ssl-redirect: "true"
    nginx.ingress.kubernetes.io/rewrite-target: /
    nginx.ingress.kubernetes.io/secure-backends: "true"
spec:
  tls:
  - hosts:
    - k8s-dashboard.hpsc.prod.mycompany.com
    secretName: nginx-custom-certificate-secret
  rules:
  - host: k8s-dashboard.hpsc.prod.mycompany.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: kubernetes-dashboard
            port:
              number: 443

Заключение

После внесения изменений обновите конфигурацию Ingress и проверьте, доступен ли Kubernetes Dashboard по адресу https://k8s-dashboard.hpsc.prod.mycompany.com. Если проблема не решена, проверьте логи Nginx Ingress Controller на наличие дополнительных подсказок о том, что может быть неправильно настроено.

Также убедитесь, что на сервере Dashboard правильно настроены роли и доступы, чтобы исключить проблемы с авторизацией.

Оцените материал
Добавить комментарий

Капча загружается...