מושגים בסיסיים בקוברנטיס

14/12/2021

פוסט זה כולל טיפ קצר על Docker. אם אתם רוצים ללמוד יותר לעומק על פיתוח עם Docker, Docker Compose או Kubernetes תשמחו לשמוע שבניתי קורס וידאו מקיף בנושא זה.
למידע נוסף והצטרפות לקורס בקרו בדף קורס Docker כאן באתר.
 

שמעתם על קוברנטיס אבל לא בטוחים מה זה? רוצים ללמוד ולא יודעים אפילו איפה להתחיל? הפוסט הזה בשבילכם ואני מקווה שאצליח לעשות קצת סדר באוקיינוס שנקרא קוברנטיס, לפחות בהתחלה שלו.

1. קוברנטיס היא מערכת הפעלה לקלאסטרים

אתם יודעים כבר שלמחשבים יש מערכות הפעלה: יש Windows, Linux ו OS/X; לטלפונים יש את Android ו iOS ועוד כמה וגם מכשירי IOT הרבה פעמים מגיעים עם איזושהי מערכת הפעלה מבוססת לינוקס.

מה שלא כל כך אינטואיטיבי הוא המחשבה שאפשר לייצר מערכת הפעלה גם למשהו שהוא לא מחשב. למשהו גדול יותר ממחשב. במקרה שלנו לאוסף של שרתים. אוסף של שרתים נקרא Cluster וקוברנטיס הוא (היא?) מערכת הפעלה לקלאסטרים.

מערכת הפעלה רגילה של מחשב אחראית על הפעלת תוכניות וניהול וחלוקת משאבי המערכת לתוכניות שרצות. היא גם דואגת שתוכניות לא ידרסו אחת את השניה, ומספקת לתוכניות גישה קלה ואחידה להתקני הקלט פלט של המחשב. כלומר אם יש לי תוכנית שכתובה למערכת הפעלה Windows, אז זה לא משנה לה איזה סוג מקלדת מחוברת למחשב או אפילו אם זו מקלדת אלחוטית. התוכנית מקבלת את הקלט באמצעות התיווך של מערכת ההפעלה ויכולה לעבוד באותה צורה עם כל המקלדות.

מערכת הפעלה של קלאסטר לוקחת קונספט דומה, ומאפשרת לנו לכתוב "תוכניות" שרצות על הקלאסטר. תוכנית שרצה על קלאסטר תהיה בדרך כלל סוג של סרביס שמקבל בקשות ושולח תשובות - כמו Web Application או בסיס נתונים. קוברנטיס תפעיל את היישומים האלה, תדאג לחלק להם את משאבי הקלאסטר - כלומר תחליט מי ירוץ על איזה שרת ואיזה חלק מהשרת הוא יקבל - ותדאג להשאיר אותם בחיים ולהפעיל אותם מחדש אם אחד מהם מתרסק.

וכמו שתוכנית רגילה לא צריכה להכיר את החומרה עצמה עליה היא רצה, כי היא תמיד עובדת בתיווך מערכת ההפעלה, כך תוכנית שרצה בתוך קוברנטיס לא חייבת להכיר את השרתים עצמם עליהם היא רצה, ויכולה להניח שהם מתנהגים בצורה מסוימת - לפי הממשק שהתוכנית מקבלת מקוברנטיס, כלומר ממערכת ההפעלה.

2. תוכניות הן אימג'ים, תהליכים הם קונטיינרים

כמו שמערכת הפעלה של מחשבים יודעת לקחת קבצי הפעלה - לדוגמה ב Windows קבצי EXE - ולהפעיל אותם, כלומר ליצור מהם תהליכים על המחשב, כך קוברנטיס יודעת לקחת קבצי הפעלה שהם OCI Images וליצור מהם תהליכים שהם Containers.

