Guida alla risoluzione dei problemi di Cassandra

Questo argomento illustra i passaggi che puoi seguire per risolvere i problemi relativi al datastore Cassandra. Cassandra è un datastore permanente in esecuzione nel componente cassandra dell' architettura di runtime ibrida. Vedi anche Panoramica della configurazione del servizio di runtime.

I pod Cassandra sono bloccati nello stato In attesa

Sintomo

All'avvio, i pod Cassandra rimangono nello stato Pending (In attesa).

Messaggio di errore

Quando utilizzi kubectl per visualizzare gli stati dei pod, vedi che uno o più I pod Cassandra sono bloccati nello stato Pending. Lo stato Pending indica che Kubernetes non è in grado di pianificare il pod su un nodo: il pod non può essere creato. Ad esempio:

kubectl get pods -n namespace

NAME                                     READY   STATUS      RESTARTS   AGE
adah-resources-install-4762w             0/4     Completed   0          10m
apigee-cassandra-default-0                       0/1     Pending     0          10m
...

Cause possibili

Un pod bloccato nello stato In attesa può avere più cause. Ad esempio:

Causa Descrizione
Risorse insufficienti La CPU o la memoria disponibili non sono sufficienti per creare il pod.
Volume non creato Il pod è in attesa della creazione del volume permanente.

Diagnosi

Utilizza kubectl per descrivere il pod al fine di determinare l'origine dell'errore. Ad esempio:

kubectl -n namespace describe pods pod_name

Ad esempio:

kubectl -n apigee describe pods apigee-cassandra-default-0

L'output potrebbe mostrare uno di questi possibili problemi:

  • Se il problema è costituito da risorse insufficienti, verrà visualizzato un messaggio di avviso che indica CPU o memoria insufficiente.
  • Se il messaggio di errore indica che il pod ha oggetti PersistentVolumeClaim (PVC) immediati non associati, significa che il pod non è in grado di creare i suoi Volume permanente.

Risoluzione

Risorse insufficienti

Modifica il pool di nodi Cassandra in modo che disponga di risorse di CPU e memoria sufficienti. Per ulteriori dettagli, consulta la sezione Ridimensionare un pool di nodi.

Volume permanente non creato

Se rilevi un problema con il volume permanente, descrivi il PersistentVolumeClaim (PVC) per determinare perché non viene creato:

  1. Elenca le PVC nel cluster:
    kubectl -n namespace get pvc
    
    NAME                                STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   AGE
    cassandra-data-apigee-cassandra-default-0   Bound    pvc-b247faae-0a2b-11ea-867b-42010a80006e   10Gi       RWO            standard       15m
    ...
  2. Descrivi la PVC del pod che presenta errori. Ad esempio, il seguente comando descrive la PVC associata al pod apigee-cassandra-default-0:
    kubectl apigee describe pvc cassandra-data-apigee-cassandra-default-0
    
    Events:
      Type     Reason              Age                From                         Message
      ----     ------              ----               ----                         -------
      Warning  ProvisioningFailed  3m (x143 over 5h)  persistentvolume-controller  storageclass.storage.k8s.io "apigee-sc" not found

    Tieni presente che in questo esempio non esiste un oggetto StorageClass denominato apigee-sc. Per risolvere il problema, crea la risorsa StorageClass mancante nel cluster, come spiegato in Modificare la risorsa StorageClass predefinita.

Vedi anche Eseguire il debug dei pod.

I pod Cassandra sono bloccati nello stato CrashLoopBackoff

Sintomo

All'avvio, i pod Cassandra rimangono in stato CrashLoopBackoff.

Messaggio di errore

Quando utilizzi kubectl per visualizzare gli stati dei pod, noti che uno o più pod Cassandra sono nello stato CrashLoopBackoff. Questo stato indica che Kubernetes non è in grado di creare il pod. Ad esempio:

kubectl get pods -n namespace

NAME                                     READY   STATUS            RESTARTS   AGE
adah-resources-install-4762w             0/4     Completed         0          10m
apigee-cassandra-default-0                       0/1     CrashLoopBackoff           0          10m
...

Cause possibili

Un pod bloccato nello stato CrashLoopBackoff può avere diverse cause. Ad esempio:

Causa Descrizione
Il data center è diverso da quello precedente Questo errore indica che il pod Cassandra ha un volume permanente con dati di una e i nuovi pod non potranno unirsi al cluster precedente. Questo accade in genere quando i volumi permanenti non aggiornati persistono dal cluster Cassandra precedente sullo stesso nodo Kubernetes. Questo problema può verificarsi se elimini e ricrei Cassandra nel cluster.
Directory dell'archivio attendibilità non trovata Questo errore indica che il pod Cassandra non è in grado di creare una connessione TLS. Questo accade in genere quando le chiavi e i certificati forniti non sono validi, mancano o presentano altri problemi.

