ProHoster > בלוג > מינהל > הניסיון שלנו עם נתונים באשכול Kubernetes etcd ישירות (ללא K8s API)
הניסיון שלנו עם נתונים באשכול Kubernetes etcd ישירות (ללא K8s API)
יותר ויותר, לקוחות מבקשים מאיתנו לספק גישה לאשכול Kubernetes כדי שנוכל לגשת לשירותים בתוך האשכול: כדי להיות מסוגלים להתחבר ישירות למסד נתונים או שירות כלשהו, לחבר אפליקציה מקומית עם יישומים בתוך האשכול...
לדוגמה, יש צורך להתחבר מהמחשב המקומי שלך לשירות memcached.staging.svc.cluster.local. אנו מספקים יכולת זו באמצעות VPN בתוך האשכול שאליו הלקוח מתחבר. לשם כך, אנו מכריזים על רשתות משנה של פודים, שירותים ודוחפים DNS של אשכולות ללקוח. כך, כאשר לקוח מנסה להתחבר לשירות memcached.staging.svc.cluster.local, הבקשה עוברת ל-Cluster DNS ובתגובה מקבלת את הכתובת של שירות זה מרשת שירות האשכול או מכתובת הפוד.
אנו מגדירים אשכולות K8s באמצעות kubeadm, כאשר רשת המשנה של שירות ברירת המחדל היא 192.168.0.0/16, ורשת הפודים היא 10.244.0.0/16. בדרך כלל הכל עובד טוב, אבל יש כמה נקודות:
רשת משנה 192.168.*.* משמש לעתים קרובות ברשתות משרדיות של לקוחות, ואף לעתים קרובות יותר ברשתות ביתיות של מפתחים. ואז אנחנו מקבלים התנגשויות: נתבים ביתיים עובדים על רשת המשנה הזו וה-VPN דוחף את רשתות המשנה האלה מהאשכול ללקוח.
יש לנו מספר אשכולות (הפקה, במה ו/או מספר אשכולות פיתוח). לאחר מכן, כברירת מחדל, לכולם יהיו אותן רשתות משנה עבור פודים ושירותים, מה שיוצר קשיים גדולים לעבודה בו זמנית עם שירותים במספר אשכולות.
כבר מזמן אימצנו את הפרקטיקה של שימוש בתתי רשתות שונות עבור שירותים ופודים בתוך אותו פרויקט – באופן כללי, כך שלכל האשכולות יש רשתות שונות. עם זאת, ישנם מספר רב של אשכולות בפעולה שלא הייתי רוצה לגלגל עליהם מאפס, מכיוון שהם מריצים שירותים רבים, יישומים מצביים וכו'.
ואז שאלנו את עצמנו: איך משנים את רשת המשנה באשכול קיים?
חיפוש החלטות
הנוהג הנפוץ ביותר הוא ליצור מחדש כל שירותים עם סוג ClusterIP. כאופציה, יכול לייעץ וזה:
לתהליך הבא יש בעיה: לאחר שהכל מוגדר, הפודים מגיעים עם ה-IP הישן כשרת שמות DNS ב-/etc/resolv.conf.
מכיוון שעדיין לא מצאתי את הפתרון, הייתי צריך לאפס את כל האשכול עם איפוס kubeadm ולהפעיל אותו שוב.
אבל זה לא מתאים לכל אחד... להלן הקדמות מפורטות יותר למקרה שלנו:
נעשה שימוש בפלנל;
יש אשכולות גם בעננים וגם בחומרה;
ברצוני להימנע מפריסה מחדש של כל השירותים באשכול;
יש צורך בדרך כלל לעשות הכל עם מספר מינימלי של בעיות;
גרסת Kubernetes היא 1.16.6 (עם זאת, שלבים נוספים יהיו דומים עבור גרסאות אחרות);
המשימה העיקרית היא להבטיח כי באשכול פרוס באמצעות kubeadm עם רשת משנה שירות 192.168.0.0/16, החלף אותו ב 172.24.0.0/16.
ופשוט קרה שמזמן עניין אותנו לראות מה ואיך ב-Kubernetes מאוחסן ב-etcd, מה אפשר לעשות עם זה... אז חשבנו: "למה לא פשוט לעדכן את הנתונים ב-etcd, ולהחליף את כתובות ה-IP הישנות (תת-רשת) בחדשות? "
לאחר שחיפשנו כלים מוכנים לעבודה עם נתונים ב-etcd, לא מצאנו שום דבר שפתר את הבעיה לחלוטין. (אגב, אם אתה יודע על כלי עזר לעבודה עם נתונים ישירות ב-etcd, נשמח לקישורים). עם זאת, נקודת התחלה טובה היא etcdhelper מ-OpenShift(תודה לכותביו!).
כלי זה יכול להתחבר ל- etcd באמצעות אישורים ולקרוא נתונים משם באמצעות פקודות ls, get, dump.
הוסף etcdhelper
המחשבה הבאה היא הגיונית: "מה מונע ממך להוסיף את כלי השירות הזה על ידי הוספת היכולת לכתוב נתונים ל-etcd?"
זה הפך לגרסה שונה של etcdhelper עם שתי פונקציות חדשות changeServiceCIDR и changePodCIDR. עליה אתה יכול לראות את הקוד כאן.
מה עושות התכונות החדשות? אַלגוֹרִיתְם changeServiceCIDR:
ליצור deserializer;
הידור ביטוי רגולרי כדי להחליף את CIDR;
אנו עוברים על כל השירותים עם סוג ClusterIP באשכול:
פענוח הערך מ-etcd לאובייקט Go;
באמצעות ביטוי רגולרי נחליף את שני הבייטים הראשונים של הכתובת;
להקצות לשירות כתובת IP מרשת המשנה החדשה;
ליצור סדרה, להמיר את האובייקט Go ל-protobuf, לכתוב נתונים חדשים ל-etcd.
פונקציה changePodCIDR דומה בעיקרו changeServiceCIDR - רק במקום לערוך את מפרט השירות, אנו עושים זאת עבור הצומת ומשנים .spec.PodCIDR לרשת משנה חדשה.
עיסוק
שנה שירות CIDR
התוכנית ליישום המשימה פשוטה מאוד, אך היא כרוכה בזמן השבתה בזמן יצירה מחדש של כל הפודים באשכול. לאחר תיאור השלבים העיקריים, נשתף גם מחשבות כיצד, בתיאוריה, ניתן למזער את זמן ההשבתה הזה.
wget https://raw.githubusercontent.com/flant/examples/master/2020/04-etcdhelper/etcdhelper.go
go get go.etcd.io/etcd/clientv3 k8s.io/kubectl/pkg/scheme k8s.io/apimachinery/pkg/runtime
go build -o etcdhelper etcdhelper.go
4. שנה את רשת המשנה של השירות במניפסטים של מישור הבקרה של Kubernetes. בקבצים /etc/kubernetes/manifests/kube-apiserver.yaml и /etc/kubernetes/manifests/kube-controller-manager.yaml לשנות את הפרמטר --service-cluster-ip-range לרשת משנה חדשה: 172.24.0.0/16 במקום 192.168.0.0/16.
5. מכיוון שאנו משנים את רשת המשנה של השירות אליה kubeadm מנפיקה אישורים עבור apiserver (כולל), יש להנפיק אותם מחדש:
בואו נראה לאילו דומיינים וכתובות IP האישור הנוכחי הונפק עבורם:
openssl x509 -noout -ext subjectAltName </etc/kubernetes/pki/apiserver.crt
X509v3 Subject Alternative Name:
DNS:dev-1-master, DNS:kubernetes, DNS:kubernetes.default, DNS:kubernetes.default.svc, DNS:kubernetes.default.svc.cluster.local, DNS:apiserver, IP Address:192.168.0.1, IP Address:10.0.0.163, IP Address:192.168.199.100
אזהרה! ברגע זה, רזולוציית התחום מפסיקה לעבוד באשכול, שכן בפודים קיימים /etc/resolv.conf כתובת CoreDNS הישנה (kube-dns) רשומה, ו-kube-proxy משנה את חוקי iptables מרשת המשנה הישנה לחדשה. בהמשך המאמר נכתב על אפשרויות אפשריות למזער זמן השבתה.
בוא נתקן את ConfigMap במרחב השמות kube-system:
kubectl -n kube-system edit cm kubelet-config-1.16
- להחליף כאן clusterDNS לכתובת ה-IP החדשה של שירות kube-dns: kubectl -n kube-system get svc kube-dns.
kubectl -n kube-system edit cm kubeadm-config
- אנחנו נתקן את זה data.ClusterConfiguration.networking.serviceSubnet לרשת משנה חדשה.
מכיוון שכתובת kube-dns השתנתה, יש צורך לעדכן את תצורת kubelet בכל הצמתים:
7. אם אתה עוזב לפחות צומת אחד podCIDR ישן, אז kube-controller-manager לא יוכל להתחיל, ותרמילים באשכול לא יתוזמנו.
למעשה, שינוי podCIDR יכול להיעשות אפילו יותר פשוט (לדוגמה, כך). אבל רצינו ללמוד איך לעבוד עם etcd ישירות, כי יש מקרים של עריכת אובייקטים של Kubernetes ב-etcd - יחיד גרסה אפשרית. (לדוגמה, אתה לא יכול פשוט לשנות את שדה השירות ללא זמן השבתה spec.clusterIP.)
סך הכל
המאמר דן באפשרות לעבוד ישירות עם נתונים ב-etcd, כלומר. עקיפת ממשק ה-API של Kubernetes. לפעמים גישה זו מאפשרת לך לעשות "דברים מסובכים". בדקנו את הפעולות המפורטות בטקסט על אשכולות K8s אמיתיים. עם זאת, מצב המוכנות שלהם לשימוש נרחב הוא PoC (הוכחת הרעיון). לכן, אם אתה רוצה להשתמש בגרסה שונה של כלי השירות etcdhelper באשכולות שלך, עשה זאת על אחריותך בלבד.