新消息:在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

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 憑證