הגדרת מדיניות רשת לאפליקציות

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

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

חשוב לזכור שמדיניות הרשת קובעת אם חיבור מותר, והיא לא מציעה תכונות ברמה גבוהה יותר כמו הרשאה או העברה מאובטחת (כמו SSL/TLS).

מטרות

במדריך הזה תלמדו:

  • איך יוצרים אשכולות עם אכיפה של מדיניות רשת
  • איך מגבילים את התנועה הנכנסת ל-Pods באמצעות תוויות
  • איך מגבילים תנועה יוצאת מ-Pods באמצעות תוויות

עלויות

במסמך הזה משתמשים ברכיבים הבאים של Google Cloud, והשימוש בהם כרוך בתשלום:

כדי ליצור הערכת עלויות בהתאם לשימוש החזוי, אפשר להשתמש במחשבון התמחור.

יכול להיות שמשתמשים חדשים ב- Google Cloud זכאים לתקופת ניסיון בחינם.

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

לפני שמתחילים

כדי להפעיל את Kubernetes Engine API:
  1. נכנסים ל דף Kubernetes Engine במסוף Google Cloud .
  2. יוצרים או בוחרים פרויקט.
  3. מחכים עד שממשק ה-API והשירותים הקשורים מופעלים. הפעולה יכולה להימשך כמה דקות.
  4. Verify that billing is enabled for your Google Cloud project.

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

  • הדגל gcloud משמש ליצירה ולמחיקה של אשכולות Kubernetes Engine. ‫gcloud כלול ב-gcloud CLI.
  • 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:

kind: NetworkPolicy
apiVersion: networking.k8s.io/v1
metadata:
  name: hello-allow-from-foo
spec:
  policyTypes:
  - Ingress
  podSelector:
    matchLabels:
      app: hello
  ingress:
  - from:
    - podSelector:
        matchLabels:
          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:8080
Hello, 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:8080
wget: 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, עם שני יעדים מותרים:

  1. ‫Pods באותו מרחב שמות עם התווית app=hello.
  2. ‫Cluster Pods או נקודות קצה חיצוניות ביציאה 53 (UDP ו-TCP).
kind: NetworkPolicy
apiVersion: networking.k8s.io/v1
metadata:
  name: foo-allow-to-hello
spec:
  policyTypes:
  - Egress
  podSelector:
    matchLabels:
      app: foo
  egress:
  - to:
    - podSelector:
        matchLabels:
          app: hello
  - ports:
    - port: 53
      protocol: TCP
    - port: 53
      protocol: UDP

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

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:8080
Hello, world!
Version: 1.0.0
Hostname: hello-web-2258067535-vbx6z

מוודאים ש-Pod לא יכול ליצור חיבורים אל hello-web-2:8080:

/ # wget -qO- --timeout=2 http://hello-web-2:8080
wget: download timed out

מוודאים שאי אפשר ליצור חיבורים לאתרים חיצוניים כמו www.example.com, ויוצאים מהמעטפת של ה-Pod.

/ # wget -qO- --timeout=2 http://www.example.com
wget: download timed out
/ # exit

הסרת המשאבים

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

  1. מחיקת אשכול הקונטיינרים: בשלב הזה יימחקו המשאבים שמרכיבים את אשכול הקונטיינרים, כמו מכונות וירטואליות, דיסקים ומשאבי רשת.

    gcloud container clusters delete test

המאמרים הבאים