היום נדבר על כלי סופר חשוב וסופר מעניין – Kubernetes. בעיניי, זה אחד הכלים השימושיים והמורכבים ביותר בעולם ה-DevOps. נבין בשביל מה משתמשים בו, מה החוזקות שלו ומושגים שכדאי להכיר.
מה זה Kubernetes?
- כלי Opensource לניהול ופריסה אוטומטית של containers.
- כלי אורקסטרציה (יודע לנהל משימות אוטומטיות רבות ולחבר ביניהם).
הוא עוזר לצמצם תהליכים ידניים ולהחליף אותם בתהליכים אוטומטיים שימושיים עבור המערכות שלנו.
מה Kubernetes יודע לעשות?
בעזרתו, ניתן לנהל בצורה נוחה סביבות מרובות container-ים.
מדוע שנרצה יותר מ-container אחד עבור המערכת שלנו? יש לא מעט סיבות לכך.
ראשית, עדיף לא להיות תלוי בשרת אחד כדי שאם הוא יקרוס/ייהרס יהיה לנו עוד Instance זמין של המערכת. שנית, כך אפשר לפזר עומסים (נוכל להפנות חלק מהלקוחות למקום אחד וחלק מהלקוחות למקום זהה אחר). בנוסף, מתודולוגיות פיתוח מתקדמות כמו microservices בונות על כך שכל חלק באפליקציה יהיה מופרד ויישב בסביבה מבודלת מהשאר (לדוגמא, container).
עוד יכולת מאוד חשובה הוא היכולת לעשות deploy לשינויים באפליקציה מבלי “להוריד” את השרת זמנית. No more דברים כמו the site can’t be reached או Error 502. כשיש למערכת שלנו לקוחות, אחד הדברים החשובים ביותר הוא שהיא תהיה זמינה 24/7. בזכות השיטה של Kubernetes עבור deploy, אפשר להשהות זמנית שרת אחד, להחיל עליו את השינויים ובזמן הזה להפנות את הלקוחות לשרת אחר שהוא זהה לגמרי. מדהים לא?
בנוסף, הוא חוסך מאיתנו זמן והתעסקות בדברים ששייכים לאזורי ה-IT. לדוגמא, הוא יכול להקטין ולהגדיל משאבים (כמו ram, cpu) בצורה אוטומטית.
Kubernetes Architecture
Kubernetes עובד בתצורת master, worker. ה-master אחראי לניהול של ה-worker-ים ולניהול של המערכת עצמה. כל worker אחראי על ה-containerים שרצים עליו ועל עוד רכיבים שנדבר עליהם עכשיו. worker זה גם Node (שזה שרת פיזי או וירטואלי)
הכנתי עבורכם מקבץ מושגים שכדאי להכיר:
Controller – אחראי על התקשורת בין ה master-ים ובין ה-master ל-nodes. בנוסף, הוא בודק את ה-desired states של ה-service-ים שלנו ומוודא שהם במצב שבו הם אמורים להיות.
Scheduler – מסדיר ומווסת את המשימות על ה-nodes. הוא שומר את ה-resource usage לכל node.
Node/Worker – מכיל את כל ה-service-ים הדרושים כדי לנהל את התקשורת בין ה-container-ים, ובין ה-node ל-master. הוא גם יידע להקצות משאבים ל-container-ים שנמצאים עליו.
Kubelet – רכיב שמתקשר עם ה-master. הוא אחראי על לנהל ולתחזק את ה-Pods ב-worker node שהוא נמצא עליו.
Pod – קבוצה שמורכבת מ-container אחד או יותר עם רשת ואחסון משותפים. היא מחזיקה גם את ההוראות שמתייחסים לאיך להריץ את ה-container-ים. כל pod יכול לרוץ על כמה מכונות וכמה pod-ים יכולים לרוץ באותה מכונה.
Kube proxy – רץ על כל node כדי לוודא שה-service-ים זמינים חיצונית, כלומר אפשר לגשת אליהם מחוץ לשרת עליו הם נמצאים.
Etcd – רכיב שאחראי לאחסון מידע בתצורת key value שמאפשר אחסון, שיתוף וסנכרון מידע בקרב nodes שונים. שם נשמרים קונפיגורציות, state-ים של רכיבים אחרים, מידע פנימי של Kubernetes ועוד.
דוגמא להמחשה של הארכיטקטורה:
Rolling updates
תמיד נרצה שהמערכות שלנו יהיו למעלה, גם כשמשדרגים אותם. Kubernetes עוזר לנו להשיג את זה בעזרת rolling updates. זה מנגנון חכם שמאפשר לנו לבצע שינויים במערכת מבלי להשבית אותה. כדי שזה יקרה חייבים שיהיה למערכת לפחות שני Instance-ים רצים. ניקח לדוגמא מערכת שיש לה שני Instance-ים, סדר הפעולות יהיה כזה:
- “השבתה” זמנית של Instance אחד.
- הפניית הלקוחות ל-Instance השני.
- החלפת התוכן של ה-Instance הראשון בתוכן החדש.
- הפניית הלקוחות ל-Instance הראשון המעודכן
- “השבתה” זמנית של Instance שני.
- החלפת התוכן של ה-Instance השני בתוכן החדש.
- הפניית הלקוחות לשני ה-Instance-ים בצורה חכמה שתחלק עומסים.
ב-Kubernetes אפשר להחזיר את השינויים שלנו אחורה! כלומר לעשות deploy לגרסא ישנה יותר וכמובן, מבלי שהמערכת תהיה למטה.
Load balancing
יש Service שאחראי על פיזור העומסים החכם שנקרא Load balancer. יש לו שני סוגים עיקריים:
- Ingress – הוא חושף services מתוך ה-cluster החוצה בעזרת ניתוב של http/https. כך, התעבורה מנוהלת על ידו (כשפונים ל-cluster הוא מקבל את התעבורה ראשון). זה בעצם service שמקבל תעבורה ויודע לחלק אותה בצורה חכמה בין ה-pod-ים. זה built in Load balancer ב-Kubernetes.
- External load balancer – כשה-Kubernetes שלנו רץ על ה-cloud אפשר להשתמש ב-load balancer חיצוני שמיוצר על ידי ה-cloud provider שלנו כדוגמת azure, gcp, aws, oracle cloud. לכל אחד מהם יש יתרונות וחסרונות על פני אחרים אבל בסוף כולם די זהים.
Liveness & Readiness probe
ב-Kubernetes אפשר להגדיר בדיקות עבור ה-containerים שלנו.
Liveness probe – בדיקה שבודקת נתיב מסוים כדי לראות שה-container עלה כמו שצריך. לדוגמא, בדיקה שעמוד הבית של המערכת שלנו מחזיר status code תקין עבור בקשת Get פשוטה.
Readiness probe – בדיקה שנועדה כדי לקבוע האם האפליקציה סיימה לעלות בצורה תקינה ומוכנה לקבל תעבורה. לדוגמא, נגדיר שברגע שהאפליקציה סיימה לעלות – היא תכתוב טקסט מסוים לקובץ כלשהו. הבדיקת Readiness תעבור רק כשיהיה את התוכן הזה בקובץ שלנו (היא תקרא את הקובץ כל זמן מסוים).
בדיקת Readiness מתמקדת בבידוד ה-container ואי חשיפתו ללקוחות כל עוד הוא לא עבר את הבדיקה. בדיקת Liveness מיועדת לבדיקה שה-container רץ ואם לא – kubelet ירסט אותו.
עוד כמה דברים חשובים שכדאי להכיר
- Kubernetes לא בא עם gui מובנה, אבל יש תוכנות שאפשר להתקין שיעזרו לנו בזה.
- לא כל כך קל להתקין Kubernetes, אבל יש מדריכים מפורטים באינטרנט (אפשר להתקין לוקאלית ואפשר להתקין ב-cloud)
- אפשר לחלוק מידע בין container-ים שונים שנמצאים באותו Pod.
- כשרושמים k8s מתכוונים ל-Kubernetes (קיצור דרך נפוץ).
לסיכום, דיברנו על מה זה Kubernetes | k8s, איך הוא עוזר לנו והבנו איך הוא פועל מאחורי הקלעים. אני מזמין אתכם לתרגל קצת Kubernetes בעצמכם כאן.