kubernetes 启用rewrite-target时,cert-manager HTTP 01证书质询不可访问

eivgtgni  于 2023-06-05  发布在  Kubernetes
关注(0)|答案(3)|浏览(208)

我们在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上报告的一些类似案例:

他们都没有帮助。
下面是我的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
kkbh8khc

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

gr8qqesn

gr8qqesn2#

如果对任何人有帮助的话,我在拔了一天头发后解决了这个问题。
解决方案是在不重写的情况下创建备用入口。最初的入口是这样的。

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: reward-ingress-https
  namespace: prod
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /$2
spec:
  ingressClassName: public
  tls: 
  - hosts: 
    - home.myhome.net 
    secretName: my-secret
  rules:
  - host: "home.myhome.net"
    http:
      paths:
      - pathType: Prefix
        path: /reward(/|$)(.*)
        backend:
          service:
            name: reward-service
            port:
              number: 7777

为了确保这不会干扰letsencrypt发出的请求,我创建了另一个入口:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: acme-ingress
  namespace: prod
  annotations:
    cert-manager.io/cluster-issuer: prod-issuer 
    acme.cert-manager.io/http01-edit-in-place: "true" 
spec:
  ingressClassName: public
  rules:
  - host: "home.myhome.net"
    http:
      paths:
      - pathType: Prefix
        path: /.well-known/acme-challenge/
        backend:
          service:
            name: cert-manager
            port:
              number: 8089
vsmadaxz

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日志,它可能对调试或了解问题所在有用。

相关问题