Supported versions:
Unsupported versions:
This topic discusses steps you can take to troubleshoot and fix problems with the
Cassandra datastore. Cassandra is a
persistent datastore
that runs in the cassandra component of the
hybrid runtime architecture.
See also
Runtime service configuration overview.
When starting up, the Cassandra pods remain in the Pending state.
When you use kubectl to view the pod states, you see that one or more
Cassandra pods are stuck in the Pending state. The
Pending state indicates that Kubernetes is unable to schedule the pod
on a node: the pod cannot be created. For example:
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
...A pod stuck in the Pending state can have multiple causes. For example:
Use kubectl
to describe the pod to determine the source of the error. For example:
kubectl -n namespace describe pods pod_name
For example:
kubectl -n apigee describe pods apigee-cassandra-default-0
The output may show one of these possible problems:
Modify the Cassandra node pool so that it has sufficient CPU and memory resources. See Resizing a node pool for details.
If you determine a persistent volume issue, describe the PersistentVolumeClaim (PVC) to determine why it is not being created:
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 ...
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
Note that in this example, the StorageClass named apigee-sc does not exist. To
resolve this problem, create the missing StorageClass in the cluster, as explained in
Change the default StorageClass.
See also Debugging Pods.
When starting up, the Cassandra pods remain in the CrashLoopBackoff state.
When you use kubectl to view the pod states, you see that one or more
Cassandra pods are in the CrashLoopBackoff state.
This state indicates that Kubernetes is unable to create the pod. For example:
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
...
A pod stuck in the CrashLoopBackoff state can have multiple causes. For example:
Check the Cassandra error log to determine the cause of the problem.
kubectl get pods -n namespace
kubectl logs pod_id -n namespace
Look for the following clues in the pod's log:
If you see this log message:
Cannot start node if snitch's data center (us-east1) differs from previous data center
kubectl -n namespace get pvckubectl -n namespace delete pvc cassandra-data-apigee-cassandra-default-0
If you see this log message:
Caused by: java.io.FileNotFoundException: /apigee/cassandra/ssl/truststore.p12 (No such file or directory)
Verify the key and certificates if provided in your overrides file are correct and valid. For example:
cassandra: sslRootCAPath: path_to_root_ca-file sslCertPath: path-to-tls-cert-file sslKeyPath: path-to-tls-key-file
When starting up, the Cassandra pods remain in the Pending state. This problem can indicate an underlying node failure.
$ 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
kubectl get nodes -n your_namespace NAME STATUS ROLES AGE VERSION INTERNAL-IP gke-hybrid-cluster-apigee-data-178811f1-lv5j Ready <none> 34d v1.21.5-gke.1302 10.138.15.198 gke-hybrid-cluster-apigee-data-d63b8b8d-n41g NotReady <none> 34d v1.21.5-gke.1302 10.138.15.200 gke-hybrid-cluster-apigee-data-ec752c0b-b1cr Ready <none> 34d v1.21.5-gke.1302 10.138.15.199 gke-hybrid-cluster-apigee-runtime-ba502ff4-57mq Ready <none> 34d v1.21.5-gke.1302 10.138.15.204 gke-hybrid-cluster-apigee-runtime-ba502ff4-hwkb Ready <none> 34d v1.21.5-gke.1302 10.138.15.203 gke-hybrid-cluster-apigee-runtime-bfa558e0-08vw Ready <none> 34d v1.21.5-gke.1302 10.138.15.201 gke-hybrid-cluster-apigee-runtime-bfa558e0-xvsc Ready <none> 34d v1.21.5-gke.1302 10.138.15.202 gke-hybrid-cluster-apigee-runtime-d12de7df-693w Ready <none> 34d v1.21.5-gke.1302 10.138.15.241 gke-hybrid-cluster-apigee-runtime-d12de7df-fn0w Ready <none> 34d v1.21.5-gke.1302 10.138.15.206
$ kubectl exec -it apigee-cassandra-default-0 -- nodetool status
$ kubectl exec -it apigee-cassandra-default-0 -- nodetool removenode deadnode_hostIDkubectl get pvc -n your_namespace
kubectl delete pvc volumeClaim_name -n your_namespaceapiVersion: 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": ["gke-hybrid-cluster-apigee-data-d63b8b8d-n41g"]kubectl apply -f volume-template.yaml
This section explains how to create a client container from which you can access
Cassandra debugging utilities
such as cqlsh. These utilities allow you to query Cassandra tables and
can be useful for debugging purposes.
To create the client container, follow these steps:
apigee-cassandra-user-setup
pod. The first step is to fetch this certificate name:
kubectl get secrets -n apigee --field-selector type=kubernetes.io/tls | grep apigee-cassandra-user-setup | awk '{print $1}'
This command returns the certificate name. For example: apigee-cassandra-user-setup-rg-hybrid-b7d3b9c-tls.
apiVersion: v1 kind: Pod metadata: labels: name: cassandra-client-name # For example: my-cassandra-client namespace: apigee spec: containers: - name: cassandra-client-name image: "gcr.io/apigee-release/hybrid/apigee-hybrid-cassandra-client:1.6.9" imagePullPolicy: Always command: - sleep - "3600" env: - name: CASSANDRA_SEEDS value: apigee-cassandra-default.apigee.svc.cluster.local - name: APIGEE_DML_USER valueFrom: secretKeyRef: key: dml.user name: apigee-datastore-default-creds - name: APIGEE_DML_PASSWORD valueFrom: secretKeyRef: key: dml.password name: apigee-datastore-default-creds volumeMounts: - mountPath: /opt/apigee/ssl name: tls-volume readOnly: true volumes: - name: tls-volume secret: defaultMode: 420 secretName: your-secret-name # For example: apigee-cassandra-user-setup-rg-hybrid-b7d3b9c-tls restartPolicy: Never
.yaml extension. For example: my-spec.yaml.kubectl apply -f your-spec-file.yaml -n apigee
kubectl exec -n apigee cassandra-client -it -- bash
cqlsh interface with the following command. Enter the
command exactly as shown:
cqlsh ${CASSANDRA_SEEDS} -u ${APIGEE_DML_USER} -p ${APIGEE_DML_PASSWORD} --sslUse this command to delete the Cassandra client pod:
kubectl delete pods -n apigee cassandra-client
See Introduction to Apigee and Apigee hybrid playbooks.
Except as otherwise noted, the content of this page is licensed under the Creative Commons Attribution 4.0 License, and code samples are licensed under the Apache 2.0 License. For details, see the Google Developers Site Policies. Java is a registered trademark of Oracle and/or its affiliates.
Last updated 2026-07-23 UTC.