nginx - 在 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 证书验证不是我们在现场可以做的事情。
解决方案
如果您要重定向到入口控制器并且想要入口服务的主机的证书,则需要在请求中添加主机标头,例如
ingress:
- hostname: example.com
service: https://<INGRESS_CONTROLLER_NAME>.default.svc.cluster.local:443
originRequest:
httpHostHeader: "example.com"
推荐阅读
- android - 从多个文件夹 Firebase 存储中获取所有文件
- java - getRowIndex 总是返回 null
- javascript - 使用 Knex js 修改列的大小
- image - 如何在 Xamarin Forms 中合并两个图像?
- node.js - 如何在 Express 中将 JSON 描述符附加到 res.sendFile()?
- python - 访问列表中的项目并形成图表
- listview - 我怎样才能让它在颤动中滚动
- c++ - 如何向 Qt Creator 添加新工具包
- laravel - Eloquent SELECT "string" AS content_type 导致错误
- php - php中的支付api多维数组问题