疑難排解
在本節中,您將學習疑難排解技巧,以協助您找出憑證無法簽發或續簽的根本原因。
本節還包括以下指南
- 排解 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
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 憑證。