故障排除
在本节中,您将学习故障排除技术,这些技术将帮助您找到证书无法颁发或续订的根本原因。
本节还包括以下指南
- ACME / Let's Encrypt 证书故障排除: 了解有关 ACME 发行者的工作原理以及如何诊断其问题。
- Webhook 故障排除: 了解如何诊断 cert-manager webhook 的问题。
概述
在对 cert-manager 进行故障排除时,您的最佳助手是 kubectl describe
,它将提供有关资源以及最近事件的信息。不建议使用日志,因为日志非常详细,只有在以下步骤无法提供帮助时才应查看。
cert-manager 包含多个驻留在 Kubernetes 集群内的自定义资源,这些资源相互关联,并且通常由彼此创建。当发生此类事件时,它将在 Kubernetes 事件中反映出来,您可以使用 kubectl get event
查看每个命名空间,或者在查看单个资源时使用 kubectl describe
的输出查看。
证书请求失败的故障排除
有几个资源参与证书请求。
( +---------+ )( | Ingress | ) Optional ACME Only!( +---------+ )| || +-------------+ +--------------------+ | +-------+ +-----------+|-> | Certificate |----> | CertificateRequest | ----> | | Order | ----> | Challenge |+-------------+ +--------------------+ | +-------+ +-----------+|
cert-manager 的流程从 Certificate
资源开始,您可以自己创建它,或者如果您设置了 正确的注释,则您的 Ingress 资源会为您创建它。
1. 检查 Certificate 资源
首先,我们必须检查我们的命名空间中是否创建了 Certificate
资源。我们可以使用 kubectl get certificate
获取它们。
$ kubectl get certificateNAME READY AGEexample-com-tls False 1h
如果未找到,并且您计划使用 ingress-shim:请检查 ingress 注释,有关该注释的更多信息在 ingress 故障排除指南 中。如果您没有使用 ingress-shim:请检查您用来创建证书的命令的输出。
如果您看到一个状态为 False
的资源,您可以使用 kubectl describe certificate
获取更多信息,如果状态为 True
,则表示 cert-manager 已成功颁发证书。
$ kubectl describe certificate <certificate-name>[...]Status:Conditions:Last Transition Time: 2020-05-15T21:45:22ZMessage: Issuing certificate as Secret does not existReason: DoesNotExistStatus: FalseType: ReadyNext Private Key Secret Name: example-tls-wtlwwEvents:Type Reason Age From Message---- ------ ---- ---- -------Normal Issuing 105s cert-manager Issuing certificate as Secret does not existNormal Generated 105s cert-manager Stored new private key in temporary Secret resource "example-tls-wtlww"Normal Requested 104s cert-manager Created new CertificateRequest resource "example-tls-bw5t9"
在这里,您将在 Status
下找到有关当前证书状态的更多信息,以及在 Events
下有关其发生情况的详细信息。两者都将帮助您确定证书的当前状态。最后一个状态是 Created new CertificateRequest resource
,值得查看一下 CertificateRequest
处于什么状态,以便获得更多有关为什么我们的 Certificate
未被颁发的信息。
2. 检查 CertificateRequest
The CertificateRequest
资源表示 cert-manager 中的 CSR,并将此 CSR 传递给发行者。您可以在 Certificate
事件日志中找到 CertificateRequest
的名称,或者使用 kubectl get certificaterequest
。
要获得更多信息,我们再次运行 kubectl describe
。
$ kubectl describe certificaterequest <CertificateRequest name>API Version: cert-manager.io/v1Kind: CertificateRequestSpec:Request: [...]Issuer Ref:Group: cert-manager.ioKind: ClusterIssuerName: letencrypt-productionStatus:Conditions:Last Transition Time: 2020-05-15T21:45:36ZMessage: Waiting on certificate issuance from order example-tls-fqtfg-1165244518: "pending"Reason: PendingStatus: FalseType: ReadyEvents:Type Reason Age From Message---- ------ ---- ---- -------Normal OrderCreated 8m20s cert-manager Created Order resource example-tls-fqtfg-1165244518
在这里,我们将看到有关发行者配置以及发行者响应的任何问题。
3. 检查发行者状态
如果在以上步骤中您看到发行者未就绪错误,您可以对(集群)发行者资源重复上述步骤。
$ kubectl describe issuer <Issuer name>$ kubectl describe clusterissuer <ClusterIssuer name>
这些步骤将允许您获取有关与您的发行者的帐户或网络问题的任何错误消息。在 ACME 证书发行故障排除 中详细介绍了 ACME 发行者的故障排除。
4. ACME 故障排除
ACME(例如 Let's Encrypt)发行者在 cert-manager 中有 2 个额外的资源:Orders
和 Challenges
。在 ACME 证书发行故障排除 中介绍了这些资源的故障排除。