为什么我的 "Certificate" 对象和 "Ingress" 都在创建证书?

Why my "Certificate" object and "Ingress" both are creating Certificates?

为什么我的“证书”对象和“入口”都在创建证书?

apiVersion: cert-manager.io/v1
kind: Certificate
metadata:
  name: blog-app-crt
spec:
  secretName: blog-app-crt-sec
  issuerRef:
    kind: ClusterIssuer
    name: letsencrypt-prod
  commonName: blog.mydomain.com
  dnsNames:
    - blog.mydomain.com




apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
  name: letsencrypt-prod
spec:
  acme:
    # Email address used for ACME registration
    email: myemailid@gmail.com
    server: https://acme-v02.api.letsencrypt.org/directory
    privateKeySecretRef:
      # Name of a secret used to store the ACME account private key
      name: letsencrypt-production-private-key
    # Add a single challenge solver, HTTP01 using nginx
    solvers:
    - http01:
        ingress:
          class: nginx


apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: ingress-service
  annotations:
    kubernetes.io/ingress.class: nginx                      
    nginx.ingress.kubernetes.io/rewrite-target: /         
    cert-manager.io/cluster-issuer: "letsencrypt-prod"       
    nginx.ingress.kubernetes.io/ssl-redirect: 'true'        

spec:
  tls:
    - hosts:                                                
        - blog.mydomain.com
      secretName: blog-app-crt-sec                      
      
  rules:                                                    
    - host: blog.mydomain.com                                         
      http:                                                 
        paths:                                              
          - pathType: Prefix
            path: "/?(.*)"                                    
            backend:
              service:
                name: app-1-endpoint
                port: 
                  number: 5000                            
          - pathType: Prefix
            path: "/tribute/?(.*)"
            backend:
              service:
                name: app-2-endpoint
                port: 
                  number: 5001

当我创建上面的对象时,它创建了 2 个证书对象,它们都指向同一个秘密。

  1. blog-app-crt-sec
  2. blog-app-crt

如何只创建 1 个证书?如果我只创建一个没有任何自定义证书的 ClusterIssuer,那当然可以解决问题,但我想创建一个自定义证书来控制续订内容。

cert-manager 中有一个名为 ingress-shim 的组件,它监视 Ingress 资源并在出现某些注释时自动为您创建 Certificate 对象。这样,您甚至不需要自己创建 Certificate 对象。

请检查您的入口定义以获取相应的 cert-manager.io 范围注释,并使用这些或手动创建的证书。我假设您在入口定义中引用了名为 blog-app-crtsecret。如果您不使用自动创建,这需要与证书规范中定义的内容相匹配 secretName

有关自动创建证书的详细信息,请查看 ingress 上的证书管理器文档:https://cert-manager.io/docs/usage/ingress/

你的情况:

  1. 注释 cert-manager.io/cluster-issuer 告诉 Ingress 为您的主机生成证书 (Ingress 配置上的注释在后台起着重要作用).
  2. 带有 kind: Certificate 的证书配置也告诉您为您的主机生成证书。

您可以在您的配置中选择其中之一。

最适合您的方法是删除 kind: Certificate 配置。

我们什么时候删除注释并使用证书?

例如,您有 a.host.comb.host.comc.host.com 并且想要生成单个证书并在多个地方使用它,即在 Ingress 或其他 TCP SSL 中配置。