אימג' הוא כל מה שאתם מכירים מעבודה עם Docker או Podman. זה מידע בינארי שמתאר אפליקציה מסוימת ואת כל התלויות של אותה אפליקציה. אימג'ים מאוחסנים ב Registries וגם לפני קוברנטיס ידענו להפעיל קונטיינר מתוך אימג' עם דוקר לדוגמה באמצעות הפעלת:

$ docker run hello-world

קוברנטיס בתור מערכת הפעלה יודע (יודעת?) לקחת אימג'ים כמו ה hello-world שלנו ולהריץ אותם על הקלאסטר, כלומר לבנות מהם קונטיינר ולתת לאחת המכונות בקלאסטר להריץ את הקונטיינר הזה. קוברנטיס גם תשים לב אם הקונטיינר מתרסק ותדע להפעיל קונטיינר חדש מאותו אימג'.

במערכת הפעלה רגילה אנחנו משתמשים בתוכנת Installer כדי להתקין את התוכניות שלנו. זה לא נדיר להוריד מהרשת קובץ בסיומת msi, להריץ אותו וכך לקבל תוכנה כזאת או אחרת זמינה לנו על המחשב. בקוברנטיס ההתקנה מתבצעת באמצעות קבצי טקסט בפורמט YAML שמתארים לקלאסטר מה האימג' שאנחנו רוצים להתקין ומה דרישות המערכת שהוא צריך.

לדוגמה הקובץ הבא הוא YAML שמגדיר Deployment (שזו התקנה) של אימג' של שרת הווב nginx:

apiVersion: apps/v1
kind: Deployment
metadata:
  annotations:
    kompose.cmd: kompose convert
    kompose.version: 1.25.0 (a70f80cc)
  creationTimestamp: null
  labels:
    io.kompose.service: nginx
  name: nginx
spec:
  replicas: 1
  selector:
    matchLabels:
      io.kompose.service: nginx
  strategy: {}
  template:
    metadata:
      annotations:
        kompose.cmd: kompose convert
        kompose.version: 1.25.0 (a70f80cc)
      creationTimestamp: null
      labels:
        io.kompose.service: nginx
    spec:
      containers:
        - image: nginx
          name: nginx
          ports:
            - containerPort: 80
          resources: {}
      restartPolicy: Always
status: {}

3. פודים, דיפלומנטס וסרביסים

שלושה מושגים שכדאי להכיר כבר מתחילת העבודה שלכם עם קוברנטס הם Pod, Deployment ו Service (יש עוד הרבה, אבל את שלושת אלה נצטרך ממש מהשניה הראשונה):

  1. פוד הוא קונטיינר. או לפחות לתקופה הקרובה יהיה לנו נוח מאוד לחשוב עליו בתור קונטיינר. פוד זה משהו שרץ על שרת מתוך אימג', וקוברנטיס יוודא שאותו פוד ימשיך לרוץ כל עוד צריך אותו ואם הוא מתרסק קוברנטס ירים אחד חדש במקומו.

  2. דיפלוימנט זה מה שיוצר את הפודים, כלומר זאת התקנה של תוכנה. מרגע ששלחתם Deployment לקוברנטיס הוא (היא?) ינסה ליצור קונטיינרים (פודים) מתוך התיאור שמופיע ב Deployment.

  3. סרביס זאת הדרך שלנו להתחבר לפוד. תזכרו שלקוברנטיס יש קלאסטר שלם של שרתים עליו הוא יכול להריץ את הפוד שלכם, וגם אם ישעמם לו או אם אחד השרתים יהיה עמוס קוברנטיס יוכל להזיז את הפוד משרת לשרת. סרביס זה סוג של מיפוי פורטים שאומר שכשמתחברים לפורט מסוים ב IP הציבורי של הקלאסטר אז קוברנטיס צריך לחבר אתכם לפוד המתאים, איפה שהוא לא רץ כרגע.

כל אחד מהשלושה יכול להיות מיוצג על ידי קובץ YAML שמתאר את המאפיינים שלו. ראינו כבר קובץ YAML עבור Deployment, ואם אתם סקרנים אז הנה קובץ YAML פשוט עבור סרביס:

