מדריך לפתרון בעיות ב-Cassandra

במאמר הזה מוסבר איך לפתור בעיות במאגר הנתונים 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-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-0

יכול להיות שיוצגו בתוצאה אחת מהבעיות האפשריות הבאות:

  • אם הבעיה היא משאבים לא מספיקים, תוצג הודעת אזהרה שמציינת שאין מספיק מעבד או זיכרון.
  • אם בהודעת השגיאה מצוין שה-pod כולל PersistentVolumeClaims (PVC)‎ לא מאוגדים מיידיים, זה אומר שה-pod לא יכול ליצור Persistent volume משלו.

רזולוציה

אין מספיק משאבים

משנים את מאגר הצמתים של Cassandra כך שיהיו בו מספיק משאבי מעבד (CPU) וזיכרון. פרטים נוספים זמינים במאמר בנושא שינוי הגודל של מאגר צמתים.

נפח אחסון מתמיד לא נוצר

אם מזהים בעיה בנפח אחסון קבוע, מתארים את PersistentVolumeClaim ‏ (PVC) כדי להבין למה הוא לא נוצר:

  1. מציגים ברשימה את ה-PVC באשכול:
    kubectl -n namespace get pvc
    
    NAME                                STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   AGE
    cassandra-data-apigee-cassandra-0   Bound    pvc-b247faae-0a2b-11ea-867b-42010a80006e   10Gi       RWO            standard       15m
    ...
  2. מתארים את ה-PVC של הפוד שנכשל. לדוגמה, הפקודה הבאה מתארת את ה-PVC שקשור לפוד apigee-cassandra-0:
    kubectl apigee describe pvc cassandra-data-apigee-cassandra-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-0                       0/1     CrashLoopBackoff           0          10m
...

סיבות אפשריות

יכולות להיות כמה סיבות לכך ש-Pod תקוע במצב CrashLoopBackoff. לדוגמה:

מטרה תיאור
מרכז הנתונים שונה ממרכז הנתונים הקודם השגיאה הזו מציינת של-Cassandra pod יש נפח אחסון קבוע עם נתונים מקלאסטר קודם, וה-pods החדשים לא יכולים להצטרף לקלאסטר הישן. זה קורה בדרך כלל כשנפחי אחסון מתמיד לא עדכניים נשארים מהאשכול הקודם של Cassandra באותו צומת Kubernetes. הבעיה הזו יכולה לקרות אם מוחקים את Cassandra באשכול ויוצרים אותו מחדש.
לא נמצאה ספריית Truststore השגיאה הזו מציינת שפוד Cassandra לא מצליח ליצור חיבור TLS. לרוב זה קורה כשהמפתחות והאישורים שסופקו לא תקפים, חסרים או שיש להם בעיות אחרות.

אבחון

כדי לזהות את הגורם לבעיה, צריך לבדוק את יומן השגיאות של Cassandra.

  1. מציגים את רשימת ה-Pods כדי לקבל את המזהה של ה-Pod של Cassandra שנכשל:
    kubectl get pods -n namespace
  2. בודקים את היומן של ה-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 pvc
    kubectl -n namespace delete pvc cassandra-data-apigee-cassandra-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. הבעיה הזו יכולה להעיד על כשל בבסיס הצומת.

אבחון

  1. בודקים אילו פודים של Cassandra לא פועלים:
    $ kubectl get pods -n your_namespace
        NAME          READY   STATUS    RESTARTS   AGE
        cassandra-0   0/1     Pending   0          13s
        cassandra-1   1/1     Running   0          8d
        cassandra-2   1/1     Running   0          8d
  2. בודקים את צמתי העובדים. אם אחד מהם במצב 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

רזולוציה

  1. מסירים את ה-pod של Cassandra שהפסיק לפעול מהאשכול.
    $ kubectl exec -it apigee-cassandra-0 -- nodetool status
    $ kubectl exec -it apigee-cassandra-0 -- nodetool removenode deadnode_hostID
  2. מסירים את VolumeClaim מהצומת המת כדי למנוע מ-Cassandra pod לנסות להפעיל את הצומת המת בגלל הקרבה:
    kubectl get pvc -n your_namespace
    kubectl delete pvc volumeClaim_name -n your_namespace
  3. מעדכנים את תבנית עוצמת הקול ויוצרים 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"]
  4. מחליפים את הערכים בשם המארח או בכתובת ה-IP החדשים ומחילים את התבנית:
    kubectl apply -f volume-template.yaml