最新:在TwitterMastodon

故障排除

在本节中,您将学习故障排除技术,这些技术将帮助您找到证书无法颁发或续订的根本原因。

本节还包括以下指南

概述

在对 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 certificate
NAME READY AGE
example-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:22Z
Message: Issuing certificate as Secret does not exist
Reason: DoesNotExist
Status: False
Type: Ready
Next Private Key Secret Name: example-tls-wtlww
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Issuing 105s cert-manager Issuing certificate as Secret does not exist
Normal 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/v1
Kind: CertificateRequest
Spec:
Request: [...]
Issuer Ref:
Group: cert-manager.io
Kind: ClusterIssuer
Name: letencrypt-production
Status:
Conditions:
Last Transition Time: 2020-05-15T21:45:36Z
Message: Waiting on certificate issuance from order example-tls-fqtfg-1165244518: "pending"
Reason: Pending
Status: False
Type: Ready
Events:
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 个额外的资源:OrdersChallenges。在 ACME 证书发行故障排除 中介绍了这些资源的故障排除。