apigee-serving-cert が見つからないか期限切れになっているため、API プロキシのデプロイに失敗する

現在、ApigeeApigee ハイブリッドのドキュメントを表示しています。
Apigee Edge ドキュメントを表示する

症状

API プロキシのデプロイが失敗し、次のエラー メッセージが表示されます。

エラー メッセージ

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 Namespace に 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 Namespace での 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-serving-cert 証明書が apigee-system Namespace で見つからない場合、それが原因でこの問題が発生している可能性があります。

解決策

  1. apigee-serving-cert は、Apigee ハイブリッドのインストール時に apigeectl init コマンドによって作成されます。したがって、関連する overrides.yaml ファイルでそのコマンドを実行し、再作成します:
    apigeectl init -f overrides/overrides.yaml
  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"

    このようなエラー メッセージが表示された場合、apigee-serving-cert 証明書は更新されません。

  2. apigee-system Namespace のすべての証明書リクエストを一覧表示して、同じ apigee-serving-cert 証明書リビジョンを更新するために複数の証明書リクエストが作成されているかどうかを確認します:
    kubectl -n apigee-system get certificaterequests

この問題に関連する cert-manager の問題については、cert-manager が同じ証明書リビジョンを持つ複数の CertificateRequest オブジェクトを作成したをご覧ください。

解決策

  1. apigee-system Namespace のすべての証明書リクエストを削除します:
    kubectl -n apigee-system delete certificaterequests --all
  2. 重複する証明書リクエストが削除され、apigee-system Namespace の apigee-serving-cert 証明書で使用できる証明書リクエストが 1 つだけであることを確認します:
    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 Namespace の cert-manager Pod の正常性を確認します:
    kubectl -n cert-manager get pods

    cert-manager Pod が正常であれば、すべての cert-manager Pod が準備完了 (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 カスタマーケアに連絡してください。

  1. Google Cloud プロジェクト ID
  2. Apigee ハイブリッド組織
  3. Apigee ハイブリッド overrides.yaml ファイル。機密情報をマスキングします。
  4. すべての Namespace の 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/*