גיבוי ושחזור של אשכול אדמין

במאמר הזה מוסבר איך לגבות ולשחזר את מאגר ה-etcd של אשכול אדמין שנוצר באמצעות Google Distributed Cloud (תוכנה בלבד) ל-VMware. במסמך הזה יש גם סקריפט שבעזרתו אפשר לגבות באופן אוטומטי את מאגר ה-etcd של האשכול. אפשר גם לגבות ולשחזר אשכול אדמין באמצעות כלי שורת הפקודה gkectl.

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

מגבלות

להליך הגיבוי והשחזור שמתואר במאמר הזה יש את המגבלות הבאות:

  • התהליך הזה לא מגבה נתונים ספציפיים לאפליקציה.

  • התהליך הזה לא מגבה את ה-PersistentVolumes.

  • עומסי עבודה שתוזמנו אחרי שיצרתם גיבוי לא ישוחזרו עם הגיבוי הזה.

  • אי אפשר לשחזר אשכול אחרי שדרוג שנכשל.

  • התהליך הזה לא מיועד לשחזור של אשכול שנמחק.

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

למידע נוסף על המגבלות, ראו חוסר תאימות לתשתית.

גיבוי של אשכול אדמין

גיבוי של אשכול אדמין מכיל את הדברים הבאים:

  • תמונת מצב של ה-etcd של אשכול האדמין.
  • הסודות של מישור הבקרה של האדמין, שנדרשים לאימות באשכולות של האדמין ושל המשתמשים.

לפני שיוצרים גיבוי של אשכול אדמין, צריך לבצע את הפעולות הבאות:

  1. מאתרים את כתובת ה-IP החיצונית של אשכול האדמין, שמשמשת ל-SSH במישור הבקרה של אשכול האדמין:

    kubectl --kubeconfig [ADMIN_CLUSTER_KUBECONFIG] get nodes -n kube-system -o wide | grep master

    כאשר [ADMIN_CLUSTER_KUBECONFIG] הוא קובץ ה-kubeconfig של אשכול האדמין.

  2. יוצרים מפתח SSH בשם vsphere_tmp מהמפתח הפרטי של אשכול האדמין.

    אתם יכולים למצוא את המפתח הפרטי בסודות של אשכולות האדמין:

    kubectl --kubeconfig [ADMIN_CLUSTER_KUBECONFIG] get secrets sshkeys -n kube-system -o yaml

    בפלט הפקודה, המפתח הפרטי מופיע בשדה vsphere_tmp.

    מעתיקים את המפתח הפרטי אל vsphere_tmp:

    echo "[PRIVATE_KEY]" | base64 -d > vsphere_tmp; chmod 600 vsphere_tmp
  3. מוודאים שאפשר להיכנס למישור הבקרה של האדמין באמצעות המפתח הפרטי הזה:

    ssh -i vsphere_tmp ubuntu@[EXTERNAL_IP]
    
  4. יוצאים מהמאגר:

    exit

גיבוי מאגר ה-etcd של אשכול אדמין

כדי לגבות את מאגר ה-etcd של אשכול האדמין:

  1. משיגים את השם של ה-Pod של etcd:

    kubectl --kubeconfig [ADMIN_CLUSTER_KUBECONFIG] get pods \
        -n kube-system -l component=etcd,tier=control-plane -ojsonpath='{$.items[*].metadata.name}{"\n"}'
  2. מפעילים את Shell בקונטיינר kube-etcd של ה-Pod:

    kubectl --kubeconfig [ADMIN_CLUSTER_KUBECONFIG]  exec -it \
        -n kube-system [ADMIN_ETCD_POD] -- bin/sh

    כאשר [ADMIN_ETCD_POD] הוא השם של ה-Pod של etcd.

  3. במעטפת, משתמשים בפקודה etcdctl כדי ליצור גיבוי בשם snapshot.db בספרייה המקומית:

    ETCDCTL_API=3 etcdctl --endpoints=https://127.0.0.1:2379 --cacert=/etc/kubernetes/pki/etcd/ca.crt \
        --cert=/etc/kubernetes/pki/etcd/healthcheck-client.crt \
        --key=/etc/kubernetes/pki/etcd/healthcheck-client.key snapshot save /tmp/snapshot.db
    
  4. יוצאים מהמאגר:

    exit
  5. מעתיקים את הגיבוי מחוץ לקונטיינר kube-etcd באמצעות kubectl cp:

    kubectl --kubeconfig [ADMIN_CLUSTER_KUBECONFIG] cp \
    kube-system/[ADMIN_ETCD_POD]:tmp/snapshot.db [RELATIVE_DIRECTORY]
    

    כאשר [RELATIVE_DIRECTORY] הוא הנתיב שבו רוצים לאחסן את הגיבוי.

גיבוי הסודות של אשכול אדמין

