問題
安裝或升級 Apigee hybrid 時,Cassandra Pod 可能會進入 CrashLoopBackOff 狀態。
錯誤訊息
在 apigee 命名空間中執行 kubectl get pods,輸出內容顯示一或多個 Cassandra Pod 處於 CrashLoopBackOff 狀態:
kubectl get pods -n apigee
NAME READY STATUS RESTARTS AGE
apigee-cassandra-default-0 0/1 CrashLoopBackoff 0 9m可能原因
Cassandra Pod 可能會因各種原因進入 CrashLoopBackOff 狀態。
| 原因 | 說明 |
|---|---|
| 無法解析主機名稱 | DNS 解析擲回 UnknownHostException |
| 圖片不正確 | overrides.yaml 中使用的圖片網址不正確 |
| 展開問題 | Cassandra 種子主機連線問題 |
| 通訊埠衝突 | 通訊埠 7000 或 7001 已在使用中 |
| 相同的 IP 位址 | 已有位址為 /10.10.x.x 的節點 |
原因 1:主機名稱解析失敗
叢集中的 DNS 設定問題,導致 Cassandra 節點的主機名稱解析失敗。Cassandra 的 Pod 記錄可能會顯示類似的記錄項目:
ERROR [main] 2025-01-12 13:23:34,569 CassandraDaemon.java:803 - Local host name unknown: java.net.UnknownHostException: ip-xx-xx-xx-xx.example.com: ip-xx-xx-xx-xx.example.com: Name or service not known
解析度
Cassandra Pod 預定啟動的 worker 節點,應能透過叢集 DNS 服務,將主機名稱解析為有效的 IP 位址。如要解決這個問題,請在所有 worker 節點上執行下列指令:
echo -e "\\n127.0.1.1 ${HOSTNAME}" >> "/etc/hosts"原因 2:圖片不正確
使用的 Cassandra 映像檔有誤。
診斷
請檢查 overrides.yaml 檔案,確認 Cassandra 已設定正確的映像檔。以下是 overrides.yaml 中的範例段落,其中包含正確的 Cassandra 映像檔。
cassandra:
image:
url: "gcr.io/apigee-release/hybrid/apigee-hybrid-cassandra"
tag: "1.15.0"
pullPolicy: IfNotPresent解析度
請確認 overrides.yaml 檔案中的 Cassandra 映像檔版本和名稱正確無誤,然後再次嘗試執行安裝或升級指令。您可以使用 apigee-pull-push 指令碼中的 List 選項,列出存放區中的所有映像檔。接著,您可以查看這些圖片,確保所有圖片都來自預期的 Hybrid 版本。
原因 3:擴展問題
Cassandra Pod 擴充至新區域時,可能無法連線至種子節點。
診斷
- Cassandra Pod 記錄可能會顯示類似下列範例的記錄項目:
INFO [main] 2024-07-28 05:25:15,662 GossipingPropertyFileSnitch.java:68 - Unable to load cassandra-topology.properties; compatibility mode disabled The seed provider lists no seeds. WARN [main] 2024-07-28 05:25:15,703 SimpleSeedProvider.java:60 - Seed provider couldn't lookup host apigee-cassandra-default-0.apigee-cassandra-default.apigee.svc.cluster.local Exception (org.apache.cassandra.exceptions.ConfigurationException) encountered during startup: The seed provider lists no seeds. ERROR [main] 2024-07-28 05:25:15,703 CassandraDaemon.java:803 - Exception encountered during startup: The seed provider lists no seeds. INFO [ScheduledTasks:1] 2024-07-28 05:25:15,833 StorageService.java:136 - Overriding RING_DELAY to 30000ms
- 檢查目前故障節點與種子節點之間的連線。
- 找出新區域在
overrides.yaml中設定的種子節點。在擴充區域時,種子節點會設定在overrides.yaml的multiRegionSeedHost欄位中。overrides.yaml中的 Cassandra 段落範例,顯示multiRegionSeedHost。cassandra: multiRegionSeedHost: "1.2.X.X" datacenter: "dc-1" rack: "rc-1" hostNetwork: false clusterName: QA
- 按照「建立用於偵錯的用戶端容器」一節的操作說明,建立用戶端容器,檢查故障的 Cassandra Pod 和種子節點之間的連線能力
ssh進入用戶端容器並取得 Bash 殼層後,請使用 telnet 檢查目前節點與種子節點之間的連線,確認是否能透過通訊埠 7001 和 7199 連線telnet 指令範例和顯示連線失敗的輸出內容
telnet 10.0.0.0 7001Trying 10.0.0.0... telnet: Unable to connect to remote host: Connection timed outtelnet 10.0.0.0 7199Trying 10.0.0.0... telnet: Unable to connect to remote host: Connection timed out
解析度
- 請與叢集管理員團隊合作,確保同一組織內所有叢集的 Cassandra 節點之間有網路連線。
- 確認沒有任何防火牆規則會封鎖從故障節點傳送至種子節點的流量。
原因 4:通訊埠衝突
通訊埠衝突
Cassandra 嘗試在通訊埠 7000 和 7001 監聽,但已有其他服務 (例如 ssh) 在該通訊埠監聽。
診斷
Cassandra 的 Pod 記錄可能會顯示類似下列範例的項目:
Unable to create ssl socket Fatal configuration error; unable to start server. See log for stacktrace. ERROR [main] 2023-02-27 13:01:54,239 CassandraDaemon.java:803 - Fatal configuration error org.apache.cassandra.exceptions.ConfigurationException: Unable to create ssl socket at org.apache.cassandra.net.MessagingService.getServerSockets(MessagingService.java:701) ~[apache-cassandra-3.11.9.jar:3.11.9] at org.apache.cassandra.net.MessagingService.listen(MessagingService.java:681) ~[apache-cassandra-3.11.9.jar:3.11.9] at org.apache.cassandra.net.MessagingService.listen(MessagingService.java:665) ~[apache-cassandra-3.11.9.jar:3.11.9] at org.apache.cassandra.service.StorageService.prepareToJoin(StorageService.java:831) ~[apache-cassandra-3.11.9.jar:3.11.9] at org.apache.cassandra.service.StorageService.initServer(StorageService.java:717) ~[apache-cassandra-3.11.9.jar:3.11.9] at org.apache.cassandra.service.StorageService.initServer(StorageService.java:666) ~[apache-cassandra-3.11.9.jar:3.11.9] at org.apache.cassandra.service.CassandraDaemon.setup(CassandraDaemon.java:395) [apache-cassandra-3.11.9.jar:3.11.9] at org.apache.cassandra.service.CassandraDaemon.activate(CassandraDaemon.java:633) [apache-cassandra-3.11.9.jar:3.11.9] at org.apache.cassandra.service.CassandraDaemon.main(CassandraDaemon.java:786) [apache-cassandra-3.11.9.jar:3.11.9] Caused by: java.net.BindException: Address already in use (Bind failed) Caused by: java.net.BindException: Address already in use (Bind failed)
這表示通訊埠已在使用中。
解析度
停止並移除 Cassandra 以外、監聽通訊埠 7000 和 7001 的任何服務,這樣 Cassandra 應用程式應該就能啟動。
原因 5:IP 位址相同
叢集中有 IP 相同的舊 Cassandra Pod。解除安裝或重新安裝 Hybrid 後,可能會發生這種情況。
診斷
- 查看 Cassandra 的
system.log檔案,確認是否有下列錯誤:INFO [HANDSHAKE-/10.106.32.131] 2020-11-30 04:28:51,432 OutboundTcpConnection.java:561 - Handshaking version with /10.10.1.1 Exception (java.lang.RuntimeException) encountered during startup: A node with address /10.10.1.1 already exists, cancelling join. Use cassandra.replace_address if you want to replace this node. java.lang.RuntimeException: A node with address /10.10.1.1 already exists, cancelling join. Use cassandra.replace_address if you want to replace this node. at org.apache.cassandra.service.StorageService.checkForEndpointCollision(StorageService.java:558) at org.apache.cassandra.service.StorageService.prepareToJoin(StorageService.java:804) at org.apache.cassandra.service.StorageService.initServer(StorageService.java:664) at org.apache.cassandra.service.StorageService.initServer(StorageService.java:613) at org.apache.cassandra.service.CassandraDaemon.setup(CassandraDaemon.java:379) at org.apache.cassandra.service.CassandraDaemon.activate(CassandraDaemon.java:602) at org.apache.cassandra.service.CassandraDaemon.main(CassandraDaemon.java:691) ERROR [main] 2020-11-30 04:28:52,287 CassandraDaemon.java:708 - Exception encountered during startup java.lang.RuntimeException: A node with address /10.10.1.1 already exists, cancelling join. Use cassandra.replace_address if you want to replace this node.
- 查看任何仍在運作的 DC
nodetool status指令輸出內容,確認是否有 Cassandra 節點顯示的 IP 與錯誤訊息中的 IP 相同 (10.10.1.1)。nodetool status 指令輸出內容範例
kubectl exec apigee-cassandra-default-0 -n -- nodetool status Datacenter dc-1 ================ Status=Up/Down |/ State=Normal/Leaving/Joining/Moving -- Address Load Tokens Owns (effective) Host ID Rack UN 10.10.1.1 649.6 KiB 256 100.0% 4d96eaf5-7e75-4aeb-bc47-9e45fdb4b533 ra-1 UN 10.10.1.2 885.2 KiB 256 100.0% 261a15dd-1b51-4918-a63b-551a64e74a5e ra-1 UN 10.10.1.3 693.74 KiB 256 100.0% 91e22ba4-fa53-4340-adaf-db32430bdda9 ra-1
解析度
- 使用
nodetool remove指令移除舊的 Cassandra 節點:nodetool removenode HOST_ID
主機 ID 位於 nodetool status 的輸出內容中。例如:先前範例 nodetool 狀態輸出中的
4d96eaf5-7e75-4aeb-bc47-9e45fdb4b533。 - 移除舊的 Cassandra 節點後,請重新安裝 Hybrid。
必須收集診斷資訊
如果按照上述操作說明仍無法解決問題,請收集下列診斷資訊,然後與 Google Cloud 客戶服務 聯絡:
- Google Cloud 專案 ID。
- Apigee Hybrid 組織。
- 來源和新區域的
overrides.yaml檔案,並遮蓋所有機密資訊。 - Apigee hybrid 必備資訊收集中的指令輸出內容。