I deployment del proxy API non vanno a buon fine con il certificato apigee-serving-cert non trovato o scaduto

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

Sintomi

I deployment del proxy API non riescono con i messaggi di errore indicati di seguito.

Messaggi di errore

Se il certificato TLS del servizio apigee-webhook-service.apigee-system.svc è scaduto o non è ancora valido, nei log apigee-watcher verrà 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
Apigee-serving-cert non trovato 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 esistono richieste di certificato duplicate per il rinnovo del certificato apigee-serving-cert, il certificato apigee-serving-cert potrebbe non essere rinnovato.
cert-manager non è 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, potrebbe essere questa la causa del problema.

Risoluzione

  1. apigee-serving-cert viene creato dal comando apigeectl init durante l'installazione di Apigee hybrid. Quindi, 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 certificato 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 cert-manager pod:

    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"

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

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

  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

Controlla il problema cert-manager pertinente a questo problema nella pagina cert-manager ha creato più oggetti CertificateRequest con la stessa revisione dei certificati.

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 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 l'integrità 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 devono essere pronti (1/1) e in stato Running. Altrimenti, questo potrebbe essere il motivo di questo 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 log cert-manager e identifica il motivo dell'errore e risolvili di conseguenza.

    Un motivo noto è che cert-manager non riuscirà 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 gli eventuali problemi rilevati. Consulta la pagina relativa alla risoluzione dei problemi dei cluster.
  2. Per ulteriori informazioni sulla risoluzione dei problemi di cert-manager, consulta la sezione Risoluzione dei problemi.

Deve raccogliere dati diagnostici

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

  1. ID progetto Google Cloud
  2. Organizzazione ibrida Apigee
  3. File overrides.yaml ibrido Apigee, che maschera eventuali informazioni sensibili.
  4. Stato dei 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/*