Networking בקוברנטיס – איך Pods מדברים בניהם – מבט בסיסי

לקריאה מקדימה:
* קצת על קוברנטיס
* מה זה Node וקלסטרינג בקוברנטיס
* מה זה POD?
* איך ליצור קוברנטיס קלסטר בסיסי בקלות?


קוברנטיס מאפשר לנו ליצור Virtual Network שפועל בכל הקלסטר שלנו, כל Pod בקלסטר מקבל כתובת IP ייחודית ויכול לתקשר עם כל pod אחר בקלסטר – גם במיקרה שהPod רץ בNode אחר.

קוברנטיס תומך במספר רב של תוספים (Plugins) של networking, ברוב ההדגמות בבלוג, אני עושה שימוש בתוסף שקוראים לו Flannel – כדי להתקין אותו עקבו אחר ההוראות שמופיעות כאן.

הקובץ Yaml הבא יוצר לדוגמה 3 Pods (להלן 3 רפליקות), כאשר כל POD יריץ קונטיינר (Docker) של Nginx

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx
  labels:
    app: nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.15.4
        ports:
        - containerPort: 80

אנו ניצור POD נוסף שיריץ busybox , באמצעותו נוכל לבדוק את הקישוריות שלנו בין הPODS השונים (נשתמש בCURL).

apiVersion: v1
kind: Pod
metadata:
  name: avivbusybox
spec:
  containers:
  - name: avivbusybox
    image: radial/busyboxplus:curl
    args:
    - sleep
    - "2000"

לאחר מכן נריץ את הפקודה הבאה כדי לקבל רשימה של הPODS שלנו כולל כתובת הIP שלהם:

kubectl get pods -o wide

בשלב האחרון ננסה להריץ CURL מתוך הbusybox שלנו לכתובת הIP של הפודים האחרים שלנו, כאשר את ה00.00.00.00 אנו נחליף בכתובת הIP של הפוד אליו אתה רוצים לבצע את הCURL.
הפקודה kubectl exec busybox בעצם מריצה את הcurl 00.00.00.00 בתוך POD הbusybox שלנו.

kubectl exec busybox -- curl 00.00.00.00

במידה והצלחנו לבצע CURL וקיבלנו את עמוד הדיפולט של Nginx זה בעצם מוכיח, שPODS יכולים לתקשר בניהם, גם אם הם ממוקמים בNodes אחר ושההתקנה של Flannel בוצעה בהצלחה.

לקריאה נוספת:
* הגדרות רשת עם Flannel
* https://kubernetes.io/docs/concepts/cluster-administration/networking/
* https://kubernetes.io/docs/concepts/extend-kubernetes/compute-storage-net/network-plugins/
* https://github.com/coreos/flannel


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

יצירת kubernetes קלסטר בסיסי בקלות

מדריך ליצירת kubernetes קלסטר בסיסי בקלות

לא יודעים מה זה קוברנטיס? ליחצו כאן


פירוט השלבים:
שלב 1: התקנת DOCKER
שלב 2: התקנת kubeadm, kubelet ו kubectl
שלב 3: הפעלת המסטר נוד (Master Node) שלנו
שלב 4: צירוף 2 הNODES שלנו לקלסטר
שלב 5: הגדרות רשת עם Flannel

מכונה = Node
לשם ההדגמה אנו ניצור kubernetes קלסטר שמורכב מ3 מכונות , 2 מכונות שיהיו הNODES ומכונה אחת שתהיה הNode Master שלנו.
לשרת המסטר שלנו נקרא k8master , לשרת NODE הראשון נקרא k8node1 ולשני k8node2
ההפצה שבחרתי לעבוד איתה בהדגמה היא Ubuntu 18 LTS

בMASTER שלנו אנו נתקין:
* Docker
* Kubeadm
* Kubelet
* Kubectl
* Control Plane

בנודים שלנו נתקין:
* Docker
* Kubeadm
*Kybelet
*Kubectl

ולשם קישוריות רשת נשתמש בFlannel


השלב הראשון – התקנת DOCKER

השלב הראשון הוא להתקין DOCKER בכל אחת מהמכונות שלנו (במקרה שלנו 3 מכונות שמריצות אובונטו), להסבר איך להתקין ניתן ללחוץ כאן


השלב השני: התקנת kubeadm, kubelet ו kubectl

השלב השני הוא להתקין את השירותים הנל בכל אחת מהמכונות שלנו, להסבר כיצד ניתן להתקין אותם באובונטו ניתן ללחוץ כאן


השלב השלישי: הפעלת המסטר נוד (Master Node) שלנו

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

sudo kubeadm init --pod-network-cidr=10.244.0.0/16

