Включение туннеля Argo от CloudFlare в кластере AKS

#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"