【问题标题】:Is the annotation cert-manager.io/cluster-issuer: acme-issuer enough to generate a TLS certificate?注解 cert-manager.io/cluster-issuer: acme-issuer 是否足以生成 TLS 证书?
【发布时间】:2020-01-14 14:26:39
【问题描述】:

来自cert-manager 文档:将注释cert-manager.io/cluster-issuer: acme-issuer 添加到Ingress 对象应触发填充程序,向此颁发者请求证书,并存储证书(没有任何命名空间?)(使用哪个名称?) .

我试过了,它什么也没做。在 Ingress 的 yaml 定义中添加 tls: 部分会触发 shim,请求证书并将其存储在与 Ingress 相同的命名空间中。

这意味着文档不正确,或者如果没有tls: 部分,它真的可以工作吗?

apiVersion: cert-manager.io/v1alpha2
kind: ClusterIssuer
metadata:
  name: acme-issuer
spec:
  acme:
    email: user@example.com
    server: https://acme-staging-v02.api.letsencrypt.org/directory
    privateKeySecretRef:
      name: example-issuer-account-key
    solvers:
    - http01:
        ingress:
          class: nginx
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  annotations:
    cert-manager.io/cluster-issuer: acme-issuer
    kubernetes.io/ingress.class: nginx
  name: my-ingress-name
  namespace: mynamespace
spec:
  rules:
  - host: some.domain.eu
    http:
      paths:
      - backend:
          serviceName: my-service-name
          servicePort: 5000
        path: /
  tls:
  - hosts:
    - some.domain.eu
    secretName: secret-storage-key-for-tls-cert

【问题讨论】:

    标签: kubernetes cert-manager


    【解决方案1】:

    如果您正确创建了颁发者,那么您需要创建一个证书,以便颁发者可以使用您在证书资源中的信息颁发证书,并填充密钥:

    apiVersion: cert-manager.io/v1alpha2
    kind: Certificate
    metadata:
      name: certname
    spec:
      secretName: secretName
      issuerRef:
        name: letsencrypt-prod
      commonName: <the CN>
      dnsNames:
      - <name>
    
    

    一旦你有了这个资源,它应该创建一个包含 TLS 证书的秘密,并将它存储在secretName

    【讨论】:

    • 这个想法是使用 shim 自动创建证书。不要手动创建它们。这是你的建议吗?
    • 证书资源提供了创建实际证书的参数。颁发者如何在不知道 CN 和 dns 名称的情况下创建证书?
    • Ingress 确实指定了 dns 名称(规则中的主机)。 CN 可能已由注释或设置指定,但似乎没有关于它的信息。因此 Shim 无法生成此类证书,您必须手动创建它们。这回答了我的问题。 Ty 澄清一下。
    • 如果有办法自动创建证书,我不知道。不过,这很好用,尤其是如果您使用它来管理证书,而不仅仅是 letencrypt tls。我有一个 ca 授权管理多个后端证书以及前端 tls 证书,并且拥有一个单独的证书资源会有所帮助。
    • 入口 shim 自动从带有特定注释的入口创建证书(根据我的问题,还有 tls 部分)。这确实工作正常。 docs.cert-manager.io/en/release-0.7/tasks/issuing-certificates/…
    【解决方案2】:

    我和你一样使用,这创建了我的 TLS ok。但是privateKeySecretRef 的名称是igual ClusterIssuer 名称。 ingress 需要 tls 部分。

    使用:

    apiVersion: cert-manager.io/v1alpha2
    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: my@email.com
        privateKeySecretRef:
          name: letsencrypt-prod
        # Enable the HTTP-01 challenge provider
        solvers:
          - http01:
              ingress:
                class: nginx
    

    检查要调试的证书状态:

    kubectl get certificate -o wide
    

    如果状态为CertificateRequest

    kubectl get CertificateRequest -o wide
    

    【讨论】:

    • 我不确定我是否理解。
    【解决方案3】:

    我不知道您是否解决了您的问题,但请尝试检查以下内容:

    • 检查您的 ingressClass 是否确实是 nginx (kubectl get ingressClass)
    • 如果您只使用一个 ingressClass 并且集群上没有安装其他 ingress-controller,则可能不需要指定类名
    • 另外,您使用的是哪个版本的证书管理器?我知道注释已更改,因此如果您有一个非常老的证书管理器,注释可能不是正确的。
    • 创建入口后,检查是否为 HTTP01 质询验证创建了 acme-pod 和入口,并检查 certificateCertificateRequestOrderChallenge 的状态(例如: kubectl describe certificate &lt;your_certificate_object&gt;)
    • 还要检查 cert-manager 日志,看看是否有任何其他问题发生。

    【讨论】:

      猜你喜欢
      • 2021-09-27
      • 2017-11-14
      • 2019-06-28
      • 1970-01-01
      • 1970-01-01
      • 2020-06-07
      • 1970-01-01
      • 1970-01-01
      • 2017-12-18
      相关资源
      最近更新 更多