症状
Apigee ハイブリッドのインストールまたはアップグレード中に、Cassandra Pod が CrashLoopBackOff
状態になることがあります。
エラー メッセージ
apigee
Namespace で実行された kubectl get pods
の出力に、1 つ以上の 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 で誤ったイメージ URL が使用されている |
拡張の問題 | 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 が起動する予定のワーカーノードは、クラスタの DNS サービスを介してホスト名を有効な IP アドレスに解決できる必要があります。回避策として、すべてのワーカーノードで次のコマンドを実行します。
echo -e "\\n127.0.1.1 ${HOSTNAME}" >> "/etc/hosts"
原因 2: イメージの誤り
誤った Cassandra イメージが使用されています。
診断
overrides.yaml
ファイルを調べて、Cassandra に正しいイメージが構成されていることを確認します。正しい Cassandra イメージを指定した overrides.yaml
のスタンザの例を次に示します。
cassandra: image: url: "gcr.io/apigee-release/hybrid/apigee-hybrid-cassandra" tag: "1.15.0" pullPolicy: IfNotPresent
解決策
overrides.yaml
ファイル内の Cassandra イメージのバージョンと名前が正確であることを確認し、インストール コマンドまたはアップグレード コマンドを再度試行します。apigee-pull-push
スクリプトの List オプションを使用すると、リポジトリ内のすべてのイメージを一覧表示できます。その後、それらのイメージを確認して、すべて想定した Apigee ハイブリッド バージョンのイメージであることを確認します。
原因 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
で構成されます。multiRegionSeedHost
を示すoverrides.yaml
の Cassandra スタンザの例。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 7001
Trying 10.0.0.0... telnet: Unable to connect to remote host: Connection timed outtelnet 10.0.0.0 7199
Trying 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)
これは、ポートがすでに使用されていることを示しています。
解決策
ポート 7000 と 7001 でリッスンしている Cassandra 以外のサービスを停止して削除します。これにより、Cassandra アプリケーションが起動するはずです。
原因 5: 同一の IP アドレス
クラスタに同じ IP の古い Cassandra Pod が存在します。この状況は、ハイブリッドをアンインストールまたは再インストールした後に発生する可能性があります。
診断
- 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
コマンドの出力を確認し、エラー メッセージと同じ IP(10.10.1.1)の Cassandra ノードが表示されているかどうかを確認します。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 status の出力例では
4d96eaf5-7e75-4aeb-bc47-9e45fdb4b533
です。- 古い Cassandra ノードが削除されたら、ハイブリッドのインストールを再試行します。
診断情報の収集が必要な場合
上記の手順でも問題が解決しない場合は、次の診断情報を収集して Google Cloud カスタマーケアにお問い合わせください。
- Google Cloud プロジェクト ID。
- Apigee ハイブリッド組織。
- 元のリージョンと新しいリージョンの両方の
overrides.yaml
ファイル。機密情報はマスクしてください。 - Apigee ハイブリッドの Must-Gather のコマンド出力。