במאמר הזה מוסבר איך לגבות ולשחזר את מאגר ה-etcd של אשכול אדמין שנוצר באמצעות Google Distributed Cloud (תוכנה בלבד) ל-VMware. במסמך הזה יש גם סקריפט שבעזרתו אפשר לגבות באופן אוטומטי את מאגר ה-etcd של האשכול. אפשר גם לגבות ולשחזר אשכול אדמין באמצעות כלי שורת הפקודה gkectl.
אתם יכולים ליצור קובץ גיבוי לשחזור במקרה של אסונות בלתי צפויים שעלולים לפגוע בנתוני ה-etcd של האשכול. שומרים את קובץ הגיבוי במיקום מחוץ לאשכול, שלא תלוי בפעולה של האשכול.
מגבלות
להליך הגיבוי והשחזור שמתואר במאמר הזה יש את המגבלות הבאות:
התהליך הזה לא מגבה נתונים ספציפיים לאפליקציה.
התהליך הזה לא מגבה את ה-PersistentVolumes.
עומסי עבודה שתוזמנו אחרי שיצרתם גיבוי לא ישוחזרו עם הגיבוי הזה.
אי אפשר לשחזר אשכול אחרי שדרוג שנכשל.
התהליך הזה לא מיועד לשחזור של אשכול שנמחק.
אל תשתמשו בהליך הזה באשכולות שמופעלת בהם ההגדרה "אשכול מתקדם". במקום זאת, עיינו במאמר גיבוי ושחזור של אשכולות מתקדמים באמצעות gkectl.
למידע נוסף על המגבלות, ראו חוסר תאימות לתשתית.
גיבוי של אשכול אדמין
גיבוי של אשכול אדמין מכיל את הדברים הבאים:
- תמונת מצב של ה-etcd של אשכול האדמין.
- הסודות של מישור הבקרה של האדמין, שנדרשים לאימות באשכולות של האדמין ושל המשתמשים.
לפני שיוצרים גיבוי של אשכול אדמין, צריך לבצע את הפעולות הבאות:
מאתרים את כתובת ה-IP החיצונית של אשכול האדמין, שמשמשת ל-SSH במישור הבקרה של אשכול האדמין:
kubectl --kubeconfig [ADMIN_CLUSTER_KUBECONFIG] get nodes -n kube-system -o wide | grep master
כאשר [ADMIN_CLUSTER_KUBECONFIG] הוא קובץ ה-kubeconfig של אשכול האדמין.
יוצרים מפתח 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
מוודאים שאפשר להיכנס למישור הבקרה של האדמין באמצעות המפתח הפרטי הזה:
ssh -i vsphere_tmp ubuntu@[EXTERNAL_IP]
יוצאים מהמאגר:
exit
גיבוי מאגר ה-etcd של אשכול אדמין
כדי לגבות את מאגר ה-etcd של אשכול האדמין:
משיגים את השם של ה-Pod של etcd:
kubectl --kubeconfig [ADMIN_CLUSTER_KUBECONFIG] get pods \ -n kube-system -l component=etcd,tier=control-plane -ojsonpath='{$.items[*].metadata.name}{"\n"}'מפעילים את Shell בקונטיינר kube-etcd של ה-Pod:
kubectl --kubeconfig [ADMIN_CLUSTER_KUBECONFIG] exec -it \ -n kube-system [ADMIN_ETCD_POD] -- bin/shכאשר [ADMIN_ETCD_POD] הוא השם של ה-Pod של etcd.
במעטפת, משתמשים בפקודה
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יוצאים מהמאגר:
exit
מעתיקים את הגיבוי מחוץ לקונטיינר kube-etcd באמצעות
kubectl cp:kubectl --kubeconfig [ADMIN_CLUSTER_KUBECONFIG] cp \ kube-system/[ADMIN_ETCD_POD]:tmp/snapshot.db [RELATIVE_DIRECTORY]
כאשר [RELATIVE_DIRECTORY] הוא הנתיב שבו רוצים לאחסן את הגיבוי.
גיבוי הסודות של אשכול אדמין
כדי לגבות את הסודות של מישור הבקרה של האדמין:
משתמשים ב-SSH כדי להתחבר לצומת של מישור הבקרה של האדמין:
ssh -i vsphere_tmp ubuntu@EXTERNAL_IP
מחליפים את
EXTERNAL_IPבכתובת ה-IP החיצונית של מישור הבקרה של האדמין, שציינתם קודם.אופציונלי אבל מומלץ מאוד: יוצרים ספריית גיבוי מקומית.
כדי להעתיק את הסודות של הגיבוי מהצומת, צריך לשנות את ההרשאות שלהם.
mkdir backup
מעתיקים את הסודות לספריית הגיבוי המקומית:
sudo cp -r /etc/kubernetes/pki/* backup/
משנים את ההרשאות של הסודות לגיבוי:
sudo chmod -R a+rX backup/
יוצאים מהצומת של מישור הבקרה של האדמין:
exit
מריצים את הפקודה
scpכדי להעתיק את תיקיית הגיבוי אל מחוץ לצומת של מישור הבקרה של האדמין:sudo scp -r -i vsphere_tmp ubuntu@EXTERNAL_IP:backup/ RELATIVE_DIRECTORY
מחליפים את
RELATIVE_DIRECTORYבנתיב שבו רוצים לאחסן את הגיבוי.
שחזור אשכול אדמין
בפעולות הבאות משחזרים אשכול אדמין שגובה, ואת כל מישורי הבקרה של המשתמשים שהוא ניהל כשנוצר הסנאפשוט של etcd.
מריצים את הפקודה
scpכדי להעתיק אתsnapshot.dbלמישור הבקרה של האדמין:sudo scp -i vsphere_tmp snapshot.db ubuntu@[EXTERNAL_IP]:
כאשר [EXTERNAL_IP] היא כתובת ה-IP החיצונית של מישור הבקרה של האדמין, שאספתם קודם לכן.
מפעילים את Shell במישור הבקרה של האדמין:
sudo ssh -i vsphere_tmp ubuntu@[EXTERNAL_IP]
העתקה של
snapshot.db/אל/mnt:sudo cp snapshot.db /mnt/
יוצרים ספרייה זמנית, כמו
backup:mkdir backup
יוצאים ממישור הבקרה של האדמין:
exit
מעתיקים את האישורים אל
backup/:sudo scp -r -i vsphere_tmp [BACKUP_CERT_FILE] ubuntu@[EXTERNAL_IP]:backup/
מפעילים מעטפת בצומת של מישור הבקרה של האדמין:
ssh -i vsphere_tmp ubuntu@[EXTERNAL_IP]
כאשר [EXTERNAL_IP] היא כתובת ה-IP החיצונית של מישור הבקרה של האדמין, שאספתם קודם לכן.
עצירת הפעולה של
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
מעתיקים את הסודות של הגיבוי אל
/etc/kubernetes/pki/:sudo cp -r backup/* /etc/kubernetes/pki/
מריצים את
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/
מפעילים מחדש את
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
מוודאים שהשירותים
kube-etcdו-kube-apiserverהופעלו.sudo crictl ps -a
מעתיקים את
/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
יוצאים ממישור הבקרה של האדמין:
exit
מעתיקים את קובץ ה-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 כדי לפתור את הבעיה באשכול האדמין.
בינתיים, אפשר לבדוק את הדברים הבאים כדי לפתור את הבעיה.
מאתרים את מזהה הקונטיינר של etcd
sudo crictl ps -a | grep [ADMIN_ETCD_POD]
כאשר [ADMIN_ETCD_POD] הוא השם של ה-Pod של etcd.
בדיקת היומנים מהמאגר וכו'
sudo crictl logs [ETCD_CONTAINER_ID]
כאשר [ETCD_CONTAINER_ID] הוא המזהה של מאגר ה-etcd.
מחפשים הודעות יומן של דחיית הרשאה, כמו:
etcdserver: create snapshot directory error:mkdir /var/lib/etcd/member/snap: permission deniedאם מופיעות הודעות על דחיית הרשאות, צריך לעדכן את הבעלות על /opt/data/var/lib/etcd/
sudo chown -R 2001:2001 /opt/data/var/lib/etcd/
מוודאים שהשירותים
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
המאמרים הבאים
- גיבוי ושחזור של אשכול משתמש
- אבחון בעיות באשכול
- מידע על augur, כלי בקוד פתוח לשחזור אובייקטים ספציפיים מגיבויים של etcd.