本主題將說明如何排解及修正 Cassandra 資料儲存區的問題。Cassandra 是持續性資料儲存空間,可在混合式執行階段架構的 cassandra 元件中執行。另請參閱「執行階段服務設定總覽」。
Cassandra Pod 停滯在「Pending」狀態
症狀
啟動時,Cassandra Pod 會維持在「Pending」(待處理) 狀態。
錯誤訊息
使用 kubectl 查看 Pod 狀態時,您會發現一或多個 Cassandra Pod 停滯在 Pending 狀態。Pending 狀態表示 Kubernetes 無法在節點上排定 Pod,因此無法建立 Pod。例如:
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
...可能原因
Pod 停滯在「待處理」狀態的原因有很多,例如:
| 原因 | 說明 |
|---|---|
| 資源不足 | CPU 或記憶體不足,無法建立 Pod。 |
| 無法建立磁碟區 | Pod 正在等待建立永久磁碟區。 |
診斷
使用 kubectl 說明 Pod,判斷錯誤來源。例如:
kubectl -n namespace describe pods pod_name
例如:
kubectl describe pods apigee-cassandra-default-0 -n apigee
輸出內容可能會顯示下列其中一個可能問題:
- 如果問題是資源不足,您會看到「警告」訊息,指出 CPU 或記憶體不足。
- 如果錯誤訊息指出 Pod 有未繫結的即時 PersistentVolumeClaim (PVC),表示 Pod 無法建立 永久磁碟區。
解決方法
資源不足
修改 Cassandra 節點集區,確保有足夠的 CPU 和記憶體資源。 詳情請參閱「 調整節點集區大小」。
未建立永久磁碟區
如果判斷是永久磁碟區問題,請說明 PersistentVolumeClaim (PVC),判斷為何未建立該磁碟區:
- 列出叢集中的 PVC:
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 ...
- 說明發生故障的 Pod 的 PVC。舉例來說,下列指令會說明繫結至 Pod
apigee-cassandra-default-0的 PVC: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
請注意,在這個範例中,名為
apigee-sc的 StorageClass 不存在。如要解決這個問題,請在叢集中建立缺少的 StorageClass,詳情請參閱「 變更預設的 StorageClass」。
另請參閱「 偵錯 Pod」。
Cassandra pod 停滯在 CrashLoopBackoff 狀態
症狀
啟動時,Cassandra Pod 會維持在 CrashLoopBackoff 狀態。
錯誤訊息
使用 kubectl 查看 Pod 狀態時,您會發現一或多個 Cassandra Pod 處於 CrashLoopBackoff 狀態。這個狀態表示 Kubernetes 無法建立 Pod。例如:
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
...可能原因
Pod 停滯在 CrashLoopBackoff 狀態的原因有很多種,例如:
| 原因 | 說明 |
|---|---|
| 資料中心與先前的資料中心不同 | 這項錯誤表示 Cassandra Pod 具有來自先前叢集的資料的持續性磁碟區,而新的 Pod 無法加入舊叢集。如果先前 Cassandra 叢集在同一個 Kubernetes 節點上保留過時的永久磁碟區,通常就會發生這種情況。如果您刪除並重新建立叢集中的 Cassandra,就可能發生這個問題。 |
| 找不到信任儲存區目錄 | 這項錯誤表示 Cassandra Pod 無法建立 TLS 連線。 如果提供的金鑰和憑證無效、遺失或有其他問題,通常會發生這種情況。 |
診斷
查看 Cassandra 錯誤記錄,判斷問題原因。
- 列出 Pod,取得發生故障的 Cassandra Pod ID:
kubectl get pods -n namespace
- 檢查失敗的 Pod 記錄:
kubectl logs pod_id -n namespace
解決方法
在 Pod 的記錄中尋找下列線索:
資料中心與先前的資料中心不同
如果看到這則記錄訊息:
Cannot start node if snitch's data center (us-east1) differs from previous data center
- 檢查叢集中是否有任何過時或舊的 PVC,並將其刪除。
- 如果是全新安裝,請刪除所有 PVC,然後重新嘗試設定。例如:
kubectl -n namespace get pvckubectl -n namespace delete pvc cassandra-data-apigee-cassandra-default-0
找不到信任儲存區目錄
如果看到這則記錄訊息:
Caused by: java.io.FileNotFoundException: /apigee/cassandra/ssl/truststore.p12 (No such file or directory)
確認覆寫檔案中提供的金鑰和憑證正確無誤且有效。例如:
cassandra: sslRootCAPath: path_to_root_ca-file sslCertPath: path-to-tls-cert-file sslKeyPath: path-to-tls-key-file
節點故障
症狀
啟動時,Cassandra Pod 會維持在 Pending 狀態。這個問題可能表示底層節點發生故障。
診斷
- 判斷哪些 Cassandra Pod 未執行:
$ 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
- 檢查工作站節點。如果其中一個節點處於 NotReady 狀態,則該節點就是失敗的節點:
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
解決方法
- 從叢集中移除已停止運作的 Cassandra Pod。
$ kubectl exec -it apigee-cassandra-default-0 -- nodetool status
$ kubectl exec -it apigee-cassandra-default-0 -- nodetool removenode deadnode_hostID - 從無效節點移除 VolumeClaim,以免 Cassandra Pod 嘗試在無效節點上啟動 (因為親和性):
kubectl get pvc -n your_namespace
kubectl delete pvc volumeClaim_name -n your_namespace - 更新磁碟區範本,並為新加入的節點建立 PersistentVolume。以下是卷冊範本範例:
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": ["gke-hybrid-cluster-apigee-data-d63b8b8d-n41g"]
- 將值替換為新的主機名稱/IP,然後套用範本:
kubectl apply -f volume-template.yaml
建立用於偵錯的用戶端容器
本節說明如何建立用戶端容器,從中存取 Cassandra 偵錯公用程式,例如 cqlsh。這些公用程式可讓您查詢 Cassandra 資料表,有助於偵錯。
建立用戶端容器
如要建立用戶端容器,請按照下列步驟操作:
- 容器會使用 Pod 中的 TLS 憑證。
apigee-cassandra-user-setup第一步是擷取這個憑證名稱:kubectl get secrets -n apigee --field-selector type=kubernetes.io/tls | grep apigee-cassandra-user-setup | awk '{print $1}'這個指令會傳回憑證名稱。例如:
apigee-cassandra-user-setup-rg-hybrid-b7d3b9c-tls。 - 開啟新檔案,並在其中貼上下列 Pod 規格:
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.7.6" 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副檔名儲存檔案。例如:my-spec.yaml。 - 將規格套用至叢集:
kubectl apply -f your-spec-file.yaml -n apigee
- 登入容器:
kubectl exec -n apigee cassandra-client -it -- bash
- 使用下列指令連線至 Cassandra
cqlsh介面。完全按照畫面所示輸入指令:cqlsh ${CASSANDRA_SEEDS} -u ${APIGEE_DML_USER} -p ${APIGEE_DML_PASSWORD} --ssl
刪除用戶端 Pod
使用下列指令刪除 Cassandra 用戶端 Pod:
kubectl delete pods -n apigee cassandra-client
其他資源
請參閱「 Apigee 和 Apigee Hybrid 教戰手冊簡介」。