החלפת רפליקה של etcd שנכשלה

במאמר הזה מוסבר איך להחליף רפליקה של etcd שנכשלה באשכול משתמשים עם זמינות גבוהה (HA) ב-Google Distributed Cloud.

ההוראות שמופיעות כאן רלוונטיות לאשכול משתמשים עם זמינות גבוהה שמשתמש ב-kubeception, כלומר אשכול משתמשים שלא מופעל בו Controlplane V2. אם אתם צריכים להחליף עותק של etcd באשכול משתמשים שמופעל בו Controlplane V2, פנו לתמיכה של Cloud Customer Care.

לפני שמתחילים

  • מוודאים שקלאסטר האדמין פועל בצורה תקינה.

  • מוודאים ששני חברי etcd האחרים באשכול המשתמשים פועלים בצורה תקינה. אם יותר מחבר אחד ב-etcd נכשל, אפשר לעיין במאמר שחזור מנתוני etcd פגומים או אבודים.

החלפת רפליקה של etcd שנכשלה

  1. מגבים עותק של etcd PodDisruptionBudget ‏ (PDB) כדי שתוכלו לשחזר אותו בהמשך.

    kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG -n USER_CLUSTER_NAME get pdb kube-etcd-pdb -o yaml > PATH_TO_PDB_FILE

    כאשר:

    • ADMIN_CLUSTER_KUBECONFIG הוא הנתיב לקובץ kubeconfig של אשכול האדמין.

    • USER_CLUSTER_NAME הוא השם של אשכול המשתמשים שמכיל את הרפליקה של etcd שנכשלה.

    • PATH_TO_PDB_FILE הוא הנתיב שבו רוצים לשמור את קובץ ה-PDB של etcd, לדוגמה /tmp/etcpdb.yaml.

  2. מוחקים את ה-PodDisruptionBudget ‏ (PDB) של etcd.

    kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG -n USER_CLUSTER_NAME delete pdb kube-etcd-pdb
  3. מריצים את הפקודה הבאה כדי לפתוח את StatefulSet של kube-etcd בעורך הטקסט:

    kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG -n USER_CLUSTER_NAME edit statefulset kube-etcd

    משנים את הערך של הדגל --initial-cluster-state ל-existing.

    containers:
        - name: kube-etcd
          ...
          args:
            - --initial-cluster-state=existing
          ...
     
  4. מרוקנים את צומת הרפליקה של etcd שנכשל.

    kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG drain NODE_NAME --ignore-daemonsets --delete-local-data

    כאשר NODE_NAME הוא השם של צומת הרפליקה של etcd שנכשל.

  5. יוצרים מעטפת חדשה בקונטיינר של אחד מפודי kube-etcd הפעילים.

    kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG exec -it \
       KUBE_ETCD_POD --container kube-etcd --namespace USER_CLUSTER_NAME \
       -- bin/sh

    כאשר KUBE_ETCD_POD הוא השם של הפוד kube-etcd הפעיל. לדוגמה, kube-etcd-0.

    במעטפת החדשה הזו, מריצים את הפקודות הבאות:

    1. מסירים את צומת הרפליקה הכושל של etcd מהמקבץ של etcd.

      קודם כל, מציגים את הרשימה של כל חברי אשכול etcd:

      etcdctl member list -w table

      בפלט מוצגים כל מזהי החברים. קובעים את מספר החבר של הרפליקה שנכשלה.

      בשלב הבא, מסירים את הרפליקה שנכשלה:

      export ETCDCTL_CACERT=/etcd.local.config/certificates/etcdCA.crt
      export ETCDCTL_CERT=/etcd.local.config/certificates/etcd.crt
      export ETCDCTL_CERT=/etcd.local.config/certificates/etcd.crt
      export ETCDCTL_KEY=/etcd.local.config/certificates/etcd.key
      export ETCDCTL_ENDPOINTS=https://127.0.0.1:2379
      etcdctl member remove MEMBER_ID

      כאשר MEMBER_ID הוא מזהה החבר בפורמט הקסדצימלי של רפליקת ה-etcd pod שנכשלה.

    2. מוסיפים חבר חדש עם אותו שם וכתובת URL של עמיתים כמו של צומת הרפליקה שנכשל.

      etcdctl member add MEMBER_NAME --peer-urls=https://MEMBER_NAME.kube-etcd:2380

      כאשר MEMBER_NAME הוא המזהה של צומת הרפליקה של kube-etcd שנכשל. לדוגמה, kube-etcd-1 או kube-etcd2.

  6. מפרטים את פודי ה-etcd שמנהלים את מאגר ה-etcd עבור אשכול המשתמשים. ה-Pods האלה פועלים באשכול הניהול:

    kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG get pods --namespace USER_CLUSTER_NAME \
        --output wide | grep kube-etcd
    

    בפלט מוצגים ה-Pods של etcd והצמתים שבהם ה-Pods פועלים. הצמתים שמוצגים בפלט הם צמתים באשכול האדמין שמשמשים כמישורי בקרה לאשכול המשתמש:

    NAME              ...   NODE
    kube-etcd-0       ...   node-abc
    kube-etcd-1       ...   node-yyy
    kube-etcd-2       ...   node-zzz
    
  7. חשוב לרשום את שמות ה-Pod ואת שמות הצמתים של מישור הבקרה כדי להשתמש בהם במניפסט של ה-Pod שיוצרים בשלב הבא.

    שימו לב שכל פוד של etcd נקרא kube-etcd בתוספת מספר. המספר הזה נקרא מספר החבר בקבוצה. הוא מזהה את ה-Pod כחבר מסוים באשכול etcd שמכיל את נתוני האובייקט של אשכול המשתמשים. במדריך הזה, מחזיק המקום MEMBER_NUMBER מייצג את מספר החבר ב-Pod של etcd.

    שימו לב גם שכל Pod באשכול etcd פועל על צומת משלו.

  8. יוצרים מניפסט של Pod שמתאר Pod של כלי עזר שמריצים באופן זמני כדי לשחזר נתוני etcd. שומרים את מניפסט ה-Pod הבא בספרייה הנוכחית בקובץ בשם etcd-utility-MEMBER_NUMBER.yaml:

    apiVersion: v1
    kind: Pod
    metadata:
      name: etcd-utility-MEMBER_NUMBER
      namespace: USER_CLUSTER_NAME
    spec:
      containers:
      - command: ["/bin/sh"]
        args: ["-ec", "while :; do echo '.'; sleep 5 ; done"]
        image: gcr.io/gke-on-prem-release/etcd-util:GKE_ON_PREM_VERSION
        name: etcd-utility
        volumeMounts:
        - mountPath: /var/lib/etcd
          name: data
        - mountPath: /etcd.local.config/certificates
          name: etcd-certs
      nodeSelector:
        kubernetes.googleapis.com/cluster-name: USER_CLUSTER_NAME
        kubernetes.io/hostname: NODE_NAME
      tolerations:
      - effect: NoExecute
        key: node.kubernetes.io/not-ready
        operator: Exists
        tolerationSeconds: 300
      - effect: NoExecute
        key: node.kubernetes.io/unreachable
        operator: Exists
        tolerationSeconds: 300
      - effect: NoSchedule
        key: node.kubernetes.io/unschedulable
        operator: Exists
      volumes:
      - name: data
        persistentVolumeClaim:
          claimName: data-kube-etcd-MEMBER_NUMBER
      - name: etcd-certs
        secret:
          defaultMode: 420
          secretName: KUBE_ETCD_SECRET_NAME
    

    מחליפים את מה שכתוב בשדות הבאים:

    • NODE_NAME: הצומת שבו פועל ה-Pod‏ kube-etcd-0.

    • USER_CLUSTER_NAME: השם של אשכול המשתמשים.

    • GKE_ON_PREM_VERSION: גרסת האשכול שבו רוצים לבצע את השחזור של etcd (לדוגמה, 1.31.100-gke.136).

    • KUBE_ETCD_SECRET_NAME: השם של הסוד שמשמש את etcd באשכול המשתמשים, שמתחיל ב-kube-etcd-certs.

  9. יוצרים את ה-Pod של כלי השירות באשכול האדמין:

    kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG apply -f etcd-utility-MEMBER_NUMBER.yaml
    
  10. מנקים את ספריית הנתונים של etcd מתוך ה-Pod של כלי השירות.

    kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG exec -it -n USER_CLUSTER_NAME etcd-utility-MEMBER_NUMBER -- /bin/bash -c 'rm -rf /var/lib/etcd/*'
  11. מוחקים את ה-Pod של חברת התשתיות.

    kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG delete pod -n USER_CLUSTER_NAME etcd-utility-MEMBER_NUMBER
  12. מבטלים את הגידור של הצומת שנכשל.

    kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG uncordon NODE_NAME
  13. פותחים את kube-etcd StatefulSet בכלי לעריכת טקסט.

    kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG -n USER_CLUSTER_NAME edit statefulset kube-etcd

    משנים את הערך של הדגל --initial-cluster-state ל-new.

    containers:
        - name: kube-etcd
          ...
          args:
            - --initial-cluster-state=new
          ...
     
  14. משחזרים את ה-PDB של etcd שנמחק בשלב 1.

    kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG apply -f /path/to/etcdpdb.yaml