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

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

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

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

מטרות

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

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

עלויות

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

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

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

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

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

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

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

  • הדגל 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 עם אכיפה של מדיניות רשת ב-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:

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

אימות מדיניות הכניסה

קודם מריצים 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 אל 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: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.

במניפסט הבא מוגדרת מדיניות רשת ב-Kubernetes ששולטת בתעבורת נתונים יוצאת (egress) מקבוצות Pod עם התווית app=foo, עם שני יעדים מותרים:

  1. ‫Pods באותו מרחב שמות עם התווית app=hello.
  2. ‫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

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