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 namespaces 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 responsif Jika cert-manager tidak sehat, 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 dapat menjadi alasan masalah ini.

Resolusi

  1. apigee-serving-cert dibuat oleh perintah apigeectl init selama penginstalan Apigee hybrid. Oleh karena itu, jalankan perintah tersebut dengan file overrides.yaml yang relevan untuk membuatnya ulang:
    apigeectl init -f overrides/overrides.yaml
  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"

    Jika pesan error yang mirip dengan ini ditampilkan, hal itu akan mencegah perpanjangan sertifikat apigee-serving-cert.

  2. Cantumkan semua permintaan sertifikat di namespace apigee-system dan periksa untuk melihat apakah ada beberapa permintaan sertifikat yang dibuat untuk memperpanjang revisi sertifikat apigee-serving-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 revisi sertifikat yang sama.

Resolusi

  1. Hapus semua permintaan sertifikat di namespace apigee-system:
    kubectl -n apigee-system delete certificaterequests --all
  2. Pastikan permintaan sertifikat duplikat telah dihapus dan hanya satu permintaan sertifikat yang tersedia 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 status pod cert-manager di namespace cert-manager:
    kubectl -n cert-manager get pods

    Jika pod cert-manager sehat, semua pod cert-manager harus siap (1/1) dan dalam status Running. Jika tidak, hal ini dapat menjadi alasan 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 sesuai kebutuhan.

    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 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 meskipun setelah mengikuti petunjuk di atas, kumpulkan informasi diagnostik berikut, lalu hubungi Layanan Pelanggan Google Cloud.

  1. ID Project Google Cloud
  2. Organisasi Apigee hybrid
  3. File overrides.yaml Apigee hybrid, yang 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/*