首页 > 解决方案 > 在 AKS 集群中启用 CloudFlare 的 Argo 隧道

问题描述

我正在使用我们现有的 AKS 集群设置 CloudFlare 的 Argo 隧道。我创建了一个 Docker 映像,其中包含将传入请求代理到我们的入口服务的必要配置(我们正在使用Kubernetes Nginx Ingress。我们已经在 CloudFlare 门户中完成了必要的先决条件步骤以启用 Argo 隧道连接,我可以看到当我们的 CloudFlare 隧道容器启动时,它成功创建了 4 个到隧道的连接。但是,我们无法访问我们的网站,并且在日志中我们看到了与证书相关的问题。我们尝试在 cloudflared config.yml中设置URL属性内部 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作为 config.yml 中的值,URL但结果如下:

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

我猜我们要么需要<INGRESS_CONTROLLER_NAME>.default.svc.cluster.local在集群中的 coredns 实例中设置 CNAME,要么生成并应用具有该地址有效主题的证书。但是,我不知道您是如何做这些事情的,或者我是否以错误的方式进行操作,所以需要一些帮助。

编辑

嗨@AndyPook - 是的,它在默认命名空间中。我通过在我的 cloudflared 部署配置中为主机名“ingress.local”添加一个主机别名来让它工作,并将它指向我的 nginx 入口负载均衡器的内部 IP 地址:

hostAliases:
  - ip: "nginx IP"
    hostnames:
      - "ingress.local"

但是,我不得不添加no-tls-verify: true到我的 cloudflared config.yaml中,因为它试图验证 ingress.local 证书(我相信它是自签名的)所以失败了。

我仍然需要更换 ingress.local 证书,因为这不是一个很好的解决方案。忽略 SSL 证书验证不是我们在现场可以做的事情。

标签: nginxkubernetescloudflareazure-akscloudflare-argo

解决方案


如果您要重定向到入口控制器并且想要入口服务的主机的证书,则需要在请求中添加主机标头,例如

ingress:
  - hostname: example.com
    service: https://<INGRESS_CONTROLLER_NAME>.default.svc.cluster.local:443
    originRequest:
      httpHostHeader: "example.com"

推荐阅读