Deployment proxy API gagal dengan apigee-serving-cert tidak ditemukan atau habis masa berlakunya

Anda sedang melihat dokumentasi Apigee dan Apigee hybrid.
Lihat dokumentasi Apigee Edge.

Gejala

Deployment proxy API gagal dengan pesan error berikut.

Pesan Error

Jika sertifikat TLS layanan apigee-webhook-service.apigee-system.svc telah habis masa berlakunya atau belum valid, pesan error berikut akan ditampilkan di log 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 

Kemungkinan Penyebab

Penyebab Deskripsi
apigee-serving-cert tidak ditemukan Jika apigee-serving-cert tidak ditemukan di namespace apigee-system, masalah ini dapat terjadi.
Permintaan sertifikat duplikat dibuat untuk memperpanjang apigee-serving-cert Jika ada permintaan sertifikat duplikat yang dibuat untuk memperpanjang sertifikat apigee-serving-cert, sertifikat apigee-serving-cert mungkin tidak diperpanjang.
cert-manager tidak berfungsi dengan baik Jika cert-manager tidak dalam kondisi baik, sertifikat apigee-serving-cert mungkin tidak diperpanjang.

Penyebab: apigee-serving-cert tidak ditemukan

Diagnosis

  1. Periksa ketersediaan sertifikat apigee-serving-cert di namespace apigee-system:

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

    Jika sertifikat ini tersedia, output yang mirip dengan berikut akan terlihat:

    NAME                  READY   SECRET                AGE
    apigee-serving-cert   True    webhook-server-cert   2d10h
  2. Jika sertifikat apigee-serving-cert tidak ditemukan di namespace apigee-system, hal itu bisa menjadi penyebab masalah ini.

Resolusi

  1. Perbarui apigee-serving-cert menggunakan Helm:
    helm upgrade ENV_NAME apigee-env/ \
      --namespace APIGEE_NAMESPACE \
      --set env=ENV_NAME \
      --atomic \
      -f OVERRIDES_FILE

    Pastikan untuk menyertakan semua setelan yang ditampilkan, termasuk --atomic agar tindakan di-roll back jika gagal.

  2. Pastikan sertifikat apigee-serving-cert telah dibuat:
    kubectl -n apigee-system get certificates apigee-serving-cert

Penyebab: Permintaan sertifikat duplikat dibuat untuk memperpanjang apigee-serving-cert

Diagnosis

  1. Periksa log pengontrol cert-manager dan lihat apakah pesan error yang mirip dengan berikut telah ditampilkan.

    Mencantumkan semua pod cert-manager:

    kubectl -n cert-manager get pods

    Contoh output:

    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

    Periksa log pengontrol cert-manager:

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

    Contoh output:

    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"

    Jika Anda melihat salah satu pesan yang ditampilkan di atas, sertifikat apigee-serving-cert dan apigee-istiod-cert tidak akan diperpanjang.

  2. Mencantumkan semua permintaan sertifikat di namespace apigee-system atau namespace apigee bergantung pada namespace yang dicetak dalam entri log di atas dan memeriksa apakah ada beberapa permintaan sertifikat yang dibuat untuk memperpanjang revisi sertifikat apigee-serving-cert atau apigee-istiod-cert yang sama:
    kubectl -n apigee-system get certificaterequests

Lihat masalah cert-manager yang relevan dengan masalah ini di cert-manager membuat beberapa objek CertificateRequest dengan certificate-revision yang sama.

Resolusi

  1. Menghapus semua permintaan sertifikat di namespace apigee-system:
    kubectl -n apigee-system delete certificaterequests --all
  2. Pastikan permintaan sertifikat duplikat telah dihapus dan hanya ada satu permintaan sertifikat untuk sertifikat apigee-serving-cert di namespace apigee-system:
    kubectl -n apigee-system get certificaterequests
  3. Pastikan sertifikat apigee-serving-cert telah diperpanjang:
    kubectl -n apigee-system get certificates apigee-serving-cert -o yaml

    Contoh output:

    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

Penyebab: cert-manager tidak responsif

Diagnosis

  1. Periksa kondisi pod cert-manager di namespace cert-manager:
    kubectl -n cert-manager get pods

    Jika pod cert-manager dalam kondisi baik, semua pod cert-manager harus siap (1/1) dan dalam status Running. Jika tidak, hal tersebut bisa menjadi penyebab masalah ini:

    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 dapat gagal karena berbagai alasan. Periksa log cert-manager dan identifikasi alasan kegagalan, lalu selesaikan masalah tersebut.

    Salah satu alasan yang diketahui adalah cert-manager akan gagal jika tidak dapat berkomunikasi dengan Kubernetes API. Dalam hal ini, pesan error yang mirip dengan berikut ini akan ditampilkan:

    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

Resolusi

  1. Periksa kondisi cluster Kubernetes dan perbaiki masalah yang ditemukan. Lihat Memecahkan Masalah Cluster.
  2. Lihat Pemecahan masalah untuk mengetahui informasi pemecahan masalah cert-manager tambahan.

Harus mengumpulkan informasi diagnostik

Jika masalah berlanjut bahkan setelah mengikuti petunjuk di atas, kumpulkan informasi diagnostik berikut, lalu hubungi Layanan Pelanggan Google Cloud.

  1. Google Cloud Project ID
  2. Organisasi Apigee Hybrid
  3. file Apigee hybrid overrides.yaml, dengan menyamarkan informasi sensitif apa pun.
  4. Status pod Kubernetes di semua namespace:
    kubectl get pods -A > kubectl-pod-status`date +%Y.%m.%d_%H.%M.%S`.txt
  5. Dump cluster-info Kubernetes:
    # 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/*