I deployment di proxy API non riescono perché il certificato apigee-serving non viene trovato o è scaduto

Stai visualizzando la documentazione di Apigee e Apigee hybrid.
Visualizza la documentazione di Apigee Edge.

Sintomi

I deployment dei proxy API non riescono con i seguenti messaggi di errore.

Messaggi di errore

Se il certificato TLS del servizio apigee-webhook-service.apigee-system.svc è scaduto o non è ancora valido, nei log di apigee-webhook-service.apigee-system.svc viene visualizzato il seguente messaggio di errore: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 

Possibili cause

Causa Descrizione
Il file apigee-serving-cert non è stato trovato Se apigee-serving-cert non viene trovato nel namespaces apigee-system, potrebbe verificarsi questo problema.
Sono state create richieste di certificati duplicate per il rinnovo di apigee-serving-cert Se sono state create richieste di certificati duplicate per il rinnovo del apigee-serving-cert certificato, il apigee-serving-cert certificato potrebbe non essere rinnovato.
cert-manager non è in stato integro Se cert-manager non è in stato di salute, il certificato apigee-serving-cert potrebbe non essere rinnovato.

Causa: il file apigee-serving-cert non è stato trovato

Diagnosi

  1. Verifica la disponibilità del certificato apigee-serving-cert nello spazio dei nomi apigee-system:

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

    Se questo certificato è disponibile, dovresti vedere un output simile al seguente:

    NAME                  READY   SECRET                AGE
    apigee-serving-cert   True    webhook-server-cert   2d10h
  2. Se il certificato apigee-serving-cert non viene trovato nello spazio dei nomi apigee-system, questo potrebbe essere il motivo del problema.

Risoluzione

  1. apigee-serving-cert viene creato dal comando apigeectl init durante l'installazione di Apigee hybrid. Pertanto, esegui il comando con il file overrides.yaml pertinente per ricrearlo:
    apigeectl init -f overrides/overrides.yaml
  2. Verifica che il certificato apigee-serving-cert sia stato creato:
    kubectl -n apigee-system get certificates apigee-serving-cert

Causa: sono state create richieste di certificati duplicate per il rinnovo di apigee-serving-cert

Diagnosi

  1. Controlla i log del controller cert-manager e verifica se è stato restituito un messaggio di errore simile al seguente.

    Elenca tutti i pod cert-manager:

    kubectl -n cert-manager get pods

    Un esempio di 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

    Controlla i log del controller cert-manager:

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

    Un esempio di 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"

    Se viene visualizzato un messaggio di errore simile a questo, il rinnovo del certificato apigee-serving-cert verrà impedito.

  2. Elenca tutte le richieste di certificato nello spazio dei nomi apigee-system e controlla se sono state create più richieste di certificato per il rinnovo della stessa revisione del certificato apigee-serving-cert:
    kubectl -n apigee-system get certificaterequests

Consulta il problema cert-manager pertinente a questo problema all'indirizzo cert-manager ha creato più oggetti CertificateRequest con la stessa revisione del certificato.

Risoluzione

  1. Elimina tutte le richieste di certificato nello spazio dei nomi apigee-system:
    kubectl -n apigee-system delete certificaterequests --all
  2. Verifica che le richieste di certificati duplicate siano state eliminate e che sia disponibile una sola richiesta di certificato per il certificato apigee-serving-cert nel namespace apigee-system:
    kubectl -n apigee-system get certificaterequests
  3. Verifica che il certificato apigee-serving-cert sia stato rinnovato:
    kubectl -n apigee-system get certificates apigee-serving-cert -o yaml

    Un esempio di 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

Causa: cert-manager non è integro

Diagnosi

  1. Controlla lo stato dei pod cert-manager nello spazio dei nomi cert-manager:
    kubectl -n cert-manager get pods

    Se i pod cert-manager sono integri, tutti i pod cert-manager dovrebbero essere pronti (1/1) e nello stato Running, altrimenti questo potrebbe essere il motivo del problema:

    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. L'cert-manager può non riuscire per diversi motivi. Controlla i logcert-manager, identifica il motivo dell'errore e risolvilo di conseguenza.

    Un motivo noto è che cert-manager non andrà a buon fine se non riesce a comunicare con l'API Kubernetes. In questo caso, viene visualizzato un messaggio di errore simile al seguente:

    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

Risoluzione

  1. Controlla l'integrità del cluster Kubernetes e risolvi eventuali problemi rilevati. Consulta la sezione Risoluzione dei problemi relativi ai cluster.
  2. Per ulteriori informazioni sulla risoluzione dei problemi, consulta la sezione Risoluzione dei problemi.cert-manager

Deve raccogliere informazioni di diagnostica

Se il problema persiste anche dopo aver seguito le istruzioni riportate sopra, raccogli le seguenti informazioni di diagnostica, quindi contatta l'assistenza clienti Google Cloud.

  1. ID progetto Google Cloud
  2. Organizzazione Apigee hybrid
  3. File overrides.yaml di Apigee hybrid, che maschera le informazioni sensibili.
  4. Stato del pod Kubernetes in tutti gli spazi dei nomi:
    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/*