本主題將說明如何排解及修正 Cassandra 資料儲存庫的問題。Cassandra 是永久性資料儲存庫,會在混合式執行階段架構的 cassandra
元件中執行。另請參閱「執行階段服務設定總覽」。
Cassandra pod 卡在待處理狀態
症狀
啟動時,Cassandra 會維持在「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 正在等待建立永久磁碟區。 |
缺少 Amazon EBS CSI 驅動程式 | 未安裝必要的 Amazon EBS CSI 驅動程式。 |
診斷
使用 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 -n 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。
另請參閱「 偵錯 Pods」。
缺少 Amazon EBS CSI 驅動程式
如果混合型執行個體是在 EKS 叢集中執行,請確認 EKS 叢集使用 Amazon EBS 容器儲存空間介面 (CSI) 驅動程式。詳情請參閱 Amazon EBS CSI 遷移作業常見問題。
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 無法加入舊叢集。這通常是因為在同一個 Kubernetes 節點上,先前的 Cassandra 叢集中仍保留了過時的永久磁碟區。如果您在叢集中刪除 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 pvc
kubectl -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 偵錯公用程式,例如 cqlsh
。這些公用程式可讓您查詢 Cassandra 資料表,並可用於偵錯。
建立用戶端容器
如要建立用戶端容器,請按照下列步驟操作:
- 容器會使用
apigee-cassandra-user-setup
Pod 的 TLS 憑證。第一步是擷取這個憑證名稱: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.8.8" 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 教戰手冊簡介」。