#nginx #kubernetes #cloudflare #azure-aks #cloudflare-argo
#nginx #kubernetes #cloudflare #azure-aks #cloudflare-argo
Вопрос:
Я нахожусь в процессе настройки туннеля Argo от CloudFlare с нашим существующим кластером AKS. Я создал образ Docker, содержащий необходимую конфигурацию для прокси входящих запросов к нашей службе входа (мы используем Kubernetes Nginx Ingress. Мы выполнили необходимые предварительные шаги на портале CloudFlare, чтобы включить туннельное соединение Argo, и я вижу, что при запуске нашего туннельного контейнера CloudFlare он успешно создает 4 подключения к туннелю. Однако мы не можем попасть на наш веб-сайт, и в журналах мы видим проблему, связанную с сертификатом. Мы попытались установить URL
свойство в cloudflared config.yml с внутренним адресом Kubernetes и внутренним IP-адресом службы входа.
# Deployment file
...
containers:
- name: cloudflared-container
image: <CLOUDFLARED_IMAGE>
imagePullPolicy: Always
command: ["cloudflared", "tunnel", "--config", "/cloudflare/config.yml", "--no-autoupdate", "run"]
args: ["--force", "--credentials-file", "/cloudflare/tunnel-credentials.json", "<TUNNEL_GUID>"]
Используя адрес:
# CONFIG.YML
url: https://<INGRESS_CONTROLLER_NAME>.default.svc.cluster.local:443
tunnel: <TUNNEL_GUID>
loglevel: debug
В журналах модуля cloudflared pod мы видим следующее
ERROR[2020-12-02T15:08:33Z] HTTP request error: Error proxying request to origin: x509: certificate is valid for ingress.local, not <INGRESS_CONTROLLER_NAME>.default.svc.cluster.local
Использование IP-адреса
# CONFIG.YML
url: https://<INTERNAL_INGRESS_SVC_IP_ADDRESS>:443
tunnel: <TUNNEL_GUID>
loglevel: debug
В журналах модуля cloudflared pod мы видим следующее
ERROR[2020-12-02T14:41:47Z] HTTP request error: Error proxying request to origin: x509: cannot validate certificate for <INTERNAL_INGRESS_SVC_IP_ADDRESS> because it doesn't contain any IP SANs
Я также попытался использовать ingress.local в качестве значения для URL
в нашем config.yml, но это привело к следующему:
ERROR[2020-12-02T15:16:45Z] HTTP request error: Error proxying request to origin: dial tcp: lookup ingress.local on <CORE_DNS_IP>:53: no such host
Я предполагаю, что нам либо нужно настроить CNAME для <INGRESS_CONTROLLER_NAME>.default.svc.cluster.local
нашего экземпляра coredns в кластере, либо сгенерировать и применить сертификат, который имеет действительную тему для этого адреса. Однако я не знаю, как вы делаете что-либо из этого, или я делаю это неправильно, поэтому мне нужна помощь.
Редактировать
Привет @AndyPook — да, он находится в пространстве имен по умолчанию. Я заставил его работать, добавив псевдоним хоста в конфигурацию развертывания cloudflared для имени хоста «ingress.local» и указав его на внутренний IP-адрес моего nginx ingress loadbalancer:
hostAliases:
- ip: "nginx IP"
hostnames:
- "ingress.local"
Тем не менее, мне пришлось добавить no-tls-verify: true
в свой cloudflared config.yaml, поскольку он пытался проверить сертификат ingress.local (который, я полагаю, является самоподписанным), поэтому не удалось.
Мне все еще нужно заменить сертификат ingress.local, поскольку это не лучшее решение. Игнорирование проверки SSL-сертификата — это не то, что мы можем сделать в реальном времени.
Комментарии:
1. находится ли ваш входной контроллер в пространстве имен «по умолчанию»? Обычно соглашение выглядит примерно как «ingress-nginx» (в зависимости от того, как вы его установили). Мы находимся на том же пути. Не получаем большой помощи от наших контактов CF
2. Привет @AndyPook — пожалуйста, посмотрите мою правку выше. Спасибо за ваши комментарии!
Ответ №1:
Если вы перенаправляетесь на контроллер входа и хотите получить сертификат для хоста, который обслуживает вход, вам нужно добавить заголовок хоста к запросу, например
ingress:
- hostname: example.com
service: https://<INGRESS_CONTROLLER_NAME>.default.svc.cluster.local:443
originRequest:
httpHostHeader: "example.com"