microk8s: kubernetes-dashboard и ingress – Клиент отправил HTTP-запрос на HTTPS-сервер

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

У меня есть кластер microk8s v1.28.14, и я хочу использовать kubernetes-dashboard.

Я включил панель управления с помощью microk8s enable dashboard, под и сервис панели управления созданы в пространстве имен ‘kube-system’, curl -k https://10.152.183.43 на сервисе работает.

Теперь я хочу иметь возможность внешнего доступа к моей панели управления. Я использую Cloudflare для своего домена с переадресацией HTTPS и гибкими настройками TLS.

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: kubernetes-dashboard
  namespace: kube-system
spec:
  rules:
  - host: cluster.my-domain.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: kubernetes-dashboard
            port:
              number: 443

Ingress сам выглядит нормально:

Name:             kubernetes-dashboard
Labels:           <none>
Namespace:        kube-system
Address:          127.0.0.1
Ingress Class:    public
Default backend:  <default>
Rules:
  Host                Path  Backends
  ----                ----  --------
  cluster.my-domain.com
                      /   kubernetes-dashboard:443 (10.1.206.212:8443)
Annotations:          <none>
Events:               <none>

Когда я пытаюсь получить доступ к своей панели управления (`curl -k https://cluster.my-domain.com’), я получаю следующую ошибку:

Клиент отправил HTTP-запрос на HTTPS-сервер

Есть идеи, как это можно решить?

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

Это сообщение об ошибке "Client sent an HTTP request to an HTTPS server" указывает на то, что ваш Ingress неправильно обрабатывает запросы HTTPS. Давайте рассмотрим, как можно решить эту проблему и правильно настроить доступ к Kubernetes Dashboard через Ingress.

Шаг 1: Проверка конфигурации Ingress

В конфигурации Ingress, которую вы предоставили, у вас установлен сервис kubernetes-dashboard, который слушает на порту 443. Однако Kubernetes Dashboard по умолчанию работает на порту 8443. Ваша настройка может выглядеть следующим образом:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: kubernetes-dashboard
  namespace: kube-system
  annotations:
    nginx.ingress.kubernetes.io/backend-protocol: "HTTPS"
spec:
  rules:
  - host: cluster.my-domain.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: kubernetes-dashboard
            port:
              number: 8443  # Измените на 8443

Шаг 2: Установка Ingress Controller

Убедитесь, что у вас установлен Ingress Controller, такой как NGINX Ingress. Если вы еще не установили его, выполните следующие команды:

microk8s enable ingress

Шаг 3: Настройка HTTPS

Поскольку вы используете Cloudflare с перенаправлением HTTPS и гибкими настройками TLS, вы можете настроить Ingress для поддержки HTTPS. Убедитесь, что вы добавили необходимые аннотации к вашему Ingress:

annotations:
  nginx.ingress.kubernetes.io/ssl-redirect: "true"
  nginx.ingress.kubernetes.io/backend-protocol: "HTTPS"
  nginx.ingress.kubernetes.io/configuration-snippet: |
    proxy_set_header X-Forwarded-Proto $scheme;

Шаг 4: Создание TLS-сертификата

Для работы с HTTPS вам нужен TLS-сертификат. Если у вас уже есть сертификат, вы можете использовать его. В противном случае вы можете создать временный секрет с самоподписанным сертификатом:

kubectl create secret tls kubernetes-dashboard-tls --cert=path/to/tls.crt --key=path/to/tls.key -n kube-system

И затем добавьте аннотацию для использования этого секрета в вашем Ingress:

tls:
- hosts:
  - cluster.my-domain.com
  secretName: kubernetes-dashboard-tls

Полная конфигурация Ingress

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

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: kubernetes-dashboard
  namespace: kube-system
  annotations:
    nginx.ingress.kubernetes.io/backend-protocol: "HTTPS"
    nginx.ingress.kubernetes.io/ssl-redirect: "true"
spec:
  tls:
  - hosts:
    - cluster.my-domain.com
    secretName: kubernetes-dashboard-tls
  rules:
  - host: cluster.my-domain.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: kubernetes-dashboard
            port:
              number: 8443

Шаг 5: Проверка доступа

После применения изменений проверьте доступность вашего Kubernetes Dashboard с помощью:

curl -k https://cluster.my-domain.com

Или откройте браузер и введите в адресной строке https://cluster.my-domain.com.

Заключение

Следуя этим шагам, вы должны решить проблему с ошибкой "Client sent an HTTP request to an HTTPS server" и получить доступ к Kubernetes Dashboard через Ingress с поддержкой HTTPS. Если возникнут дополнительные вопросы или проблемы, не стесняйтесь обращаться за помощью.

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

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