Diagnosi

Controlla il log degli errori di Cassandra per determinare la causa del problema.

  1. Elenca i pod per ottenere l'ID del pod Cassandra in errore:
    kubectl get pods -n namespace
  2. Controlla il log del pod con problemi:
    kubectl logs pod_id -n namespace

Risoluzione

Cerca i seguenti indizi nel log del pod:

Il data center è diverso da quello precedente

Se viene visualizzato questo messaggio di log:

Cannot start node if snitch's data center (us-east1) differs from previous data center
  • Controlla se nel cluster sono presenti PVC obsoleti o non aggiornati ed eliminali.
  • Se si tratta di una nuova installazione, elimina tutte le PVC e riprova a eseguire la configurazione. Ad esempio:
    kubectl -n namespace get pvc
    kubectl -n namespace delete pvc cassandra-data-apigee-cassandra-default-0

Directory dell'archivio attendibilità non trovata

Se viene visualizzato questo messaggio di log:

Caused by: java.io.FileNotFoundException: /apigee/cassandra/ssl/truststore.p12
(No such file or directory)

Verifica che la chiave e i certificati, se forniti nel file degli override, siano corretti e validi. Per esempio:

cassandra:
  sslRootCAPath: path_to_root_ca-file
  sslCertPath: path-to-tls-cert-file
  sslKeyPath: path-to-tls-key-file

Errore del nodo

Sintomo

All'avvio, i pod Cassandra rimangono nello stato Pending. Questo può indicare un errore del nodo sottostante.

Diagnosi

  1. Determina quali pod Cassandra non sono in esecuzione:
    $ kubectl get pods -n your_namespace
        NAME          READY   STATUS    RESTARTS   AGE
        cassandra-default-0   0/1     Pending   0          13s
        cassandra-default-1   1/1     Running   0          8d
        cassandra-default-2   1/1     Running   0          8d
  2. Controlla i nodi worker. Se uno è nello stato NotReady, si tratta del nodo che ha riscontrato un errore:
    kubectl get nodes -n your_namespace
    NAME                          STATUS   ROLES    AGE   VERSION
    ip-10-30-1-190.ec2.internal   Ready    <none>   8d    v1.13.2
    ip-10-30-1-22.ec2.internal    Ready    master   8d    v1.13.2
    ip-10-30-1-36.ec2.internal    NotReady <none>   8d    v1.13.2
    ip-10-30-2-214.ec2.internal   Ready    <none>   8d    v1.13.2
    ip-10-30-2-252.ec2.internal   Ready    <none>   8d    v1.13.2
    ip-10-30-2-47.ec2.internal    Ready    <none>   8d    v1.13.2
    ip-10-30-3-11.ec2.internal    Ready    <none>   8d    v1.13.2
    ip-10-30-3-152.ec2.internal   Ready    <none>   8d    v1.13.2
    ip-10-30-3-5.ec2.internal     Ready    <none>   8d    v1.13.2

Risoluzione

  1. Rimuovi il pod Cassandra inattivo dal cluster.
    $ kubectl exec -it apigee-cassandra-default-0 -- nodetool status
    $ kubectl exec -it apigee-cassandra-default-0 -- nodetool removenode deadnode_hostID
  2. Rimuovi VolumeClaim dal nodo inattivo per evitare del pod Cassandra di non tentare di trovare un nodo inattivo dell'affinità:
    kubectl get pvc -n your_namespace
    kubectl delete pvc volumeClaim_name -n your_namespace
  3. Aggiorna il modello di volume e crea PersistentVolume per il node appena aggiunto. Di seguito è riportato un esempio di modello di volume:
    apiVersion: v1
    kind: PersistentVolume
    metadata:
      name: cassandra-data-3
    spec:
      capacity:
        storage: 100Gi
      accessModes:
      - ReadWriteOnce
      persistentVolumeReclaimPolicy: Retain
      storageClassName: local-storage
      local:
        path: /apigee/data
      nodeAffinity:
        "required":
          "nodeSelectorTerms":
          - "matchExpressions":
            - "key": "kubernetes.io/hostname"
              "operator": "In"
              "values": ["ip-10-30-1-36.ec2.internal"]
  4. Sostituisci i valori con il nuovo nome host/IP e applica il modello:
    kubectl apply -f volume-template.yaml