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

במאמר הזה מוסבר איך לגבות את מאגר הנתונים של 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 מהמפתח הפרטי של אשכול האדמין.

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

    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. מריצים Shell אל הצומת של אמצעי הבקרה לאדמינים:

    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

    where:

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

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

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

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

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

  1. איתור מזהה מאגר ה-etcd

    sudo crictl ps -a | grep [ADMIN_ETCD_POD]

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

  2. בדיקת היומנים מהקונטיינר etc

    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 של שרת הניתוב של הרשת.
#!/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

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