API Proxy 部署失敗,因為找不到或已過期的 apigee-serving-cert

您正在查看 ApigeeApigee Hybrid 說明文件。
查看 Apigee Edge 說明文件。

問題

API Proxy 部署失敗,並顯示下列錯誤訊息。

錯誤訊息

如果 apigee-webhook-service.apigee-system.svc 服務的 TLS 憑證已過期或尚未生效,apigee-watcher 記錄會顯示下列錯誤訊息:

{"level":"error","ts":1687991930.7745812,"caller":"watcher/watcher.go:60",
"msg":"error during watch","name":"ingress","error":"INTERNAL: INTERNAL: failed
to update ApigeeRoute [org-env]-group-84a6bb5, namespace apigee:
Internal error occurred: failed calling webhook
\"mapigeeroute.apigee.cloud.google.com\": Post
\"https://apigee-webhook-service.apigee-system.svc:443/mutate-apigee-cloud-google-com-v1alpha1-apigeeroute?timeout=30s\":
x509:
certificate has expired or is not yet valid: current time
2023-06-28T22:38:50Z is after 2023-06-17T17:14:13Z, INTERNAL: failed to update
ApigeeRoute [org-env]-group-e7b3ff6, namespace apigee 

可能的原因

原因 說明
找不到 apigee-serving-cert 如果在 apigee-system 命名空間中找不到 apigee-serving-cert,就可能發生這個問題。
為續訂 apigee-serving-cert 而建立重複的憑證要求 如果為續購 apigee-serving-cert 憑證而建立重複的憑證要求,apigee-serving-cert 憑證可能無法續購。
cert-manager 健康狀態不佳 如果 cert-manager 處於不健康狀態,apigee-serving-cert 憑證可能無法續約。

原因:找不到 apigee-serving-cert

診斷

  1. 檢查 apigee-system 命名空間中是否有 apigee-serving-cert 憑證:

    kubectl -n apigee-system get certificates apigee-serving-cert
    

    如果這個憑證可用,您應該會看到類似以下的輸出內容:

    NAME                  READY   SECRET                AGE
    apigee-serving-cert   True    webhook-server-cert   2d10h
  2. 如果在 apigee-system 命名空間中找不到 apigee-serving-cert 憑證,可能是這個問題的原因。

解決方法

  1. 使用 Helm 更新 apigee-serving-cert
    helm upgrade ENV_NAME apigee-env/ \
      --namespace APIGEE_NAMESPACE \
      --set env=ENV_NAME \
      --atomic \
      -f OVERRIDES_FILE

    請務必加入所有顯示的設定,包括 --atomic

  2. 確認已建立 apigee-serving-cert 憑證:
    kubectl -n apigee-system get certificates apigee-serving-cert

原因:為續訂 apigee-serving-cert 而建立重複的憑證要求

診斷

  1. 檢查 cert-manager 控制器記錄,看看是否傳回類似以下的錯誤訊息。

    列出所有 cert-manager Pod:

    kubectl -n cert-manager get pods

    輸出內容範例:

    NAME                                       READY   STATUS    RESTARTS        AGE
    cert-manager-66d9545484-772cr              1/1     Running   0               6d19h
    cert-manager-cainjector-7d8b6bd6fb-fpz6r   1/1     Running   0               6d19h
    cert-manager-webhook-669b96dcfd-6mnm2      1/1     Running   0               6d19h

    檢查 cert-manager 控制器記錄:

    kubectl -n cert-manager logs cert-manager-66d9545484-772cr | grep "issuance is skipped until there are no more duplicates"

    輸出內容範例:

    1 controller.go:163] cert-manager/certificates-readiness "msg"="re-queuing item due to error processing" "error"="multiple CertificateRequests were found for the 'next' revision 3, issuance is skipped until there are no more duplicates" "key"="apigee-system/apigee-serving-cert"
    1 controller.go:167] cert-manager/certificates-readiness "msg"="re-queuing item due to error processing" "error"="multiple CertificateRequests were found for the 'next' revision 683, issuance is skipped until there are no more duplicates" "key"="apigee/apigee-istiod"

    如果您看到上述任一訊息,系統就不會續約 apigee-serving-certapigee-istiod-cert 憑證。

  2. 請根據上述記錄項目中顯示的命名空間,列出 apigee-system 命名空間或 apigee 命名空間中的所有憑證要求,並檢查是否有為續訂相同 apigee-serving-certapigee-istiod-cert 憑證修訂版本而建立多個憑證要求:
    kubectl -n apigee-system get certificaterequests