אחרי כמה דקות, נקבל פלט שמכיל את הפקודה אותה אני נצטרך להריץ אחכ בכל Node שלנו על מנת שהוא יוכל להצטרף לקלסטר. חשוב לשמור את הפקודה ואת הטוקן – כי בלעדיו לא תוכלו לצרף Nodes לCluster שלכם. במקרה שלי הפלט שהתקבל הוא

kubeadm join 172.31.20.227:6443 --token k1vs3a.4i3zgo4zw725o3y7 --discovery-token-ca-cert-hash sha256:c94bb285d99e80c3674d8cc8951f957231b35431d5e0be982d4c0e9618156e06

לאחר מכן נריץ את הפקודה הבאה:

mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

ולבסוף נוודא שהכל בוצע במסטר שלנו על ידי הפקודה:

kubectl version

כאשר הפלט שאנו נקבל אמור להיות דומה ל:


Client Version: version.Info{Major:"1", Minor:"12", GitVersion:"v1.12.7", GitCommit:"6f482974b76db3f1e0f5d24605a9d1d38fad9a2b", GitTreeState:"clean", BuildDate:"2019-03-25T02:52:13Z", GoVersion:"go1.10.8", Compi3f1e0f5d24605a9d1d38fad9a2b", GitTreeState:"clean", BuildDate:"2019-03-25T02:52:13Z", GoVersion:"go1.10.8", Compiler:"gc", Platform:"linux/amd64"}                                                  dea457638b614ee17ef234dc34a6", GitTreeState:"clean", BuildDate:"2019-07-08T03:40:54Z", GoVersion:"go1.10.8", Comp
Server Version: version.Info{Major:"1", Minor:"12", GitVersion:"v1.12.10", GitCommit:"e3c134023df5dea457638b614ee17ef234dc34a6", GitTreeState:"clean", BuildDate:"2019-07-08T03:40:54Z", GoVersion:"go1.10.8", Compiler:"gc", Platform:"linux/amd64"}

אם נריץ את הפקודה הבאה במסטר שלנו

kubectl get nodes

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

user@servername:~$ kubectl get nodes
NAME                          STATUS     ROLES    AGE    VERSION
servername.serverdomain.com   NotReady   master   4m3s   v1.12.7

השלב הרביעי: צירוף 2 הNODES שלנו לקלסטר

בכל אחד מהשרתים האחרים שלנו, k8node1 ו k8node2 נריץ את הפקודה שקיבלנו (בשלב 3) מקודם שמכילה את הטוקן. במקרה שלי היא הייתה:

kubeadm join MYIPADDRESS:6443 --token k1vs3a.4i3zgo4zw725o3y7 --discovery-token-ca-cert-hash sha256:c94bb285d99e80c3674d8cc8951f957231b35431d5e0be982d4c0e9618156e06

אחרי שהרצנו את הפקודה ב2 השרתים (ייתכן ותתבקשו להוסיף sudo) נריץ בשרת הMaster שלנו (k8master) שוב את הפקודה הבאה:

user@servername:~$ kubectl get nodes

NAME                          STATUS     ROLES    AGE   VERSION
servername1.serverdomain.com   NotReady   master   10m   v1.12.7
servername2.serverdomain.com   NotReady   <none>   40s   v1.12.7
servername3.serverdomain.com   NotReady   <none>   85s   v1.12.7

ושימו לב שהפעם המסטר שלנו מזהה את 2 השרתים האחרים, כולם עדיין בסטטוס של NotReady.


השלב החמישי: הגדרות רשת עם Flannel

לקריאה מקדימה על networking בקוברנטיס:

בכל 3 המכונות (Nodes) – כולל מכונת הMaster שלנו נריץ את הפקודות הבאות

echo "net.bridge.bridge-nf-call-iptables=1" | sudo tee -a /etc/sysctl.conf
sudo sysctl -p

בשרת הMaster שלנו – ורק בו! נריץ את הפקודה הבאה:

kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/bc79dd1505b0c8681ece4de4c0d86c5cd2643275/Documentation/kube-flannel.yml

לאחר מכן, כשנריץ את הפקודה:

kubectl get nodes

שוב, אנו אמורים לראות את 3 המכונות שלנו אבל הפעם כולן יהיו בסטטוס Ready.
נוכל להריץ גם את הפקודה הבאה:

kubectl get pods -n kube-system

שתאפשר לנו לראות גם את הPods שקשורים לFlannel


זהו, סיימנו להגדיר. מזל טוב!
קריאה נוספת:
לאתר הבית של קוברנטיס לקריאה נוספת ליחצו כאן
מה זה Pod?



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