我们在GKE中使用ingress-nginx控制器公开了十几个服务。
为了在同一域名上正确路由流量,我们需要使用重写目标规则。
这些服务自2019年推出以来一直运行良好,没有任何维护,直到最近;当cert-manager突然停止更新Let's Encrypt证书时,我们通过暂时从ingress定义中删除“tls”部分来“解决”这个问题,强制我们的客户端使用http版本。
在那之后,我们删除了所有的痕迹证书管理器试图从头开始设置它。
现在,cert-manager正在创建证书签名请求,生成一个acme http solver pod并将其添加到ingress,但是在访问其url时,我可以看到它返回一个空响应,而不是预期的令牌。
这与rewrite-target注解有关,该注解将acme challenge的路由弄得一团糟。最让我困惑的是,这以前是可行的。(由前雇员创建)
不幸的是,禁用rewrite-target不是一个选项,因为它会阻止路由正确工作。
使用dns 01不起作用,因为我们的ISP不支持DNS记录的编程更改。
是否有一种方法可以在不禁用rewrite-target的情况下使其工作?
P.S.以下是Github上报告的一些类似案例:
- https://github.com/cert-manager/cert-manager/issues/2826
- https://github.com/cert-manager/cert-manager/issues/286
- https://github.com/cert-manager/cert-manager/issues/487
他们都没有帮助。
下面是我的ClusterIssuer的定义
apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
name: letsencrypt-prod
spec:
acme:
# The ACME server URL
server: https://acme-v02.api.letsencrypt.org/directory
# Email address used for ACME registration
email: mail@domain.com
# Name of a secret used to store the ACME account private key
privateKeySecretRef:
name: letsencrypt-prod
# Enable the HTTP-01 challenge provider
solvers:
- http01:
ingress:
class: nginx
3条答案
按热度按时间kkbh8khc1#
请共享您正在使用的群集颁发者或问题。
ingressClass
如果指定了ingressClass字段,
cert-manager
会创建新的Ingress资源,将流量路由到负责响应ACMEchallenge验证请求的acmesolver
pod。参考:https://cert-manager.io/v0.12-docs/configuration/acme/http01/#ingressclass
大多数情况下,我们看不到HTTP解决方案的挑战,如果DNS或HTTP工作正常,它就会被删除。
此外,请确保您的入口没有SSL重定向注解,这也可能是证书未生成的原因。
你有没有尝试检查证书管理器的其他对象,如订单和证书状态请求?
kubectl describe challenge
你得到404那里?如果您不断尝试,则可能会遇到let's encrypt请求生成证书的速率限制。
故障排除:https://cert-manager.io/docs/faq/troubleshooting/#troubleshooting-a-failed-certificate-request
gr8qqesn2#
如果对任何人有帮助的话,我在拔了一天头发后解决了这个问题。
解决方案是在不重写的情况下创建备用入口。最初的入口是这样的。
为了确保这不会干扰letsencrypt发出的请求,我创建了另一个入口:
vsmadaxz3#
使用
http01
配置Issuer时,默认serviceType为NodePort
。这意味着,它甚至不会通过入口控制器。从文档:默认情况下,当您未设置HTTP 01或将serviceType设置为空字符串时,将使用类型NodePort。通常没有必要改变它。
我不确定其余的设置是什么样子的,但是
http01
会导致acme服务器发出HTTP请求(而不是https)。你需要确保你的nginx有http(80)的监听器。它确实遵循重定向,所以你可以监听http并将所有流量重定向到https,这是合法的和有效的。cert-manager创建一个
ingress
资源进行验证。它将流量引导到临时吊舱。这个入口有它自己的一套规则,你可以使用这个设置来控制它。您可以尝试禁用或修改此资源上的重写目标。我会尝试的另一件事是从集群内部访问这个URL(绕过ingress nginx)。如果它直接工作,那么这是一个入口/网络问题,否则就是别的问题。
请分享相关的nginx和cert-manager日志,它可能对调试或了解问题所在有用。