apiVersion: v1
kind: Service
metadata:
  annotations:
    kompose.cmd: kompose convert
    kompose.version: 1.25.0 (a70f80cc)
  creationTimestamp: null
  labels:
    io.kompose.service: nginx
  name: nginx
spec:
  type: NodePort
  ports:
    - name: "80"
      port: 80
      targetPort: 80
  selector:
    io.kompose.service: nginx
status:
  loadBalancer: {}

הקובץ מתאר סרביס שמתחבר ל Deployment של ה nginx שיצרנו קודם. המפתח להבין את הקובץ הוא הבלוק שמתחיל במילה selector, שקובע לאיזה תוכנית הסרביס הזה צריך לחבר אותנו, ו port שקובע לאיזה פורט צריך להתחבר שם.

קוברנטיס והענן: התקני קלט ופלט

עד לפה ראינו שקוברנטיס היא (הוא?) מערכת הפעלה לקלאסטרים. ראינו שהתפקיד שלה הוא להפעיל תוכניות, כלומר אימג'ים, ולייצר מהם קונטיינרים ולוודא שאותם קונטיינרים ממשיכים לרוץ ומקבלים את משאבי השרת שהם צריכים.

היבט נוסף בו אנלוגיית מערכת ההפעלה תעזור לנו להבין את קוברנטיס הוא הגישה להתקני קלט ופלט. מערכת הפעלה כזכור לכם מחברת את התוכניות שרצות על המחשב עם החומרה של המחשב באמצעות דרייברים. תוכנית לא כותבת ישירות לדיסק אלא בתיווך מערכת ההפעלה. תוכנית לא קוראת ישירות מהמקלדת אלא בתיווך מערכת ההפעלה.

באותו האופן קוברנטיס מתווך את הגישה של הקונטיינרים למשאבים חיצוניים שנשמרים בענן. לדוגמה:

  1. מערכת הקבצים של קונטיינר לא שורדת כשהקונטיינר נסגר. בתיווך קוברנטיס הקונטיינר יכול לקבל Volume שזה מקום על הדיסק שאפשר לכתוב אליו והמידע יישמר גם כשהקונטיינר ייסגר.

  2. קונטיינר יכול לקבל מידע סודי באמצעות מנגנון Secrets של קוברנטיס.

  3. קונטיינר יכול לקבל משתני סביבה שמועברים אליו מתוך קוברנטיס.

קלאסטרים שונים יכולים לממש את ההתקנים החיצוניים בדרכים שונות: לדוגמה קלאסטר קוברנטיס שרץ על ענן של Azure יכול לחבר Volume לכונן אחסון בענן של אזור, וקלאסטר אחר שרץ על אמזון יחבר את ה Volume לכונן אחסון בענן של אמזון. מבחינת התוכנית שלנו שרצה בתוך הקלאסטר הגישה היא זהה בשני המקרים. אנחנו מקבלים Volume וקוברנטיס אחראי על מיפוי אותו Volume להתקן האיחסון החיצוני.

4. איך ממשיכים מכאן

ואם ההקדמה הזאת עשתה לכם חשק להמשיך וללמוד קוברנטיס תשמחו לשמוע שיש אינסוף מדריכים טובים ברשת כולל כאלה שיתנו לכם לתרגל בצורה אינטרקטיבית. אני ממליץ להתחיל מהקישור הזה: https://kubernetes.io/docs/tutorials/kubernetes-basics/ שכולל סידרה של 6 טוטוריאלס אינטרקטיביים לעבודה עם קוברנטיס והתקנת יישומים באמצעותו.

עמוד התיעוד הראשי של קוברנטס הוא גם מקום לימוד מצוין אם אתם אוהבים לקרוא מגילות של טקסט (נו אל תדאגו יש גם תמונות). קישור: https://kubernetes.io/docs/concepts/