請參閱與此問題相關的 cert-manager 問題,請見 cert-manager 使用相同的憑證修訂版本建立多個 CertificateRequest 物件

解決方法

  1. 刪除 apigee-system 命名空間中的所有憑證要求:
    kubectl -n apigee-system delete certificaterequests --all
  2. 確認已刪除重複的憑證要求,且 apigee-system 命名空間中 apigee-serving-cert 憑證只有一個憑證要求:
    kubectl -n apigee-system get certificaterequests
  3. 確認 apigee-serving-cert 憑證已更新:
    kubectl -n apigee-system get certificates apigee-serving-cert -o yaml

    輸出內容範例:

    apiVersion: cert-manager.io/v1
    kind: Certificate
    metadata:
      creationTimestamp: "2023-06-26T13:25:10Z"
      generation: 1
      name: apigee-serving-cert
      namespace: apigee-system
      resourceVersion: "11053"
      uid: e7718341-b3ca-4c93-a6d4-30cf70a33e2b
    spec:
      dnsNames:
      - apigee-webhook-service.apigee-system.svc
      - apigee-webhook-service.apigee-system.svc.cluster.local
      issuerRef:
        kind: Issuer
        name: apigee-selfsigned-issuer
      secretName: webhook-server-cert
    status:
      conditions:
      - lastTransitionTime: "2023-06-26T13:25:11Z"
        message: Certificate is up to date and has not expired
        observedGeneration: 1
        reason: Ready
        status: "True"
        type: Ready
      notAfter: "2023-09-24T13:25:11Z"
      notBefore: "2023-06-26T13:25:11Z"
      renewalTime: "2023-08-25T13:25:11Z"
      revision: 1

原因:cert-manager 的健康狀態不佳

診斷

  1. 檢查 cert-manager 命名空間中 cert-manager pod 的健康狀態:
    kubectl -n cert-manager get pods

    如果 cert-manager 容器運作正常,所有 cert-manager 容器都應處於 (1/1) 狀態,並處於 Running 狀態,否則可能會發生以下問題:

    NAME                                       READY   STATUS    RESTARTS   AGE
    cert-manager-59cf78f685-mlkvx              1/1     Running   0          15d
    cert-manager-cainjector-78cc865768-krjcp   1/1     Running   0          15d
    cert-manager-webhook-77c4fb46b6-7g9g6      1/1     Running   0          15d
  2. cert-manager 可能會因為許多原因而失敗,請檢查 cert-manager 記錄檔,找出失敗原因並加以解決。

    其中一個已知原因是,如果 cert-manager 無法與 Kubernetes API 通訊,就會失敗。在這種情況下,系統會顯示類似以下的錯誤訊息:

    E0601 00:10:27.841516       1 leaderelection.go:330] error retrieving
    resource lock kube-system/cert-manager-controller: Get
    "https://192.168.0.1:443/api/v1/namespaces/kube-system/configmaps/cert-manager-controller":
    dial tcp 192.168.0.1:443: i/o timeout

解決方法

  1. 檢查 Kubernetes 叢集的健康狀態,並修正所有發現的問題。請參閱 解決叢集問題
  2. 如需其他 cert-manager 疑難排解資訊,請參閱「 疑難排解」一節。

必須收集診斷資訊

如果問題在您按照上述操作說明後仍未解決,請收集下列診斷資訊,然後與 Google Cloud Customer Care 團隊聯絡。

  1. Google Cloud 專案 ID
  2. Apigee Hybrid 機構
  3. Apigee Hybrid overrides.yaml 檔案,遮蓋任何機密資訊。
  4. 所有命名空間中的 Kubernetes Pod 狀態:
    kubectl get pods -A > kubectl-pod-status`date +%Y.%m.%d_%H.%M.%S`.txt
  5. Kubernetes cluster-info 傾印:
    # generate kubernetes cluster-info dump
    kubectl cluster-info dump -A --output-directory=/tmp/kubectl-cluster-info-dump
    # zip kubernetes cluster-info dump
    zip -r kubectl-cluster-info-dump`date +%Y.%m.%d_%H.%M.%S`.zip /tmp/kubectl-cluster-info-dump/*