Topik ini membahas langkah-langkah yang dapat Anda ambil untuk memecahkan dan memperbaiki masalah dengan
Cassandra. Cassandra adalah
datastore persisten
yang berjalan di komponen cassandra
dari
arsitektur runtime hybrid.
Lihat juga
Ringkasan konfigurasi layanan runtime.
Pod Cassandra berhenti dalam status Tertunda
Gejala
Saat dimulai, pod Cassandra tetap dalam status Tertunda.
Pesan error
Saat menggunakan kubectl
untuk melihat status pod, Anda akan melihat bahwa ada satu atau beberapa
Pod Cassandra terjebak dalam status Pending
. Tujuan
Status Pending
menunjukkan bahwa Kubernetes tidak dapat menjadwalkan pod
pada node: pod tidak dapat dibuat. Contoh:
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
...
Kemungkinan penyebab
Pod yang dalam status Tertunda dapat memiliki beberapa penyebab. Contoh:
Penyebab | Deskripsi |
---|---|
Resource tidak cukup | Tidak tersedia cukup CPU atau memori untuk membuat pod. |
Volume tidak dibuat | Pod menunggu volume persisten dibuat. |
Diagnosis
Gunakan kubectl
untuk mendeskripsikan pod guna menentukan sumber error. Contoh:
kubectl -n namespace describe pods pod_name
Contoh:
kubectl -n apigee describe pods apigee-cassandra-default-0
Output-nya mungkin menampilkan salah satu kemungkinan masalah berikut:
- Jika sumber daya masalah tidak mencukupi, Anda akan melihat pesan Peringatan yang menunjukkan CPU atau memori yang tidak cukup.
- Jika pesan error menunjukkan bahwa pod memiliki PersistentVolumeKlaim (PVC) langsung yang tidak terikat, berarti pod tidak dapat membuat Volume persisten.
Resolusi
Resource tidak cukup
Ubah kumpulan node Cassandra agar memiliki resource CPU dan memori yang memadai. Lihat Mengubah ukuran kumpulan node untuk mengetahui detailnya.
Volume persisten tidak dibuat
Jika Anda menemukan masalah volume persisten, jelaskan PersistentVolumeKlaim (PVC) untuk menentukan mengapa file tersebut tidak dibuat:
- Buat daftar PVC di cluster:
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 ...
- Jelaskan PVC untuk pod yang gagal. Misalnya, perintah berikut
menjelaskan PVC yang terikat ke pod
apigee-cassandra-default-0
:kubectl 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
Perhatikan bahwa dalam contoh ini, StorageClass bernama
apigee-sc
tidak ada. Kepada mengatasi masalah ini, buat StorageClass yang hilang di cluster, seperti yang dijelaskan dalam Mengubah StorageClass default.
Lihat juga Melakukan Debug Pod.
Pod Cassandra terjebak dalam status CrashLoopBackoff
Gejala
Saat memulai, pod Cassandra tetap dalam status CrashLoopBackoff.
Pesan error
Saat menggunakan kubectl
untuk melihat status pod, Anda akan melihat bahwa ada satu atau beberapa
Pod Cassandra berada dalam status CrashLoopBackoff
.
Status ini menunjukkan bahwa Kubernetes tidak dapat membuat pod. Contoh:
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
...
Kemungkinan penyebab
Pod yang berada dalam status CrashLoopBackoff
dapat memiliki beberapa penyebab. Contoh:
Penyebab | Deskripsi |
---|---|
Pusat data berbeda dengan pusat data sebelumnya | Error ini menunjukkan bahwa pod Cassandra memiliki volume persisten yang memiliki data dari tetapi Pod baru tidak dapat bergabung dengan cluster lama. Hal ini biasanya terjadi saat volume persisten yang sudah tidak berlaku tetap dari Cassandra sebelumnya cluster di node Kubernetes yang sama. Masalah ini dapat terjadi jika Anda menghapus dan membuat ulang Cassandra di gugus. |
Direktori truststore tidak ditemukan | Error ini menunjukkan bahwa pod Cassandra tidak dapat membuat koneksi TLS. Hal ini biasanya terjadi ketika kunci dan sertifikat yang disediakan tidak valid, hilang, atau memiliki permasalahan lainnya. |
Diagnosis
Periksa log error Cassandra untuk menentukan penyebab masalah.
- Tampilkan daftar pod untuk mendapatkan ID pod Cassandra yang gagal:
kubectl get pods -n namespace
- Periksa log pod yang gagal:
kubectl logs pod_id -n namespace
Resolusi
Cari petunjuk berikut di log pod:
Pusat data berbeda dengan pusat data sebelumnya
Jika Anda melihat pesan log ini:
Cannot start node if snitch's data center (us-east1) differs from previous data center
- Periksa apakah terdapat PVC yang usang atau usang di cluster, lalu hapus.
- Jika ini adalah penginstalan baru, hapus semua PVC dan coba lagi penyiapannya. Contoh:
kubectl -n namespace get pvc
kubectl -n namespace delete pvc cassandra-data-apigee-cassandra-default-0
Direktori truststore tidak ditemukan
Jika Anda melihat pesan log ini:
Caused by: java.io.FileNotFoundException: /apigee/cassandra/ssl/truststore.p12 (No such file or directory)
Pastikan kunci dan sertifikat yang dicantumkan dalam file penggantian sudah benar dan valid. Misalnya:
cassandra: sslRootCAPath: path_to_root_ca-file sslCertPath: path-to-tls-cert-file sslKeyPath: path-to-tls-key-file
Kegagalan node
Gejala
Saat memulai, pod Cassandra tetap dalam status Tertunda. Ini dapat mengindikasikan kegagalan {i>node<i} yang mendasarinya.
Diagnosis
- Tentukan pod Cassandra mana yang tidak berjalan:
$ kubectl get pods -n your_namespace NAME READY STATUS RESTARTS AGE cassandra-default-0 0/1 Pending 0 13s cassandra-default-1 1/1 Running 0 8d cassandra-default-2 1/1 Running 0 8d
- Periksa worker node. Jika instance tersebut berada dalam status NotReady,
ini adalah node yang gagal:
kubectl get nodes -n your_namespace NAME STATUS ROLES AGE VERSION ip-10-30-1-190.ec2.internal Ready <none> 8d v1.13.2 ip-10-30-1-22.ec2.internal Ready master 8d v1.13.2 ip-10-30-1-36.ec2.internal NotReady <none> 8d v1.13.2 ip-10-30-2-214.ec2.internal Ready <none> 8d v1.13.2 ip-10-30-2-252.ec2.internal Ready <none> 8d v1.13.2 ip-10-30-2-47.ec2.internal Ready <none> 8d v1.13.2 ip-10-30-3-11.ec2.internal Ready <none> 8d v1.13.2 ip-10-30-3-152.ec2.internal Ready <none> 8d v1.13.2 ip-10-30-3-5.ec2.internal Ready <none> 8d v1.13.2
Resolusi
- Hapus pod Cassandra yang mati dari cluster.
$ kubectl exec -it apigee-cassandra-default-0 -- nodetool status
$ kubectl exec -it apigee-cassandra-default-0 -- nodetool removenode deadnode_hostID
- Menghapus VolumeKlaim dari node mati untuk mencegah
{i>Cassandra pod<i} mencoba untuk
menemukan {i>node<i} yang mati karena
dari afinitas:
kubectl get pvc -n your_namespace
kubectl delete pvc volumeClaim_name -n your_namespace
- Perbarui template volume dan buat PersistentVolume untuk
node yang baru ditambahkan. Berikut adalah contoh template volume:
apiVersion: v1 kind: PersistentVolume metadata: name: cassandra-data-3 spec: capacity: storage: 100Gi accessModes: - ReadWriteOnce persistentVolumeReclaimPolicy: Retain storageClassName: local-storage local: path: /apigee/data nodeAffinity: "required": "nodeSelectorTerms": - "matchExpressions": - "key": "kubernetes.io/hostname" "operator": "In" "values": ["ip-10-30-1-36.ec2.internal"]
- Ganti nilai dengan nama host/IP baru dan terapkan template:
kubectl apply -f volume-template.yaml
Membuat penampung klien untuk proses debug
Bagian ini menjelaskan cara membuat penampung klien yang dapat Anda akses
Utilitas proses debug Cassandra
seperti cqlsh
. Utilitas ini memungkinkan Anda untuk melakukan kueri{i> <i}tabel Cassandra dan
dapat berguna untuk tujuan proses debug.
Membuat penampung klien
Untuk membuat penampung klien, ikuti langkah-langkah berikut:
- Penampung menggunakan sertifikat TLS dari
apigee-cassandra-user-setup
pod. Langkah pertama adalah mengambil nama sertifikat ini:kubectl get secrets -n apigee |grep "kubernetes.io/tls"|grep apigee-cassandra-user-setup|awk '{print $1}'
Perintah ini akan menampilkan nama sertifikat. Misalnya:
apigee-cassandra-user-setup-rg-hybrid-b7d3b9c-tls
. - Selanjutnya, ambil nama secret datastore:
kubectl get secrets -n apigee | grep "datastore.*-creds" | awk '{print $1}'
- Buka file baru dan tempelkan spesifikasi pod berikut ke dalamnya:
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.5.10" 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: default-datastore-creds # The datastore secret name fetched previously. - name: APIGEE_DML_PASSWORD valueFrom: secretKeyRef: key: dml.password name: default-datastore-creds # The datastore secret name fetched previously. 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
- Simpan file dengan ekstensi
.yaml
. Contoh:my-spec.yaml
. - Terapkan spesifikasi ke cluster Anda:
kubectl apply -f your-spec-file.yaml -n apigee
- Login ke penampung:
kubectl exec -n apigee cassandra-client -it -- bash
- Hubungkan ke antarmuka
cqlsh
Cassandra dengan perintah berikut. Masukkan perintah {i>command<i} persis seperti yang ditunjukkan:cqlsh ${CASSANDRA_SEEDS} -u ${APIGEE_DML_USER} -p ${APIGEE_DML_PASSWORD} --ssl
Menghapus pod klien
Gunakan perintah ini untuk menghapus pod klien Cassandra:
kubectl delete pods -n apigee cassandra-client
Referensi lainnya
Lihat Pengantar playbook hybrid Apigee dan Apigee.