במדריך הזה אנחנו מסבירים איך להשתמש במדיניות רשת של אשכול כדי לקבוע אילו Pods יקבלו תעבורת נתונים נכנסת ואילו Pods יוכלו לשלוח תעבורת נתונים יוצאת. מידע נוסף זמין במאמר בנושא יצירת מדיניות רשת של אשכול.
כללי מדיניות של רשת מאפשרים לכם להגביל את החיבורים בין קבוצות Pod. לכן, שימוש במדיניות רשת מספק אבטחה טובה יותר כי הוא מצמצם את רדיוס הפגיעה.
חשוב לזכור שמדיניות הרשת קובעת אם חיבור מותר, והיא לא מציעה תכונות ברמה גבוהה יותר כמו הרשאה או העברה מאובטחת (כמו SSL/TLS).
מטרות
במדריך הזה תלמדו:- איך יוצרים אשכולות עם אכיפה של מדיניות רשת
- איך מגבילים את התנועה הנכנסת ל-Pods באמצעות תוויות
- איך מגבילים תנועה יוצאת מ-Pods באמצעות תוויות
עלויות
במסמך הזה משתמשים ברכיבים הבאים של Google Cloud, והשימוש בהם כרוך בתשלום:
כדי ליצור הערכת עלויות בהתאם לשימוש החזוי, אפשר להשתמש במחשבון התמחור.
כשמסיימים את המשימות שמתוארות במסמך הזה אפשר למחוק את המשאבים שיצרתם כדי להימנע מחיובים נוספים. מידע נוסף זמין בקטע הסרת המשאבים.
לפני שמתחילים
כדי להפעיל את Kubernetes Engine API:- נכנסים ל דף Kubernetes Engine במסוף Google Cloud .
- יוצרים או בוחרים פרויקט.
- מחכים עד שממשק ה-API והשירותים הקשורים מופעלים. הפעולה יכולה להימשך כמה דקות.
-
Verify that billing is enabled for your Google Cloud project.
מתקינים את כלי שורת הפקודה הבאים שמשמשים במדריך הזה:
-
הדגל
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 עם אכיפה של מדיניות רשת
כדי ליצור אוסף של קונטיינרים עם אכיפה של מדיניות רשת, מריצים את הפקודה הבאה:
gcloud container clusters create test --enable-network-policy
הגבלת תנועה נכנסת ל-Pods
משאבי Kubernetes NetworkPolicy מאפשרים להגדיר כללי מדיניות לגישה לרשת עבור קבוצות ה-Pod. אובייקטים של NetworkPolicy מכילים את המידע הבא:
Pods שהמדיניות לגבי הרשת חלה עליהם, בדרך כלל מסומנים באמצעות בורר תוויות
סוג התעבורה שהמדיניות ברשת משפיעה עליה: תעבורה נכנסת (ingress) או תעבורה יוצאת (egress), או שניהם
במקרה של מדיניות לתעבורת נתונים נכנסת (ingress), אילו פודים יכולים להתחבר לפודים שצוינו
בכללי מדיניות לתעבורת נתונים יוצאת (egress), הפודים שאליהם הפודים שצוינו יכולים להתחבר
קודם מריצים אפליקציית שרת אינטרנט עם התווית 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
אימות מדיניות ה-Ingress
קודם מריצים 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 אל Pods app=hello מופעלת.
לאחר מכן, מריצים 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.
במניפסט הבא מוגדרת מדיניות רשת ששולטת בתעבורת נתונים יוצאת (egress) מקבוצות Pod עם התווית app=foo, עם שני יעדים מותרים:
- Pods באותו מרחב שמות עם התווית
app=hello. - Cluster 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