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-watcher viene visualizzato il seguente messaggio di errore:

{"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
The apigee-serving-cert is not found Se apigee-serving-cert non viene trovato nello spazio dei nomi apigee-system, potrebbe verificarsi questo problema.
Sono state create richieste di certificato duplicate per il rinnovo di apigee-serving-cert Se sono state create richieste di certificato duplicate per il rinnovo del certificato apigee-serving-cert, il certificato apigee-serving-cert potrebbe non essere rinnovato.
cert-manager non è in stato integro Se cert-manager non è integro, il certificato apigee-serving-cert potrebbe non essere rinnovato.

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

Diagnosi

  1. Controlla 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, dovrebbe essere visualizzato 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. Aggiorna apigee-serving-cert utilizzando Helm:
    helm upgrade ENV_NAME apigee-env/ \
      --namespace APIGEE_NAMESPACE \
      --set env=ENV_NAME \
      --atomic \
      -f OVERRIDES_FILE

    Assicurati di includere tutte le impostazioni mostrate, inclusa --atomic in modo che l'azione venga annullata in caso di errore.

  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 duplicati 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 output di esempio:

    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"

    Output di esempio:

    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"

    Se visualizzi uno dei messaggi mostrati sopra, i certificati apigee-serving-cert e apigee-istiod-cert non verranno rinnovati.

  2. Elenca tutte le richieste di certificato nello spazio dei nomi apigee-system o apigee a seconda dello spazio dei nomi stampato nelle voci di log precedenti e verifica se sono state create più richieste di certificato per rinnovare le stesse revisioni del certificato apigee-serving-cert o apigee-istiod-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 certificati 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 nello spazio dei nomi 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 output di esempio:

    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. Il cert-manager può non riuscire per diversi motivi. Controlla i log di cert-manager e 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 riscontrati. Consulta la sezione Risoluzione dei problemi relativi ai cluster.
  2. Consulta la sezione Risoluzione dei problemi per ulteriori informazioni sulla risoluzione dei problemi relativi a cert-manager.

Deve raccogliere informazioni diagnostiche

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

  1. Google Cloud ID progetto
  2. Organizzazione Apigee hybrid
  3. file overrides.yaml di Apigee hybrid, mascherando eventuali 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 di 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/*