Cassandra Pod が CrashLoopBackOff ステータスになっている

症状

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 がシードノードに接続できないことがあります。

診断

  1. 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
  2. 失敗した現在のノードとシードノード間の接続を確認します。
  3. 新しいリージョンの 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
  4. デバッグ用のクライアント コンテナを作成するの手順に沿って、クライアント コンテナを作成し、失敗した Cassandra Pod とシードノード間の接続を確認します。
  5. クライアント コンテナに 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 out
    telnet 10.0.0.0 7199
    Trying 10.0.0.0...
    telnet: Unable to connect to remote host: Connection timed out

解決策

  1. クラスタ管理者チームと協力して、同じ組織に属するすべてのクラスタの Cassandra ノード間にネットワーク接続があることを確認します。
  2. 失敗したノードからシードノードへのトラフィックをファイアウォール ルールがブロックしていないことを確認します。

原因 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 が存在します。この状況は、ハイブリッドをアンインストールまたは再インストールした後に発生する可能性があります。

診断

  1. 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.
  2. まだ起動している 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

解決策

  1. nodetool remove コマンドを使用して、古い Cassandra ノードを削除します。
    nodetool removenode HOST_ID

    ホスト ID は nodetool status の出力で確認できます。たとえば、前述の nodetool status の出力例では 4d96eaf5-7e75-4aeb-bc47-9e45fdb4b533 です。

  2. 古い Cassandra ノードが削除されたら、ハイブリッドのインストールを再試行します。

診断情報の収集が必要な場合

上記の手順でも問題が解決しない場合は、次の診断情報を収集して Google Cloud カスタマーケアにお問い合わせください。

  1. Google Cloud プロジェクト ID。
  2. Apigee ハイブリッド組織。
  3. 元のリージョンと新しいリージョンの両方の overrides.yaml ファイル。機密情報はマスクしてください。
  4. Apigee ハイブリッドの Must-Gather のコマンド出力。