במאמר הזה מוסבר איך לפתור בעיות במאגר הנתונים Cassandra. Cassandra הוא מאגר נתונים קבוע שפועל ברכיב cassandra של ארכיטקטורת זמן הריצה ההיברידית.
אפשר גם לעיין בסקירה כללית של הגדרת שירות בזמן ריצה.
תאי Cassandra תקועים במצב Pending
תיאור הבעיה
בזמן ההפעלה, ה-pods של Cassandra נשארים במצב Pending.
הודעת השגיאה
כשמשתמשים בפקודה kubectl כדי להציג את מצבי ה-pod, רואים שאחד או יותר מ-Cassandra pods תקועים במצב Pending. המצב Pending מציין ש-Kubernetes לא יכול לתזמן את ה-Pod בצומת: אי אפשר ליצור את ה-Pod. לדוגמה:
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
...סיבות אפשריות
יכולות להיות כמה סיבות לכך ש-Pod תקוע במצב 'בהמתנה'. לדוגמה:
| מטרה | תיאור |
|---|---|
| אין מספיק משאבים | אין מספיק מעבד או זיכרון פנויים כדי ליצור את ה-pod. |
| לא נוצר נפח | ה-pod ממתין ליצירת נפח אחסון מתמיד. |
אבחון
משתמשים ב-kubectl
כדי לתאר את ה-pod ולקבוע את מקור השגיאה. לדוגמה:
kubectl -n namespace describe pods pod_name
לדוגמה:
kubectl -n apigee describe pods apigee-cassandra-default-0
יכול להיות שיוצגו בתוצאה אחת מהבעיות האפשריות הבאות:
- אם הבעיה היא משאבים לא מספיקים, תוצג הודעת אזהרה שמציינת שאין מספיק מעבד או זיכרון.
- אם בהודעת השגיאה מצוין שה-pod כולל PersistentVolumeClaims (PVC) לא מאוגדים מיידיים, זה אומר שה-pod לא יכול ליצור Persistent volume משלו.
רזולוציה
אין מספיק משאבים
משנים את מאגר הצמתים של Cassandra כך שיהיו בו מספיק משאבי מעבד (CPU) וזיכרון. פרטים נוספים זמינים במאמר בנושא שינוי הגודל של מאגר צמתים.
נפח אחסון מתמיד לא נוצר
אם מזהים בעיה בנפח אחסון קבוע, מתארים את PersistentVolumeClaim (PVC) כדי להבין למה הוא לא נוצר:
- מציגים ברשימה את ה-PVC באשכול:
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 ...
- מתארים את ה-PVC של הפוד שנכשל. לדוגמה, הפקודה הבאה מתארת את ה-PVC שקשור לפוד
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
שימו לב שבדוגמה הזו, StorageClass בשם
apigee-scלא קיים. כדי לפתור את הבעיה, צריך ליצור את StorageClass החסר באשכול, כמו שמוסבר במאמר שינוי ברירת המחדל של StorageClass.
אפשר לעיין גם במאמר ניפוי באגים ב-Pods.
תאי Cassandra תקועים במצב CrashLoopBackoff
תיאור הבעיה
במהלך ההפעלה, ה-pods של Cassandra נשארים במצב CrashLoopBackoff.
הודעת השגיאה
כשמשתמשים בפקודה kubectl כדי להציג את מצבי ה-pod, רואים שאחד או יותר מ-Cassandra pods נמצאים במצב CrashLoopBackoff.
הסטטוס הזה מציין ש-Kubernetes לא יכול ליצור את ה-pod. לדוגמה:
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
...סיבות אפשריות
יכולות להיות כמה סיבות לכך ש-Pod תקוע במצב CrashLoopBackoff. לדוגמה:
| מטרה | תיאור |
|---|---|
| מרכז הנתונים שונה ממרכז הנתונים הקודם | השגיאה הזו מציינת של-Cassandra pod יש נפח אחסון קבוע עם נתונים מקלאסטר קודם, וה-pods החדשים לא יכולים להצטרף לקלאסטר הישן. זה קורה בדרך כלל כשנפחי אחסון מתמיד לא עדכניים נשארים מהאשכול הקודם של Cassandra באותו צומת Kubernetes. הבעיה הזו יכולה לקרות אם מוחקים את Cassandra באשכול ויוצרים אותו מחדש. |
| לא נמצאה ספריית Truststore | השגיאה הזו מציינת שפוד Cassandra לא מצליח ליצור חיבור TLS. לרוב זה קורה כשהמפתחות והאישורים שסופקו לא תקפים, חסרים או שיש להם בעיות אחרות. |
אבחון
כדי לזהות את הגורם לבעיה, צריך לבדוק את יומן השגיאות של Cassandra.
- מציגים את רשימת ה-Pods כדי לקבל את המזהה של ה-Pod של Cassandra שנכשל:
kubectl get pods -n namespace
- בודקים את היומן של ה-Pod שנכשל:
kubectl logs pod_id -n namespace
רזולוציה
מחפשים את הרמזים הבאים ביומן של ה-pod:
מרכז הנתונים שונה ממרכז הנתונים הקודם
אם רואים את הודעת היומן הזו:
Cannot start node if snitch's data center (us-east1) differs from previous data center
- בודקים אם יש PVC ישנים או לא עדכניים באשכול ומוחקים אותם.
- אם זו התקנה חדשה, צריך למחוק את כל ה-PVC ולנסות להגדיר שוב. לדוגמה:
kubectl -n namespace get pvckubectl -n namespace delete pvc cassandra-data-apigee-cassandra-default-0
לא נמצאה ספריית Truststore
אם רואים את הודעת היומן הזו:
Caused by: java.io.FileNotFoundException: /apigee/cassandra/ssl/truststore.p12 (No such file or directory)
אם סיפקתם מפתח ואישורים בקובץ ההחלפות, ודאו שהם נכונים ותקפים. לדוגמה:
cassandra: sslRootCAPath: path_to_root_ca-file sslCertPath: path-to-tls-cert-file sslKeyPath: path-to-tls-key-file
כשל בצומת
תיאור הבעיה
כשמפעילים את Cassandra, ה-pods נשארים במצב Pending. הבעיה הזו יכולה להעיד על כשל בבסיס הצומת.
אבחון
- בודקים אילו פודים של Cassandra לא פועלים:
$ 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
- בודקים את צמתי העובדים. אם אחד מהם במצב NotReady, זהו הצומת שנכשל:
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
רזולוציה
- מסירים את ה-pod של Cassandra שהפסיק לפעול מהאשכול.
$ kubectl exec -it apigee-cassandra-default-0 -- nodetool status
$ kubectl exec -it apigee-cassandra-default-0 -- nodetool removenode deadnode_hostID - מסירים את VolumeClaim מהצומת המת כדי למנוע מ-Cassandra pod לנסות להפעיל את הצומת המת בגלל הקרבה:
kubectl get pvc -n your_namespace
kubectl delete pvc volumeClaim_name -n your_namespace - מעדכנים את תבנית עוצמת הקול ויוצרים PersistentVolume עבור הצומת החדש שנוסף. זוהי דוגמה לתבנית של נפח:
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"] - מחליפים את הערכים בשם המארח או בכתובת ה-IP החדשים ומחילים את התבנית:
kubectl apply -f volume-template.yaml