Вопрос или проблема
ПЕРЕД НАЧАЛОМ: Я посмотрел все посты, связанные с этим, перед тем как задать свой вопрос здесь, но ни одно из предложенных решений мне не помогло – даже добавление следующей аннотации не помогло:
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 не соответствует этому.
Решение
-
Корректировка аннотаций 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. -
Убедитесь, что сервис работает на порту 443: Ваша конфигурация Ingress указывает, что сервис работает на порту 443:
backend: service: name: kubernetes-dashboard port: name: 443
Убедитесь, что сервис Kubernetes Dashboard слушает на этом порту и принимает HTTPS-запросы.
-
Обновите
proxy_pass
в конфигурации: Если вы обнаружили, что изменениеproxy_pass
на HTTPS исправляет проблему, возможно, вам нужно убедиться, что Nginx правильно передает запросы. Включив TLS на Ingress, вы должны убедиться, чтоproxy_pass
в конфигурации вызывает судно по HTTPS. -
Обновление конфигурации TLS: Убедитесь, что у вас есть корректные сертификаты для
nginx-custom-certificate-secret
и что они правильно применены в вашем Ingress. -
Перепроверка 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 правильно настроены роли и доступы, чтобы исключить проблемы с авторизацией.