Guia de solução de problemas do Cassandra

Neste tópico, você verá etapas para resolver e corrigir problemas com o armazenamento de dados do Cassandra. O Cassandra é um armazenamento de dados persistente executado no componente cassandra da arquitetura de ambiente de execução híbrida. Consulte também Visão geral da configuração do serviço de ambiente de execução.

Os pods do Cassandra estão presos no estado pendente

Sintoma

Ao serem iniciados, os pods do Cassandra permanecem no estado Pendente.

Mensagem de erro

Ao usar kubectl para visualizar os estados do pod, você verá que um ou mais pods do Cassandra estão parados no estado Pending. O estado Pending indica que o Kubernetes não pode agendar o pod em um nó: o pod não pode ser criado. Exemplo:

kubectl get pods -n namespace

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

Causas possíveis

Um pod preso no estado pendente pode ter várias causas. Exemplo:

Causa Descrição
Recursos insuficientes Não há CPU ou memória suficiente disponível para criar o pod.
Volume não criado O pod aguarda a criação do volume permanente para ser criado.

Diagnóstico

Use kubectl para descrever o pod a fim de determinar a origem do erro. Exemplo:

kubectl -n namespace describe pods pod_name

Exemplo:

kubectl -n apigee describe pods apigee-cassandra-0

A saída pode mostrar um dos seguintes problemas:

  • Se o problema for recursos insuficientes, você verá uma mensagem de aviso que indica CPU ou memória insuficientes.
  • Se a mensagem de erro indicar que o pod tem PersistentVolumeClaims (PVC) imediatos desvinculados, isso significa que o pod não pode criar o volume permanente dele.

Resolução

Recursos insuficientes

Modifique o pool de nós do Cassandra para que tenha recursos de CPU e memória suficientes. Consulte Como redimensionar um pool de nós para detalhes.

Volume permanente não criado

Se você determinar um problema de volume permanente, descreva o PersistentVolumeClaim (PVC) para determinar por que ele não está sendo criado:

  1. Liste os PVCs no cluster:
    kubectl -n namespace get pvc
    
    NAME                                STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   AGE
    cassandra-data-apigee-cassandra-0   Bound    pvc-b247faae-0a2b-11ea-867b-42010a80006e   10Gi       RWO            standard       15m
    ...
  2. Descreva o PVC para o pod que está falhando. Por exemplo, o comando a seguir descreve o PVC vinculado ao pod apigee-cassandra-0:
    kubectl apigee describe pvc cassandra-data-apigee-cassandra-0
    
    Events:
      Type     Reason              Age                From                         Message
      ----     ------              ----               ----                         -------
      Warning  ProvisioningFailed  3m (x143 over 5h)  persistentvolume-controller  storageclass.storage.k8s.io "apigee-sc" not found

    Neste exemplo, o StorageClass chamado apigee-sc não existe. Para resolver esse problema, crie o StorageClass ausente no cluster, conforme explicado em Alterar o StorageClass padrão.

Consulte também Como depurar pods.

Os pods do Cassandra estão presos no estado CrashLoopBackoff

Sintoma

Durante a inicialização, os pods do Cassandra permanecem no estado CrashLoopBackoff.

Mensagem de erro

Ao usar kubectl para visualizar os estados do pod, você verá que um ou mais pods do Cassandra estão no estado CrashLoopBackoff. Esse estado indica que o Kubernetes não pode criar o pod. Exemplo:

kubectl get pods -n namespace

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

Causas possíveis

Um pod parado no estado CrashLoopBackoff pode ter várias causas. Exemplo:

Causa Descrição
O data center é diferente do data center anterior. Esse erro indica que o pod do Cassandra tem um volume permanente que tem dados de um cluster anterior e os novos pods não podem unir o cluster antigo. Isso geralmente acontece quando os volumes permanentes desatualizados persistem do cluster do Cassandra anterior no mesmo nó do Kubernetes. Esse problema pode ocorrer se você excluir e recriar o Cassandra no cluster.
Diretório Truststore não encontrado Esse erro indica que o pod do Cassandra não consegue criar uma conexão TLS. Isso geralmente acontece quando as chaves e os certificados fornecidos são inválidos, ausentes ou têm outros problemas.

Diagnóstico

Verifique o registro de erros do Cassandra para determinar a causa do problema.

  1. Liste os pods para conseguir o ID do pod do Cassandra que está apresentando falhas:
    kubectl get pods -n namespace
  2. Verifique o registro do pod com falha:
    kubectl logs pod_id -n namespace

Resolução

Procure as seguintes dicas no registro do pod:

O data center é diferente do data center anterior.

Se você vir esta mensagem de registro:

Cannot start node if snitch's data center (us-east1) differs from previous data center
  • Verifique se há PVC desatualizado ou antigo no cluster e exclua-os.
  • Se for uma nova instalação, exclua todos os PVCs e tente novamente. Exemplo:
    kubectl -n namespace get pvc
    kubectl -n namespace delete pvc cassandra-data-apigee-cassandra-0

Diretório Truststore não encontrado

Se você vir esta mensagem de registro:

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

Verifique a chave e os certificados se os fornecidos no seu arquivo de substituição estão corretos e válidos. Por exemplo:

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

Falha no nó

Sintoma

Ao serem iniciados, os pods do Cassandra permanecem no estado "Pendente". Esse problema pode indicar uma falha de nó subjacente.

Diagnóstico

  1. Determine quais pods do Cassandra não estão em execução:
    $ kubectl get pods -n your_namespace
        NAME          READY   STATUS    RESTARTS   AGE
        cassandra-0   0/1     Pending   0          13s
        cassandra-1   1/1     Running   0          8d
        cassandra-2   1/1     Running   0          8d
  2. Verifique os nós de trabalho. Se um estiver no estado NotReady, será o nó com falha:
    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

Resolução

  1. Remova o pod do Cassandra inativo do cluster.
    $ kubectl exec -it apigee-cassandra-0 -- nodetool status
    $ kubectl exec -it apigee-cassandra-0 -- nodetool removenode deadnode_hostID
  2. Remova o VolumeClaim do nó inativo para impedir que o pod do Cassandra tente aparecer no nó inativo por causa da afinidade:
    kubectl get pvc -n your_namespace
    kubectl delete pvc volumeClaim_name -n your_namespace
  3. Atualize o modelo de volume e crie PersistentVolume para o nó recém-adicionado. Veja a seguir um exemplo de modelo de 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. Substitua os valores pelo novo nome do host/IP e aplique o modelo:
    kubectl apply -f volume-template.yaml