כדי לגבות את הסודות של מישור הבקרה של האדמין:

  1. משתמשים ב-SSH כדי להתחבר לצומת של מישור הבקרה של האדמין:

    ssh -i vsphere_tmp ubuntu@EXTERNAL_IP
    

    מחליפים את EXTERNAL_IP בכתובת ה-IP החיצונית של מישור הבקרה של האדמין, שציינתם קודם.

  2. אופציונלי אבל מומלץ מאוד: יוצרים ספריית גיבוי מקומית.

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

    mkdir backup
  3. מעתיקים את הסודות לספריית הגיבוי המקומית:

    sudo cp -r /etc/kubernetes/pki/* backup/
  4. משנים את ההרשאות של הסודות לגיבוי:

    sudo chmod -R a+rX backup/
  5. יוצאים מהצומת של מישור הבקרה של האדמין:

    exit
  6. מריצים את הפקודה scp כדי להעתיק את תיקיית הגיבוי אל מחוץ לצומת של מישור הבקרה של האדמין:

    sudo scp -r -i vsphere_tmp  ubuntu@EXTERNAL_IP:backup/ RELATIVE_DIRECTORY
    

    מחליפים את RELATIVE_DIRECTORY בנתיב שבו רוצים לאחסן את הגיבוי.

שחזור אשכול אדמין

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

  1. מריצים את הפקודה scp כדי להעתיק את snapshot.db למישור הבקרה של האדמין:

    sudo scp -i vsphere_tmp snapshot.db ubuntu@[EXTERNAL_IP]:

    כאשר [EXTERNAL_IP] היא כתובת ה-IP החיצונית של מישור הבקרה של האדמין, שאספתם קודם לכן.

  2. מפעילים את Shell במישור הבקרה של האדמין:

    sudo ssh -i vsphere_tmp ubuntu@[EXTERNAL_IP]
    
  3. העתקה של snapshot.db/ אל /mnt:

    sudo cp snapshot.db /mnt/
  4. יוצרים ספרייה זמנית, כמו backup:

    mkdir backup
  5. יוצאים ממישור הבקרה של האדמין:

    exit
  6. מעתיקים את האישורים אל backup/:

    sudo scp -r -i vsphere_tmp [BACKUP_CERT_FILE] ubuntu@[EXTERNAL_IP]:backup/
  7. מפעילים מעטפת בצומת של מישור הבקרה של האדמין:

    ssh -i vsphere_tmp ubuntu@[EXTERNAL_IP]
    

    כאשר [EXTERNAL_IP] היא כתובת ה-IP החיצונית של מישור הבקרה של האדמין, שאספתם קודם לכן.

  8. עצירת הפעולה של kube-etcd ושל kube-apiserver.

    sudo mv /etc/kubernetes/manifests/etcd.yaml /tmp/etcd.yaml
    sudo mv /etc/kubernetes/manifests/kube-apiserver.yaml /tmp/kube-apiserver.yaml
  9. מעתיקים את הסודות של הגיבוי אל /etc/kubernetes/pki/:

    sudo cp -r backup/* /etc/kubernetes/pki/
  10. מריצים את etcdctl restore:

    ETCDCTL_API=3 sudo etcdctl snapshot restore /backup/snapshot.db
    sudo rm -r /var/lib/etcd/*
    sudo mv /default.etcd/member/ /var/lib/etcd/
    
  11. מפעילים מחדש את kube-etcd ואת kube-apiserver.

    sudo mv /tmp/etcd.yaml /etc/kubernetes/manifests/etcd.yaml
    sudo mv /tmp/kube-apiserver.yaml /etc/kubernetes/manifests/kube-apiserver.yaml
  12. מוודאים שהשירותים kube-etcd ו-kube-apiserver הופעלו.

    sudo crictl ps -a
  13. מעתיקים את /etc/kubernetes/admin.conf לתיקייה .kube כדי שאפשר יהיה לגשת אליה מתחנת עבודה של אדמין:

    mkdir -p [HOME]/.kube
    sudo cp -i /etc/kubernetes/admin.conf [HOME]/.kube/config
    sudo chown $(id -u):$(id -g) $HOME/.kube/config
  14. יוצאים ממישור הבקרה של האדמין:

    exit
  15. מעתיקים את קובץ ה-kubeconfig החדש שנוצר מצומת האדמין:

    sudo scp -i vsphere_tmp ubuntu@[EXTERNAL_IP]:[HOME]/.kube/config kubeconfig
    sudo chown $(id -u):$(id -g) kubeconfig

    כאשר:

    • ‫[EXTERNAL_IP] היא כתובת ה-IP החיצונית של מישור הבקרה של האדמין.
    • ‫[HOME] היא ספריית הבית בצומת האדמין.

    עכשיו אתם יכולים להשתמש בקובץ kubeconfig החדש כדי לגשת לאשכול ששוחזר.

פתרון בעיות בשחזור של אשכול אדמין

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

בינתיים, אפשר לבדוק את הדברים הבאים כדי לפתור את הבעיה.

  1. מאתרים את מזהה הקונטיינר של etcd

    sudo crictl ps -a | grep [ADMIN_ETCD_POD]

    כאשר [ADMIN_ETCD_POD] הוא השם של ה-Pod של etcd.

  2. בדיקת היומנים מהמאגר וכו'

    sudo crictl logs [ETCD_CONTAINER_ID]

    כאשר [ETCD_CONTAINER_ID] הוא המזהה של מאגר ה-etcd.

  3. מחפשים הודעות יומן של דחיית הרשאה, כמו:

    etcdserver: create snapshot directory error:mkdir /var/lib/etcd/member/snap: permission denied

  4. אם מופיעות הודעות על דחיית הרשאות, צריך לעדכן את הבעלות על ‎/opt/data/var/lib/etcd/‎

    sudo chown -R 2001:2001 /opt/data/var/lib/etcd/

  5. מוודאים שהשירותים kube-etcd ו-kube-apiserver הופעלו.

    sudo crictl ps

גיבוי אוטומטי של אשכולות

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

  • מגדירים את BACKUP_DIR לנתיב שבו רוצים לאחסן את הגיבויים של אשכולות האדמין והמשתמשים. הנתיב הזה לא אמור להיות קיים.
  • מגדירים את ADMIN_CLUSTER_KUBECONFIG לנתיב של קובץ ה-kubeconfig של אשכול האדמין.
  • מגדירים את USER_CLUSTER_NAMESPACE לשם של אשכול המשתמשים. השם של אשכול המשתמש הוא מרחב שמות באשכול האדמין.
  • מגדירים את EXTERNAL_IP לכתובת ה-VIP ששמרתם לשירות מישור הבקרה של האדמין.
  • מגדירים את SSH_PRIVATE_KEY לנתיב של מפתח ה-SSH.
  • אם אתם משתמשים ברשת פרטית, צריך להגדיר את JUMP_IP לכתובת ה-IP של שרת ה-jump של הרשת.
#!/usr/bin/env bash

# Automates manual steps for taking backups of user and admin clusters.
# Fill in the variables below before running the script.

BACKUP_DIR=""                       # path to store user and admin cluster backups
ADMIN_CLUSTER_KUBECONFIG=""         # path to admin cluster kubeconfig
USER_CLUSTER_NAMESPACE=""           # user cluster namespace
EXTERNAL_IP=""                      # admin control plane node external ip - follow steps in documentation
SSH_PRIVATE_KEY=""                  # path to vsphere_tmp ssh private key - follow steps in documentation
JUMP_IP=""                          # network jump server IP - leave empty string if not using private network.

mkdir -p $BACKUP_DIR
mkdir $BACKUP_DIR/pki

# USER CLUSTER BACKUP

# Snapshot user cluster etcd
kubectl --kubeconfig=${ADMIN_CLUSTER_KUBECONFIG} exec -it -n ${USER_CLUSTER_NAMESPACE} kube-etcd-0 -c kube-etcd -- /bin/sh -ec "export ETCDCTL_API=3; etcdctl --endpoints=https://127.0.0.1:2379 --cacert=/etcd.local.config/certificates/etcdCA.crt --cert=/etcd.local.config/certificates/etcd.crt --key=/etcd.local.config/certificates/etcd.key snapshot save /tmp/${USER_CLUSTER_NAMESPACE}_snapshot.db"
kubectl --kubeconfig=${ADMIN_CLUSTER_KUBECONFIG} cp ${USER_CLUSTER_NAMESPACE}/kube-etcd-0:tmp/${USER_CLUSTER_NAMESPACE}_snapshot.db $BACKUP_DIR/user-cluster_${USER_CLUSTER_NAMESPACE}_snapshot.db 

# ADMIN CLUSTER BACKUP

# Set up ssh options
SSH_OPTS=(-oStrictHostKeyChecking=no -i ${SSH_PRIVATE_KEY})
if [ "${JUMP_IP}" != "" ]; then
    SSH_OPTS+=(-oProxyCommand="ssh -oStrictHostKeyChecking=no -i ${SSH_PRIVATE_KEY} -W %h:%p ubuntu@${JUMP_IP}")
fi

# Copy admin certs
ssh "${SSH_OPTS[@]}" ubuntu@${EXTERNAL_IP} 'sudo chmod -R a+rX /etc/kubernetes/pki/*'
scp -r "${SSH_OPTS[@]}" ubuntu@${EXTERNAL_IP}:/etc/kubernetes/pki/* ${BACKUP_DIR}/pki/

# Snapshot admin cluster etcd
admin_etcd=$(kubectl --kubeconfig=${ADMIN_CLUSTER_KUBECONFIG} get pods -n kube-system -l component=etcd,tier=control-plane -ojsonpath='{$.items[*].metadata.name}{"\n"}')
kubectl --kubeconfig=${ADMIN_CLUSTER_KUBECONFIG} exec -it -n kube-system ${admin_etcd} -- /bin/sh -ec "export ETCDCTL_API=3; etcdctl --endpoints=https://127.0.0.1:2379 --cacert=/etc/kubernetes/pki/etcd/ca.crt --cert=/etc/kubernetes/pki/etcd/healthcheck-client.crt --key=/etc/kubernetes/pki/etcd/healthcheck-client.key snapshot save /tmp/admin_snapshot.db"
kubectl --kubeconfig=${ADMIN_CLUSTER_KUBECONFIG} cp -n kube-system ${admin_etcd}:tmp/admin_snapshot.db $BACKUP_DIR/admin-cluster_snapshot.db

המאמרים הבאים