בדף הזה מוסבר איך להגדיר מדיניות רשת ב-Kubernetes ברמת האשכול ב-Google Kubernetes Engine (GKE).
מדיניות רשת ב-Kubernetes ומדיניות רשת של FQDN עוזרות להגדיר כללים לתעבורת נתונים בין Pods. מדיניות הרשת קובעת איך פודים מתקשרים אחד עם השני בתוך האפליקציות שלהם ועם נקודות קצה חיצוניות.
כמנהלי אשכולות, אתם יכולים להגדיר מדיניות רשת ב-Kubernetes ב-Cilium ברמת האשכול (CCNP), שמתגברת על המגבלות של מדיניות הרשת ב-Kubernetes בניהול התעבורה ברמת האשכול. מדיניות רשת ברמת האשכול ב-Cilium
אוכפת כללי רשת לכל עומסי העבודה באשכול כולו. בהיררכיית הערכת המדיניות של GKE, כללי המדיניות האלה נמצאים ברמה NetworkPolicy. למרות שכללי דחייה מפורשים ב-CCNP מבטלים כללי הרשאה במדיניות בהיקף מרחב השמות, לכללי הרשאה ב-CCNP יש את אותה עדיפות כמו למדיניות רגילה של מרחב שמות.
כל הכללים של CCNP כפופים למדיניות ברמת האדמין.
מדיניות הרשת של Cilium ברמת האשכול ב-GKE היא CustomResourceDefinition (CRD) בהיקף האשכול, שמציין מדיניות שנאכפת על ידי GKE. כשמפעילים ב-GKE את מדיניות הרשת של Cilium ברמת האשכול, אפשר לנהל באופן מרכזי את כללי הרשת של כל האשכול. אתם יכולים לשלוט בגישה הבסיסית של שכבה 3 (רמת IP) ושכבה 4 (רמת יציאה) לתעבורת נתונים שנכנסת לאשכול ויוצאת ממנו.
יתרונות
בעזרת מדיניות רשת ב-Kubernetes בפריסה רחבה של Cilium, אתם יכולים:
- אכיפת אבטחה מרכזית: באמצעות CCNP, אתם יכולים להגדיר כללי גישה לרשת שחלים על כל האשכול. אם הכללים האלה הם כללי דחייה מפורשים, הם מבטלים כל מדיניות שעלולה להתנגש איתם ברמת מרחב השמות. כללי ההיתר של CCNP נמצאים באותה רמה כמו כללי המדיניות של מרחב השמות הרגיל. למנדטים, משתמשים ברמת האדמין ב-
ClusterNetworkPolicy. - הגנה על ריבוי דיירים: אם האשכול מארח כמה צוותים או דיירים, אפשר להגן על הבידוד בתוך אשכול משותף באמצעות הטמעה של כללי CCNP, שמתמקדים בבקרה של תעבורת הרשת. אפשר לאכוף הפרדה ברמת הרשת על ידי הקצאת מרחבי שמות או קבוצות של מרחבי שמות לצוותים ספציפיים.
- הגדרת מדיניות גמישה כברירת מחדל: באמצעות CCNP אפשר להגדיר כללי רשת כברירת מחדל לכל האשכול. אתם יכולים להתאים אישית את הכללים האלה לפי הצורך בלי לפגוע באבטחה הכוללת של האשכול.
כדי להטמיע את CCNP, צריך להפעיל את GKE Dataplane V2 באשכול. מוודאים שה-CustomResourceDefinition של CCNP מופעל, ואז יוצרים כללי מדיניות שמגדירים את כללי הגישה לרשת של האשכול.
לפני שמתחילים
לפני שמתחילים, חשוב לוודא שביצעתם את המשימות הבאות:
- מפעילים את ממשק ה-API של Google Kubernetes Engine. הפעלת Google Kubernetes Engine API
- כדי להשתמש ב-CLI של Google Cloud למשימה הזו, צריך להתקין ואז לאתחל את ה-CLI של gcloud. אם התקנתם בעבר את ה-CLI של gcloud, מריצים את הפקודה
gcloud components updateכדי לקבל את הגרסה העדכנית. יכול להיות שבגרסאות קודמות של ה-CLI של gcloud אי אפשר להריץ את הפקודות שבמסמך הזה.
דרישות
כללי מדיניות רשת ב-Kubernetes ברמת האשכול ב-Cilium צריכים לעמוד בדרישות הבאות:
- Google Cloud CLI בגרסה 465.0.0 ואילך.
- צריך להפעיל אשכול GKE באחת מהגרסאות הבאות:
- 1.28.6-gke.1095000 ואילך
- 1.29.1-gke.1016000 ואילך
- באשכול צריך להשתמש ב-GKE Dataplane V2.
- צריך להפעיל את CustomResourceDefinition של מדיניות רשת ב-Kubernetes ברמת האשכול של Cilium.
מגבלות
לכללי מדיניות רשת ב-Kubernetes ב-Cilium ברמת האשכול יש את המגבלות הבאות:
- אין תמיכה בכללי מדיניות של שכבה 7.
- אין תמיכה בבוררי צמתים.
- המספר המקסימלי של
CiliumClusterwideNetworkPolicyבכל אשכול הוא 1,000.
הפעלת מדיניות רשת ב-Kubernetes בפריסה רחבה של Cilium באשכול חדש
כדי להפעיל מדיניות רשת ב-Kubernetes ב-Cilium ברמת האשכול באשכול חדש, אפשר להשתמש ב-Google Cloud CLI או ב-Kubernetes Engine API.
gcloud
כדי להפעיל מדיניות רשת ב-Kubernetes ברמת האשכול של Cilium באשכול חדש, יוצרים אשכול חדש עם הדגל --enable-cilium-clusterwide-network-policy.
Autopilot
gcloud container clusters create-auto CLUSTER_NAME \
--location COMPUTE_LOCATION \
--enable-cilium-clusterwide-network-policy
מחליפים את מה שכתוב בשדות הבאים:
CLUSTER_NAMEבשם של האשכול.-
COMPUTE_LOCATIONבמיקום של האשכול.
רגילה
gcloud container clusters create CLUSTER_NAME \
--location COMPUTE_LOCATION \
--enable-cilium-clusterwide-network-policy \
--enable-dataplane-v2
מחליפים את מה שכתוב בשדות הבאים:
CLUSTER_NAMEבשם של האשכול.-
COMPUTE_LOCATIONמחליפים במיקום של האשכול.
API
כדי להפעיל את מדיניות רשת ב-Kubernetes של Cilium ברמת האשכול, צריך לציין את האפשרויות הבאות כשיוצרים אשכול חדש:
השדה datapathProvider באובייקט networkConfig.
{
"cluster": {
...
"networkConfig": {
"datapathProvider": "ADVANCED_DATAPATH",
"enableCiliumClusterwideNetworkPolicy": true
}
}
}
מוודאים ש-ciliumclusterwidenetworkpolicies.cilium.ioCustomResourceDefinition מופיע בפלט של הפקודה הבאה:
kubectl get crds ciliumclusterwidenetworkpolicies.cilium.io
הפלט אמור להיראות כך:
ciliumclusterwidenetworkpolicies.cilium.io 2023-09-19T16:54:48Z
הפעלת מדיניות רשת ב-Kubernetes בפריסה רחבה של אשכול Cilium באשכול קיים
אפשר להפעיל מדיניות רשת ב-Kubernetes של Cilium בכל האשכול באשכול קיים באמצעות Google Cloud CLI או Kubernetes Engine API.
gcloud
מוודאים שGKE Dataplane V2 מופעל באשכול.
gcloud container clusters describe CLUSTER_NAME \ --location COMPUTE_LOCATION \ --format="value(networkConfig.datapathProvider)" \מחליפים את מה שכתוב בשדות הבאים:
CLUSTER_NAMEבשם של האשכול.-
COMPUTE_LOCATIONבמיקום של האשכול.
מעדכנים את האשכול באמצעות הדגל
--enable-cilium-clusterwide-network-policy.gcloud container clusters update CLUSTER_NAME \ --location COMPUTE_LOCATION \ --enable-cilium-clusterwide-network-policyמפעילים מחדש את DaemonSet של anetd.
kubectl rollout restart ds -n kube-system anetd && \ kubectl rollout status ds -n kube-system anetd
API
מוודאים שהאשכול מופעל ל-GKE Dataplane V2:
{
"update": {
"desiredEnableCiliumClusterwideNetworkPolicy": true
},
"name": "cluster"
}
To update an existing cluster, run the following update cluster command:
{
"update": {
"desiredEnableCiliumClusterwideNetworkPolicy": true
}
"name": "cluster"
}
מוודאים ש-ciliumclusterwidenetworkpolicies.cilium.io CustomResourceDefinition מופיע בפלט של הפקודה הבאה:
kubectl get crds ciliumclusterwidenetworkpolicies.cilium.io
הפלט אמור להיראות כך:
ciliumclusterwidenetworkpolicies.cilium.io 2023-09-19T16:54:48Z
שימוש במדיניות רשת ב-Kubernetes בפריסה רחבה של Cilium
בקטע הזה מפורטות דוגמאות להגדרת מדיניות רשת ב-Cilium ברמת האשכול.
דוגמה 1: שליטה בתעבורת נתונים נכנסת (ingress) לעומס עבודה
בדוגמה הבאה, כל נקודות הקצה עם התווית role=backend מקבלות חיבורי כניסה ביציאה 80 מנקודות קצה עם התווית role=frontend. נקודות קצה עם התווית role=backend ידחו את כל החיבורים הנכנסים שלא מותרים על ידי המדיניות הזו.
שומרים את המניפסט הבא בתור
l4-rule-ingress.yaml:apiVersion: "cilium.io/v2" kind: CiliumClusterwideNetworkPolicy metadata: name: "l4-rule-ingress" spec: endpointSelector: matchLabels: role: backend ingress: - fromEndpoints: - matchLabels: role: frontend toPorts: - ports: - port: "80" protocol: TCPמחילים את המניפסט:
kubectl apply -f l4-rule-ingress.yaml
דוגמה 2: הגבלת תעבורת נתונים יוצאת (egress) מעומס עבודה ביציאה נתונה
הכלל הבא מגביל את כל נקודות הקצה עם התווית app=myService כך שיוכלו לשלוח חבילות רק באמצעות TCP ביציאה 80, לכל יעד בשכבה 3:
שומרים את קובץ המניפסט הבא בשם
l4-rule-egress.yaml:apiVersion: "cilium.io/v2" kind: CiliumClusterwideNetworkPolicy metadata: name: "l4-rule-egress" spec: endpointSelector: matchLabels: app: myService egress: - toPorts: - ports: - port: "80" protocol: TCPמחילים את המניפסט:
kubectl apply -f l4-rule-egress.yaml
דוגמה 3: הגבלת תעבורת נתונים יוצאת מעומס עבודה ביציאה וב-CIDR נתונים
בדוגמה הבאה, כל נקודות הקצה עם התווית role=crawler מוגבלות לשליחת חבילות רק ביציאה 80, בפרוטוקולי TCP, ליעד CIDR 192.10.2.0/24.
שומרים את המניפסט הבא בתור
cidr-l4-rule.yaml:apiVersion: "cilium.io/v2" kind: CiliumClusterwideNetworkPolicy metadata: name: "cidr-l4-rule" spec: endpointSelector: matchLabels: role: crawler egress: - toCIDR: - 192.0.2.0/24 toPorts: - ports: - port: "80" protocol: TCPהחלת המניפסט:
kubectl apply -f cidr-l4-rule.yaml
מעקב אחרי תעבורת הרשת ופתרון בעיות
כדי לעקוב אחרי תעבורת הנתונים ברשת שמושפעת ממדיניות הרשת של cilium ברמת האשכול ולפתור בעיות שקשורות אליה, אפשר להשתמש ברישום ביומן של מדיניות הרשת וביכולת הצפייה במישור הנתונים V2 של GKE.
ניסיון להשתמש בכללי מדיניות של שכבה 7 או בבוררי צמתים
תסמין
אם אתם משתמשים ב-GKE עם GKE Dataplane V2 ומנסים להגדיר מדיניות CCNP שכוללת כללים ברמה 7 (לדוגמה: סינון HTTP) ובוררי צמתים, יכול להיות שתופיע הודעת שגיאה שדומה להודעה הבאה:
שגיאה
Error from server (GKE Warden constraints violations): error when creating
"ccnp.yaml": admission webhook
"warden-validating.common-webhooks.networking.gke.io" denied the request: GKE
Warden rejected the request because it violates one or more constraints.
Violations details: {"[denied by gke-cilium-network-policy-limitation]":["L7
rules are not allowed in CiliumClusterwideNetworkPolicy"]} Requested by user:
'user@example.com', groups: 'system:authenticated'.
סיבה אפשרית
ל-GKE יש הגבלות ספציפיות על CCNP. מדיניות שכבה 7, שמאפשרת סינון על סמך נתונים ברמת האפליקציה (כמו כותרות HTTP), ובוררי צמתים לא נתמכים בשילוב של Cilium ב-GKE.
רזולוציה
אם אתם צריכים יכולות סינון מתקדמות בשכבה 7 באשכול GKE, כדאי להשתמש ב-Cloud Service Mesh. כך אפשר לשלוט בתנועה ברמת האפליקציה בצורה מפורטת יותר.
מדיניות רשת ב-Kubernetes של Cilium ברמת האשכול לא מופעלת
תסמין
כשמנסים להגדיר מדיניות רשת ב-Kubernetes של Cilium ברמת האשכול (CCNP) באשכול שבו התכונה לא הופעלה באופן מפורש, לא ניתן להגדיר אותה ועשויה להופיע הודעת שגיאה דומה לזו:
שגיאה
error: resource mapping not found for name: "l4-rule" namespace: "" from
"ccnp.yaml": no matches for kind "CiliumClusterwideNetworkPolicy" in version
"cilium.io/v2" ensure CRDs are installed first
סיבה אפשרית
מדיניות רשת ב-Kubernetes של Cilium ברמת האשכול מסתמכת על הגדרת משאב בהתאמה אישית (CRD). הודעת השגיאה מציינת שחסר CustomResourceDefinition באשכול.
רזולוציה
לפני שמשתמשים ב-CCNPs, צריך להפעיל את Cilium cluster-wide network policy CustomResourceDefinition.
המאמרים הבאים
קריאת מאמרי העזרה של Kubernetes בנושא מדיניות רשת ב-Kubernetes
איך אוכפים אמצעי הגנה לאבטחה ברמת האשכול באמצעות ClusterNetworkPolicy
לקרוא על CiliumClusterwideNetworkPolicy