במאמר הזה מוסבר איך לגבות את מאגר הנתונים של 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מהמפתח הפרטי של אשכול האדמין.אפשר למצוא את המפתח הפרטי ב-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
בודקים שאפשר להיכנס למעטפת של אמצעי בקרה לאדמינים באמצעות המפתח הפרטי הזה:
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/
מריצים Shell אל הצומת של אמצעי הבקרה לאדמינים:
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
where:
- [EXTERNAL_IP] היא כתובת ה-IP החיצונית של מישור הבקרה של האדמין.
- [HOME] היא ספריית הבית בצומת האדמין.
עכשיו אפשר להשתמש בקובץ kubeconfig החדש הזה כדי לגשת לאשכול המשוחזר.
פתרון בעיות בשחזור של אשכול אדמין
אם נתקלתם בבעיה בשחזור אשכול האדמין, עליכם לפנות לתמיכה של Google כדי לפתור את הבעיה באשכול האדמין.
בינתיים, אפשר לבדוק את הדברים הבאים כדי לנסות לפתור את הבעיה.
איתור מזהה מאגר ה-etcd
sudo crictl ps -a | grep [ADMIN_ETCD_POD]
כאשר [ADMIN_ETCD_POD] הוא השם של ה-Pod של etcd.
בדיקת היומנים מהקונטיינר etc
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 של שרת הניתוב של הרשת.
#!/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.