【问题标题】:Can't complete HTTP challenge for letsencrypt on Kubernetes无法在 Kubernetes 上完成 Letsencrypt 的 HTTP 质询
【发布时间】:2021-05-23 03:30:23
【问题描述】:

我有一个 k3s 集群,我正在尝试将其配置为从 let's encrypt 获取 SSL 证书。我遵循了很多指南,我认为我真的很接近管理它,但问题是 Kubernetes 中的 Challenge 对象报告了这个错误:

Waiting for HTTP-01 challenge propagation: failed to perform self check GET request 'http://devstore.XXXXXXX.com/.well-known/acme-challenge/kVVHaQaaGU7kbYqnt8v7LZGaQvWs54OHEe2WwI_MOgk': Get "http://devstore.XXXXXXX.com/.well-known/acme-challenge/kVVHaQaaGU7kbYqnt8v7LZGaQvWs54OHEe2WwI_MOgk": dial tcp: lookup devstore.XXXXXXX.com on 10.43.0.10:53: no such host

似乎证书管理器以某种方式试图在内部解析我的公共 DNS 名称,但没有设法做到这一点,因此挑战不起作用。你能帮我解决这个问题吗,我用谷歌搜索了它,但我找不到解决方案......

谢谢

【问题讨论】:

  • 您能否提供有关您的环境、配置 YAML 的详细信息?您根据哪个指南?是本地环境还是云环境?
  • 我相信 kubernetes 带有自己的 DNS,作为 kube-system 命名空间的一部分,您可以将其扩展到 0 个实例以将其关闭。那么这工作kubernetes.io/docs/tasks/administer-cluster/…

标签: nginx kubernetes lets-encrypt cert-manager k3s


【解决方案1】:

您想要证书的域的 DNS 记录可能不存在。 如果是这样,并且您使用的是水平分割 DNS 配置(劫持本地网络中的 .com 域),请确保它指向您的公共 IP(例如您的家庭网关)

[编辑]

此外,您必须弄清楚 LE 在网络中如何访问您的集群,因此将 80/443 端口转发到您的集群的 IP。

你可以不用它,因为 k3s 在负载均衡器中默认为cluster traffic policy

【讨论】:

  • 是的,集群已经通过 nginx 入口公开可用。我不明白我应该配置哪个 DNS,我已经配置了公共 DNS(并且它适用于我的应用程序的 HTTP 版本),我是否也应该配置 K3S DNS?我该怎么做?我坚持内部 DNS 将使用外部 DNS 作为非权威 DNS 区域。
  • 所以这意味着您的应用程序可能正在劫持devstore.XXXXXXX.com/.well-known ?
  • 不,我不这么认为。我发布的应用程序是一个非常简单的用 .NET 编写的 HTTP 应用程序,唯一的问题是关于 SSL 证书。在我遵循的各种指南中,我没有看到有关要配置的 Kubernetes DNS 的任何部分,但我从证书管理器得到的答案似乎表明问题可能出在这个...
  • K8S的DNS中没有什么可配置的。您应该将您的 DNS 记录 - 公共 - 例如在 cloudflare - 指向您的公共 IP,例如app.example.com 指向 1.2.3.4(您的公共 IP)。发生的情况是 cert-manager 将向 LE 服务器发出请求,机器人将访问端口 80 上的公共 ip,以访问 app.example.com/.well-known/XYZ 以验证令牌。我过度简化了这个过程,它比这更复杂。
  • 可能是你运行k3s的节点有你运行的本地DNS?如果是这样,请将其更改为公共 DNS (1.1.1.1)
【解决方案2】:

这可能是由多种不同的原因造成的。如果您发现这是一个暂时性问题(或者您之前可能错误配置了 coredns),您可能需要仔细检查您的 coredns 配置映射(在 kube-system 命名空间中)。

例如您可以删除/减少缓存,或指向不同的 DNS 名称服务器。

Here's a description 的问题,切换到 Google DNS + 缓存删除有助于解决问题。

【讨论】:

  • 很好地指出这一点,但问题是关于 k3s。 k3s 中不需要配置 CoreDNS,最重要的是 CoreDNS——不管它的供应商——转发到它在 k3s 运行的节点上的 /etc/resolv.conf 中找到的任何内容。 forward . /etc/resolv.conf@SebastianoGazzola
  • @DarthHTTP 感谢您的更正,我没有注意到它是关于 k3s 的。不过,在其他环境中,/etc/resolv.conf 注释仍然很有用。您可能没有更改节点解析器的好方法(例如托管的 DigitalOcean 节点)。
【解决方案3】:

谢谢 DarthHTTP,我终于成功了!正如我在评论中提到的,问题是防火墙没有使用来自专用网络端的公共 IP 正确路由 HTTP 请求。我解决了配置内部 DNS 服务器的问题,该服务器使用 K3S 节点的私有 IP 地址解析名称,并将该服务器用作 K3S 节点的 DNS 服务器。最终,我的 HTTP Web 应用程序获得了一个有效的 let's encrypt 证书!

【讨论】:

  • 很高兴听到!您可以使用 /etc/hosts 文件而不是设置 DNS 服务器。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-06
  • 1970-01-01
  • 1970-01-01
  • 2023-03-04
  • 2011-07-17
  • 2020-07-01
相关资源
最近更新 更多