【发布时间】:2021-01-31 04:24:56
【问题描述】:
拥有一个 nginx 入口的 kubernetes 集群,我正在尝试使用 cert-manager 和 ACME ClusterIssuer 设置 https 访问。
我对 cert-manager 所遵循的步骤感到相当满意,但我目前处于对 cert-manager 作为挑战过程的一部分在集群中配置的 http 求解器提出挑战的阶段。当我描述服务生成的挑战时,我看到它的状态为:
Reason: Waiting for http-01 challenge propagation: failed to perform self check GET request 'http://www.example.com/.well-known/acme-challenge/nDWOHEMXgy70_wxi53ijEKjUHFlzg_UJJS-sv_ahGzg': Get "http://www.example.com/.well-known/acme-challenge/nDWOHEMXgy70_wxi53ijEKjUHFlzg_UJJS-sv_ahGzg": dial tcp xx.xx.xx.xxx:80: connect: connection timed out
当我从我的 k8s 主机服务器调用求解器的 url 时:
curl -H "Host: www.example.com" http://192.168.1.11:31344/.well-known/acme-challenge/nDWOHEMXgy70_wxi53ijEKjUHFlzg_UJJS-sv_ahGzg
我得到了 200 的回复。
注意:地址 192.168.1.11 是运行 http solver pod 的 k8s 节点的 ip。而 31344 端口是 http solver pod 的 nodeIp 服务的内部端口。
我试图弄清楚为什么挑战本身会超时而没有得到 200 分。
我已经通过 4g(而不是 wifi)从我的手机测试了 http 求解器的 url,这样我得到了 200 OK 所以,这告诉我 http 求解器可以从外部通过防火墙并通过 nginx 进入服务和 pod 对吗?因此,如果是这种情况,那么 Let's Encrypt 无法从同一 URL 检索令牌还有什么其他原因?
--- 当前配置 ---
集群发行者:
apiVersion: cert-manager.io/v1alpha2
kind: ClusterIssuer
metadata:
name: letsencrypt-staging
namespace: cert-manager
spec:
acme:
# The ACME server URL
server: https://acme-staging-v02.api.letsencrypt.org/directory
# Email address used for ACME registration
email: my.address@example.com
# Name of a secret used to store the ACME account private key
privateKeySecretRef:
name: letsencrypt-staging
# Enable the HTTP-01 challenge provider
solvers:
- selector: {}
http01:
ingress:
class: nginx
入口:
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: ing-myservice-web
namespace: myservice
annotations:
kubernetes.io/ingress.class: "nginx"
cert-manager.io/cluster-issuer: "letsencrypt-staging"
spec:
tls:
- hosts:
- www.example.com
secretName: secret-myservice-web-tls
rules:
- host: www.example.com
http:
paths:
- backend:
serviceName: svc-myservice-web
servicePort: 8080
path: /
- host: www.example.co.uk
http:
paths:
- backend:
serviceName: svc-myservice-web
servicePort: 8080
path: /
【问题讨论】:
-
我已经设法通过运行 curl 命令证明 http 求解器 pod 运行正常,如下所示:
curl -I -H "Host: www.place.com" http://192.168.1.11:30421/.well-known/acme-challenge/nDWOHEMXgy70_wxi53ijEKjUHFlzg_UJJS-sv_ahGzg。此调用返回 200 OK。 -
关于 404 的挑战状态,我认为这可能是因为无法从我自己的网络中调用外部 IP 地址(我的域指向的地址)?即从防火墙后面?
-
我已经通过 4g(而不是 wifi)从我的手机测试了 http 求解器的 url,所以这证明 http 求解器可以通过防火墙和 nginx 进入服务和 pod,这很好但是正如我上一条评论所说,我认为不可能从我自己的网络中调用 http 求解器的挑战 url。那么如何解决这个问题呢?
-
letsencrypt.org/docs/challenge-types/#dns-01-challenge 中的文本表明 Let's Encrypt 试图从 http 求解器的 url 中检索令牌,因此我的最后一条评论无效。但是,我可以通过 4g(即外部)从手机中检索令牌,为什么不能让我们加密?
-
1.请使用所有必要的信息编辑您的问题,而不是将其作为评论发布。尽量保持简短和清晰。 2. 提供您的配置/yamls 和步骤来重现您的问题。根据您给我们的帮助,我们帮不上什么忙。
标签: kubernetes kubernetes-ingress nginx-ingress cert-manager