במאמר הזה מוסבר איך להחליף רפליקה של etcd שנכשלה באשכול משתמשים עם זמינות גבוהה (HA) ב-Google Distributed Cloud.
ההוראות שמופיעות כאן רלוונטיות לאשכול משתמשים עם זמינות גבוהה שמשתמש ב-kubeception, כלומר אשכול משתמשים שלא מופעל בו Controlplane V2. אם אתם צריכים להחליף עותק של etcd באשכול משתמשים שמופעל בו Controlplane V2, פנו לתמיכה של Cloud Customer Care.
לפני שמתחילים
מוודאים שקלאסטר האדמין פועל בצורה תקינה.
מוודאים ששני חברי etcd האחרים באשכול המשתמשים פועלים בצורה תקינה. אם יותר מחבר אחד ב-etcd נכשל, אפשר לעיין במאמר שחזור מנתוני etcd פגומים או אבודים.
החלפת רפליקה של etcd שנכשלה
מגבים עותק של 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.
מוחקים את ה-PodDisruptionBudget (PDB) של etcd.
kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG -n USER_CLUSTER_NAME delete pdb kube-etcd-pdb
מריצים את הפקודה הבאה כדי לפתוח את 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 ...מרוקנים את צומת הרפליקה של etcd שנכשל.
kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG drain NODE_NAME --ignore-daemonsets --delete-local-data
כאשר
NODE_NAMEהוא השם של צומת הרפליקה של etcd שנכשל.יוצרים מעטפת חדשה בקונטיינר של אחד מפודי 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.במעטפת החדשה הזו, מריצים את הפקודות הבאות:
מסירים את צומת הרפליקה הכושל של 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 שנכשלה.מוסיפים חבר חדש עם אותו שם וכתובת URL של עמיתים כמו של צומת הרפליקה שנכשל.
etcdctl member add MEMBER_NAME --peer-urls=https://MEMBER_NAME.kube-etcd:2380
כאשר
MEMBER_NAMEהוא המזהה של צומת הרפליקה של kube-etcd שנכשל. לדוגמה,kube-etcd-1אוkube-etcd2.
מפרטים את פודי ה-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
חשוב לרשום את שמות ה-Pod ואת שמות הצמתים של מישור הבקרה כדי להשתמש בהם במניפסט של ה-Pod שיוצרים בשלב הבא.
שימו לב שכל פוד של etcd נקרא
kube-etcdבתוספת מספר. המספר הזה נקרא מספר החבר בקבוצה. הוא מזהה את ה-Pod כחבר מסוים באשכול etcd שמכיל את נתוני האובייקט של אשכול המשתמשים. במדריך הזה, מחזיק המקום MEMBER_NUMBER מייצג את מספר החבר ב-Pod של etcd.שימו לב גם שכל Pod באשכול etcd פועל על צומת משלו.
יוצרים מניפסט של 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: הצומת שבו פועל ה-Podkube-etcd-0.
USER_CLUSTER_NAME: השם של אשכול המשתמשים.
GKE_ON_PREM_VERSION: גרסת האשכול שבו רוצים לבצע את השחזור של etcd (לדוגמה, 1.31.100-gke.136).
KUBE_ETCD_SECRET_NAME: השם של הסוד שמשמש את etcd באשכול המשתמשים, שמתחיל ב-kube-etcd-certs.
יוצרים את ה-Pod של כלי השירות באשכול האדמין:
kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG apply -f etcd-utility-MEMBER_NUMBER.yaml
מנקים את ספריית הנתונים של 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/*'
מוחקים את ה-Pod של חברת התשתיות.
kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG delete pod -n USER_CLUSTER_NAME etcd-utility-MEMBER_NUMBER
מבטלים את הגידור של הצומת שנכשל.
kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG uncordon NODE_NAME
פותחים את 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 ...משחזרים את ה-PDB של etcd שנמחק בשלב 1.
kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG apply -f /path/to/etcdpdb.yaml