Я устанавливаю кластер 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
Я был бы признателен, если бы у вас была какая-либо подсказка, которая могла бы мне помочь.