Pod Cassandra dalam Status CrashLoopBackOff

Gejala

Pod Cassandra dapat memasuki status CrashLoopBackOff saat menginstal atau mengupgrade Apigee Hybrid.

Pesan error

Output kubectl get pods saat dijalankan di namespace apigee menampilkan satu atau beberapa pod Cassandra dalam status CrashLoopBackOff:

kubectl get pods -n apigee

NAME                          READY   STATUS            RESTARTS   AGE
apigee-cassandra-default-0    0/1     CrashLoopBackoff  0          9m

Kemungkinan penyebab

Pod Cassandra dapat memasuki status CrashLoopBackOff karena berbagai alasan.

Penyebab Deskripsi
Resolusi nama host gagal UnknownHostException yang ditampilkan untuk resolusi DNS
Gambar Salah URL gambar salah yang digunakan di overrides.yaml
Masalah ekspansi Masalah konektivitas ke host seed Cassandra
Konflik port Port 7000 atau 7001 sudah digunakan
Alamat IP yang Sama Node dengan alamat /10.10.x.x sudah ada

Penyebab 1: Resolusi nama host gagal

Resolusi nama host untuk node Cassandra gagal karena masalah konfigurasi DNS di cluster. Log pod Cassandra mungkin menampilkan entri log yang serupa:

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

Resolusi

Node pekerja tempat pod Cassandra dijadwalkan untuk muncul harus dapat me-resolve nama host ke alamat IP yang valid melalui layanan DNS cluster. Sebagai solusi sementara, Anda dapat menjalankan perintah berikut di semua node pekerja:

echo -e "\\n127.0.1.1 ${HOSTNAME}" >> "/etc/hosts"

Penyebab 2: Gambar Salah

Gambar Cassandra yang salah digunakan.

Diagnosis

Periksa file overrides.yaml untuk memastikan gambar yang benar dikonfigurasi untuk Cassandra. Berikut adalah contoh stanza di overrides.yaml dengan image Cassandra yang benar.

cassandra:
  image:
    url: "gcr.io/apigee-release/hybrid/apigee-hybrid-cassandra"
    tag: "1.15.0"
    pullPolicy: IfNotPresent

Resolusi

Pastikan versi dan nama image Cassandra akurat dalam file overrides.yaml, lalu coba lagi perintah penginstalan atau upgrade. Anda dapat menggunakan opsi List di skrip apigee-pull-push untuk mencantumkan semua gambar di repo Anda. Kemudian, Anda dapat meninjau gambar tersebut untuk memastikan bahwa semuanya adalah gambar dari versi Hybrid yang dimaksud.

Penyebab 3: Masalah ekspansi

Pod Cassandra mungkin tidak dapat terhubung ke node Seed saat diperluas ke wilayah baru.

Diagnosis

  1. Log pod Cassandra mungkin menampilkan entri log yang serupa seperti dalam contoh berikut:
    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. Periksa konektivitas antara node yang saat ini gagal dan node awal.
  3. Identifikasi node awal yang dikonfigurasi di overrides.yaml untuk region baru. Node awal dikonfigurasi di overrides.yaml pada saat perluasan region dengan nama kolom: multiRegionSeedHost.

    Contoh stanza Cassandra dari overrides.yaml Anda yang menampilkan multiRegionSeedHost.

    cassandra:
      multiRegionSeedHost: "1.2.X.X"
      datacenter: "dc-1"
      rack: "rc-1"
      hostNetwork: false
      clusterName: QA
  4. Buat container klien untuk memeriksa konektivitas antara pod Cassandra yang gagal dan node awal dengan mengikuti petunjuk di Membuat container klien untuk proses debug
  5. Setelah Anda ssh ke dalam container klien dan memiliki shell bash, gunakan telnet untuk memeriksa konektivitas dari node saat ini ke node seed melalui port 7001 dan 7199

    Contoh perintah telnet dan output yang menunjukkan kegagalan koneksi

    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

Resolusi

  1. Bekerja samalah dengan tim admin cluster Anda untuk memastikan ada konektivitas jaringan antara node Cassandra di semua cluster yang merupakan bagian dari organisasi yang sama.
  2. Pastikan tidak ada aturan firewall yang memblokir traffic dari node yang gagal ke node awal.

Penyebab 4: Konflik port

Konflik port

Cassandra mencoba untuk memproses port 7000 dan 7001, tetapi layanan lain seperti ssh sudah memproses port tersebut.

Diagnosis

Log pod Cassandra mungkin menampilkan entri yang serupa seperti dalam contoh berikut:

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)

Hal ini menunjukkan bahwa port sudah digunakan.

Resolusi

Hentikan dan hapus layanan selain Cassandra yang memproses Port 7000 dan 7001. Tindakan ini akan memungkinkan aplikasi Cassandra muncul.

Penyebab 5: Alamat IP yang sama

Pod Cassandra lama dengan IP yang sama ada di cluster. Situasi ini dapat terjadi setelah meng-uninstal Hybrid atau menginstal ulang Hybrid.

Diagnosis

  1. Tinjau file system.log Cassandra untuk memeriksa apakah ada error berikut:
    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. Tinjau output perintah nodetool status dari salah satu DC yang masih aktif untuk melihat apakah ada node Cassandra yang ditampilkan dengan IP yang sama seperti dalam pesan error - 10.10.1.1.

    Contoh output perintah 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

Resolusi

  1. Hapus node Cassandra lama menggunakan perintah nodetool remove:
    nodetool removenode HOST_ID

    ID host dapat ditemukan di output status nodetool. Misalnya: 4d96eaf5-7e75-4aeb-bc47-9e45fdb4b533 dalam output status nodetool contoh sebelumnya.

  2. Setelah node Cassandra yang lebih lama dihapus, coba lagi penginstalan Hybrid.

Harus mengumpulkan informasi diagnostik

Jika masalah berlanjut bahkan setelah mengikuti petunjuk di atas, kumpulkan informasi diagnostik berikut, lalu hubungi Google Cloud Layanan Pelanggan:

  1. Google Cloud Project ID.
  2. Organisasi Apigee Hybrid.
  3. File overrides.yaml dari wilayah sumber dan wilayah baru, yang menyamarkan informasi sensitif.
  4. Output dari perintah di Pengumpulan data penting Apigee Hybrid.