במדריך הזה נסביר איך להשתמש במדיניות רשת של אשכול כדי לקבוע אילו Pods יקבלו תעבורת נתונים נכנסת ואילו Pods יוכלו לשלוח תעבורת נתונים יוצאת. מידע נוסף זמין במאמר בנושא יצירת מדיניות רשת ב-Kubernetes של אשכול.
כללי מדיניות של רשת מאפשרים לכם להגביל את החיבורים בין קבוצות Pod. לכן, שימוש במדיניות רשת מספק אבטחה טובה יותר כי הוא מצמצם את רדיוס הפגיעה.
חשוב לזכור שמדיניות הרשת קובעת אם חיבור מותר, והיא לא מציעה תכונות ברמה גבוהה יותר כמו הרשאה או העברה מאובטחת (כמו SSL/TLS).
מטרות
במדריך הזה תלמדו:- איך יוצרים אשכולות עם אכיפה של מדיניות הרשת
- איך מגבילים את התנועה הנכנסת ל-Pods באמצעות תוויות
- איך מגבילים את התנועה היוצאת מ-Pods באמצעות תוויות
עלויות
במסמך הזה משתמשים ברכיבים הבאים של Google Cloud, והשימוש בהם כרוך בתשלום:
כדי ליצור הערכת עלויות בהתאם לשימוש החזוי, אתם יכולים להשתמש במחשבון התמחור.
כשמסיימים את המשימות שמתוארות במסמך הזה אפשר למחוק את המשאבים שיצרתם כדי להימנע מחיובים נוספים. מידע נוסף זמין בקטע הסרת המשאבים.
לפני שמתחילים
כדי להפעיל את Kubernetes Engine API:- נכנסים ל דף Kubernetes Engine במסוף Google Cloud .
- יוצרים או בוחרים פרויקט.
- מחכים עד שממשק ה-API והשירותים הקשורים יופעלו. הפעולה עשויה להימשך כמה דקות.
מתקינים את כלי שורת הפקודה הבאים שמשמשים במדריך הזה:
-
הדגל
gcloudמשמש ליצירה ולמחיקה של אשכולות Kubernetes Engine. gcloudכלול ב-gcloudCLI. -
kubectlמשמש לניהול Kubernetes, מערכת תזמור האשכולות שמשמשת את Kubernetes Engine. אפשר להתקין אתkubectlבאמצעותgcloud:gcloud components install kubectl
משכפלים את הקוד לדוגמה מ-GitHub:
git clone https://github.com/GoogleCloudPlatform/kubernetes-engine-samples cd kubernetes-engine-samples/networking/network-policies
הגדרת ברירות מחדל לכלי gcloud של שורת הפקודה
כדי לחסוך זמן בהקלדת מזהה הפרויקט ואפשרויות אזור Compute Engine בכלי gcloud של שורת הפקודה, אפשר להגדיר את ברירות המחדל:
gcloud config set project project-id gcloud config set compute/zone compute-zone
יצירת אשכול GKE עם אכיפה של מדיניות רשת ב-Kubernetes
כדי ליצור אשכול קונטיינרים עם אכיפה של מדיניות רשת, מריצים את הפקודה הבאה:
gcloud container clusters create test --enable-network-policy
הגבלת התנועה הנכנסת ל-Pods
משאבי Kubernetes NetworkPolicy מאפשרים להגדיר מדיניות גישה לרשת עבור קבוצות ה-Pod. אובייקטים מסוג NetworkPolicy מכילים את הפרטים הבאים:
Pods שכללי המדיניות של הרשת חלים עליהם, בדרך כלל מוגדרים באמצעות בורר תוויות
סוג התעבורת נתונים שהמדיניות רשת ב-Kubernetes משפיעה עליה: תעבורת נתונים נכנסת (ingress), תעבורת נתונים יוצאת (egress) או שניהם
במדיניות Ingress, אילו פודים יכולים להתחבר לפודים שצוינו
במקרה של מדיניות יציאה, הפודים שאליהם הפודים שצוינו יכולים להתחבר
קודם מריצים אפליקציית שרת אינטרנט עם התווית app=hello וחושפים אותה באופן פנימי באשכול:
kubectl run hello-web --labels app=hello \ --image=us-docker.pkg.dev/google-samples/containers/gke/hello-app:1.0 --port 8080 --expose
בשלב הבא, מגדירים NetworkPolicy כדי לאפשר תעבורה לקבוצות ה-Pod hello-web רק מקבוצות ה-Pod app=foo. תנועה נכנסת אחרת מ-Pods שלא כוללים את התווית הזו, תנועה חיצונית ותנועה מ-Pods במרחבי שמות אחרים נחסמות.
במניפסט הבא נבחרו קבוצות Pod עם התווית app=hello, וצוין כלל מדיניות של Ingress כדי לאפשר תעבורה רק מקבוצות Pod עם התווית app=foo:
כדי להחיל את המדיניות הזו על האשכול, מריצים את הפקודה הבאה:
kubectl apply -f hello-allow-from-foo.yaml
אימות מדיניות הכניסה
קודם מריצים Pod זמני עם התווית app=foo ומקבלים מעטפת ב-Pod:
kubectl run -l app=foo --image=alpine --restart=Never --rm -i -t test-1
שולחים בקשה לנקודת הקצה hello-web:8080 כדי לוודא שהתנועה הנכנסת מותרת:
/ # wget -qO- --timeout=2 http://hello-web:8080Hello, world! Version: 1.0.0 Hostname: hello-web-2258067535-vbx6z / # exit
התנועה מ-Pod app=foo אל app=hello Pods מופעלת.
לאחר מכן, מריצים Pod זמני עם תווית אחרת (app=other) ומקבלים מעטפת בתוך ה-Pod:
kubectl run -l app=other --image=alpine --restart=Never --rm -i -t test-1
שולחים את אותה בקשה כדי לראות שהתנועה לא מורשית ולכן פג הזמן הקצוב לתגובה לבקשה. לאחר מכן יוצאים מהמעטפת של Pod:
/ # wget -qO- --timeout=2 http://hello-web:8080wget: download timed out / # exit
הגבלת תנועה יוצאת מה-Pods
אפשר להגביל תנועה יוצאת כמו תנועה נכנסת.
עם זאת, כדי להריץ שאילתות על שמות מארחים פנימיים כמו hello-web או על שמות מארחים חיצוניים כמו www.example.com, צריך לאפשר רזולוציית DNS (מערכת שמות דומיין) במדיניות היציאה מהרשת. תנועת DNS מתרחשת ביציאה 53 באמצעות פרוטוקולי TCP ו-UDP.
כדי להפעיל כללי מדיניות של רשת ליציאה, צריך לפרוס NetworkPolicy ששולט בתעבורת נתונים יוצאת מקבוצות Pod עם התווית app=foo, תוך מתן אפשרות לתעבורת נתונים רק לקבוצות Pod עם התווית app=hello, וגם לתעבורת נתונים של DNS.
במניפסט הבא מוגדרת מדיניות רשת ב-Kubernetes ששולטת בתעבורת נתונים יוצאת (egress) מקבוצות Pod עם התווית app=foo, עם שני יעדים מותרים:
- Pods באותו מרחב שמות עם התווית
app=hello. - Pods באשכול או נקודות קצה חיצוניות ביציאה 53 (UDP ו-TCP).
כדי להחיל את המדיניות הזו על האשכול, מריצים את הפקודה הבאה:
kubectl apply -f foo-allow-to-hello.yaml
אימות מדיניות היציאה
קודם פורסים אפליקציית אינטרנט חדשה בשם hello-web-2 וחושפים אותה באופן פנימי באשכול:
kubectl run hello-web-2 --labels app=hello-2 \ --image=us-docker.pkg.dev/google-samples/containers/gke/hello-app:1.0 --port 8080 --expose
לאחר מכן, מריצים Pod זמני עם התווית app=foo ופותחים מעטפת בתוך מאגר התגים:
kubectl run -l app=foo --image=alpine --rm -i -t --restart=Never test-3
מוודאים שה-Pod יכול ליצור חיבורים אל hello-web:8080:
/ # wget -qO- --timeout=2 http://hello-web:8080Hello, world!
Version: 1.0.0
Hostname: hello-web-2258067535-vbx6zמוודאים ש-Pod לא יכול ליצור חיבורים אל hello-web-2:8080:
/ # wget -qO- --timeout=2 http://hello-web-2:8080wget: download timed outמוודאים שאי אפשר ליצור חיבורים לאתרים חיצוניים כמו www.example.com, ויוצאים מהמעטפת של ה-Pod.
/ # wget -qO- --timeout=2 http://www.example.comwget: download timed out
/ # exitהסרת המשאבים
כדי להימנע מחיובים בחשבון Google Cloud בגלל השימוש במשאבים שנעשה במסגרת המדריך הזה, אפשר למחוק את הפרויקט שמכיל את המשאבים או להשאיר את הפרויקט ולמחוק את המשאבים בנפרד.
מחיקת אשכול הקונטיינרים: בשלב הזה יימחקו המשאבים שמרכיבים את אשכול הקונטיינרים, כמו מכונות וירטואליות, דיסקים ומשאבי רשת.
gcloud container clusters delete test