Рейтинг:1

NGINX Ingress в Kubernetes не использует HTTPS

флаг in

Я устанавливаю кластер Kubernetes на «голое железо». Я использовал Kubeadm для установки. Чтобы сделать мои службы доступными из-за пределов кластера, я установил NGINX Ingress, используя следующую документацию: Документация по NGINX

Поскольку я не хочу связываться со своими службами без безопасности TLS, я настроил сертификат благодаря cert-manager: Документ диспетчера сертификатов.

$kubectl получить сертификат
ИМЯ ГОТОВ ТАЙНЫЙ ВОЗРАСТ
сертификат-tls-prod True tls-secret-prod 3h1m
tls-secret-prod Правда tls-secret-prod 41 м

Генерация сертификатов работает и распознается клиентом.

Теперь я пытаюсь установить свой собственный реестр Docker (реестр: 2.7.1) в кластере. После развертывания Pod и службы я пытаюсь сделать вход в докер от моего клиента, но это не работает.

Входная конфигурация:

Версия API: networking.k8s.io/v1
вид: Вход
метаданные:
  аннотации:
    # nginx.ingress.kubernetes.io/ssl-redirect: "true"
    # nginx.ingress.kubernetes.io/force-ssl-redirect: "true"
    # nginx.ingress.kubernetes.io/ssl-passthrough: "true"
    nginx.ingress.kubernetes.io/backend-протокол: «HTTPS»
    cert-manager.io/issuer: "letsencrypt-prod"
  пространство имен: по умолчанию
  имя: nginx-вход
спецификация:
  тлс:
  - хозяева:
    - пример.com
    secretName: tls-secret-prod
  правила:
  - хост: example.com
    http:
      пути:
      - дорожка: /
        тип пути: префикс
        серверная часть:
          оказание услуг:
            имя: докер-реестр
            порт: 
              номер: 5000

Когда я пытаюсь получить доступ к сервису, выполняя простой завиток:

завиток -v https://example.com/

* Попытка <cluster-ip>:443...
* Подключен к example.com (<cluster-ip>), порт 443 (#0)
* ALPN, предлагая h2
* ALPN, предлагающий http/1.1
* успешно установить места проверки сертификата:
* CA-файл: /etc/ssl/certs/ca-certificates.crt
* CApath: нет
* TLSv1.3 (OUT), рукопожатие TLS, приветствие клиента (1):
* TLSv1.3 (IN), рукопожатие TLS, приветствие сервера (2):
* TLSv1.2 (IN), рукопожатие TLS, сертификат (11):
* TLSv1.2 (IN), рукопожатие TLS, обмен ключами сервера (12):
* TLSv1.2 (IN), рукопожатие TLS, сервер готов (14):
* TLSv1.2 (OUT), рукопожатие TLS, обмен ключами клиента (16):
* TLSv1.2 (OUT), изменение шифрования TLS, изменение спецификации шифрования (1):
* TLSv1.2 (OUT), рукопожатие TLS, Готово (20):
* TLSv1.2 (IN), рукопожатие TLS, Готово (20):
* SSL-соединение с использованием TLSv1.2/ECDHE-RSA-AES256-GCM-SHA384
* ALPN, сервер принят для использования http/1.1
*Сертификат сервера:
* тема: CN=example.com
* дата начала: 13 июля 10:03:45 2021 по Гринвичу
* срок действия: 11 октября 10:03:44 2021 по Гринвичу
* subjectAltName: хост "example.com" соответствует сертификату "example.com"
* эмитент: C=US; O=Давайте зашифруем; CN=R3
* Проверка сертификата SSL в порядке.
> ПОЛУЧИТЬ/HTTP/1.1
> Хост: example.com
> Пользовательский агент: curl/7.77.0
> Принять: */*
> 
* Получено HTTP/0.9, когда это не разрешено
* Закрытие соединения 0
* TLSv1.2 (OUT), предупреждение TLS, уведомление о закрытии (256):
curl: (1) Получено HTTP/0.9, когда это не разрешено

Рукопожатие кажется правильным. Но, что-то не так в конце.

Журнал модуля реестра Docker:

http: ошибка рукопожатия TLS от <ingress-pod-ip>:38686: tls: первая запись не похожа на рукопожатие TLS

Журнал Ingress Pod:

[ошибка] 84#84: *40 восходящий поток не отправил допустимый заголовок HTTP/1.0 при чтении заголовка ответа из восходящего потока, клиент: <cluster-ip>, сервер: example.com, запрос: «GET / HTTP/1.1», восходящий поток: "http://<registry-pod-ip>:5000/", хост: "example.com"

Лог входа в Docker с клиента:

вход в докер https://example.com
Ответ об ошибке от демона: получить "https://example.com/v2/": net/http: транспортное соединение HTTP/1.x разорвано: неверный ответ HTTP "\x15\x03\x01\x00\x02\x02"

Насколько я понимаю, проблема связана с тем, что один из компонентов пытается взаимодействовать с http вместо https. Кстати, апстрим идет по http, что кажется странным.
К сожалению, я не могу решить эту проблему. Я попробовал несколько аннотаций (которые прокомментированы) в объявлении входа, чтобы принудительно использовать https, но это не сработало.

я видел это проблема на Github, но у моего аписервера нет параметра --kubelet-https=false

Я был бы признателен, если бы у вас была какая-либо подсказка, которая могла бы мне помочь.

djdomi avatar
флаг za
может быть, вы используете http вместо https?
Thomas avatar
флаг in
@djdomi Что ты имеешь в виду? Как вы думаете, в какой части моей конфигурации я могу ошибаться?
Mikołaj Głodziak avatar
флаг id
Какую версию Kuberneted вы использовали? Пожалуйста, имейте в виду, что существует 3 типа Nginx. Nginx Ingress Controller с открытым исходным кодом, Nginx Incorporaton (nginx inc) и Nginx Incorporaton Plus. Попробуйте использовать nginx с открытым исходным кодом.[Вот пример](https://kubernetes.github.io/ingress-nginx/deploy/baremetal/)?
Thomas avatar
флаг in
Спасибо за помощь ! Мне удалось заставить это работать. Кажется, это произошло из-за конфигурации реестра докеров. Я изменил сертификаты и перезапустил модуль.
Рейтинг:1
флаг id

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

Мне удалось заставить это работать. Кажется, это произошло из-за конфигурации реестра докеров. Я изменил сертификаты и перезапустил модуль.

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.