קצת על קוברנטיס (Kubernetes)

קצת על קוברנטיס (Kubernetes)

קוברנטיס הוא כלי לאוטומטציה וניהול של קונטיינרים.

ההיררכיה בקוברנטיס היא:
Cluster – > Node – > Pod

למה אנחנו צריכים אותו?

  • לאפשר לקונטיינרים לתקשר בניהם כאשר הם נמצאים בNODES שונים
  • למנוע כפילות של כתובת IP זהה בין דוקרים שממוקמים בNODES שונים
  • כשמחליפים קונטיינר – הוא בדרכ יקבל כתובת IP חדשה שזה מצב שאנו לא תמיד מעוניינים בו.
  • היחידה הקטנה ביותר בקוברנטיס נקראת POD,
    הPOD יכול להכיל קונטיינר אחד או קבוצה של קונטיינרים. כל הקויינטנרים שנמצאים באותו POD יקבלו את אותה כתובת IP, וכל POD שממוקם בקלסטר יקבל כתובת IP ייחודית באותו IP SPACE.
  • כל הקונטיינרים יכולים לתקשר עם קונטיינרים אחרים ללא NAT.
  • כתובת הIP שהקונטיינר מזהה ככתובת IP ששייכת לו היא אותה כתובת IP שהקונטיינרים האחרים רואים כשייכת להם.

הNetwork Overlay אחראי על חלוקת כתובת הIP.
הEtcd הוא Key-Value דאטאבייס לאובייקטים של קוברנטיס
הKubelet הוא הסרביס של קוברנטיס שרץ על כל הנודים בקלסטר – גם במאסטר וגם בWORKERS.


קוברנטיס כולל רכיבים שונים שעובדים ביחד ומאפשרים את תפקודו של הקוברנטיס קלסטר. כדי לראות את כל הPODS שאחראים על תפקודו של הקוברנטיס שלנו נריץ את הפקודה הבאה:

kubectl get pods -n kube-system

כל POD שמופיע לנו הוא בעצם POD שמריץ בתוכו רכיב שקשור לקוברנטיס עצמו. הרכיבים העיקריים הם:

kube-apiserver
זהו הAPI הראשי של קוברנטיס. הוא מבוסס REST. למשל הפקודה שהרצנו מקודם – kubectl get pods מבצעת למעשה פנייה לAPI.

etcd
מנהל את נושא המידע – סטורג של הקלסטר. לא מדובר בסטורג' שמאחסן בתוכו את האתר את הקבצים שלנו למשל, מדובר בסטורג שמחזיק את הדאטא שקשור לכמה PODS רצים כרגע, NODES, איזה כתובת IP יש לכל אחד וכו – כל המידע שדרוש לקוברנטיס בשביל לנהל ולהחזיק את הקלסטר שלנו.
במידה ויש לנו יותר מMASTER אחד, etcd ידאג שהדאטא הזה יהיה מסונכרן בין כל הMasters שלנו.

kube-controller-manager
מאחד בתוכו רכיבים שונים לחבילה אחת.
הוא מחזיק בתוכו את כל השירותים והספריות הדרושות לקוברנטיס. אם אנו מתייחסים ל jube-apiserver כפרונט של קוברנטיס, אזי ה kube-controller-manager הוא למעשה הבקאנד של קוברנטיס.

kube-scheduler
אחראי על יצירת הPODS, מתי להריץ אותם, מתי לכבות אותם, באיזה Node עצמאי להריץ אותם וכו.

kube-proxy
כל NODE זקוק לkube-proxy שלנו, הוא אחראי על התקשורת בין הNODES השונים על ידי הוספת כללי Firewall. כאשר POD בNODE X צריך לדבר עם POD שממוקם בNODE Y חייב להיות ROUTE וRULE שמאפשר את זה.

kubelet
הAGENT שמריץ את הקונטיינרים שלנו בכל NODE. הוא בעצם המתווך בין הAPI של קוברנטיס לדוקר. (Docker במקרה שלנו, אגב קוברנטיס תומך לא רק בדוקר).
הוא רץ כSERVICE ולא כPOD (כי הוא אחראי למעשה על הרצת הקונטיינר) ולכן הוא לא מופיע לנו ברשימת הPODS. כדי לראות אותו נריץ את הפקודה:

sudo systemctl status kubelet

מצאתם טעות? הערות? שאלות? הסתדרתם? נתקעתם? כתבו לי בתגובות!

מה זה Kubernetes Pod?

Pods הוא היחידה הבסיסית ביותר של קוברנטיס. כל Pod מורכב מקונטיינר אחד או יותר (בדרכ יש קונטיינר אחד בכל POD אבל ניתן שיהיה יותר מקונטיינר אחד), כתובת IP בתוך הקוברנטיס קלסטר ואיחסון (Storage).
כל Pod אחד או יותר יוצרים ביחד Node. קלסטר מורכב מNode אחד או יותר.

כשאנחנו מפעילים Pod, קוברנטיס בעצם מתזמן – Schedules
Pod שיריץ אותו. הPod יריץ את כל הקונטיינטרים שם חלק מאותו Pod.

כדי ליצור POD, אנו משתמשים בקובץ YAML שמכיל את הפרטים של אותו POD.
לדוגמא, אם נירצה ליצור POD שמריץ קונטיינר Nginx ניצור קובץ בשם ourtamlefilename.yaml לדוגמא עם הפרטים הבאים:

apiVersion: v1
kind: Pod
metadata:
  name: nginx
spec:
  containers:
  - name: nginx
    image: nginx

בקובץ הנל, אנו בעצם מבקשים ליצור POD בשם nginx, ובנוסף מבקשים לבנות בו דוקר קונטיינר בשם nginx כאשר אנו מציינים לדוקר להשתמש בimage של nginx.

ואז נריץ את הפקודה

kubectl create -f ouryamlfilename.yaml

ניתן לדלג על שלב יצירת הקובץ על ידי העברה של התוכן ישירות לkubectl על ידי הפקודה הבאה לדוגמא:

cat << EOF | kubectl create -f -
apiVersion: v1
kind: Pod
metadata:
  name: nginx
spec:
  containers:
  - name: nginx
    image: nginx
EOF

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

כדי לראות את כל הPods הקיימים שלנו נריץ את הפקודה

kubectl get pods

וכדי לראות פרטים נוספים אודות POD נריץ את הפקודה הבאה כאשר במקרה שלנו nginx זהו שם הPod שלנו

kubectl describe pod nginx

למחיקת הPOD שלנו נשתמש בפקודה הבאה:

kubectl delete pod nginx

מצאתם טעות? הערות? שאלות? הסתדרתם? נתקעתם? כתבו לי בתגובות!