מאגרי צמתים ייעודיים ב-Google Distributed Cloud (GDC) עם air gap מאפשרים לבודד עומסי עבודה של קונטיינרים כדי לחזק את האבטחה של אשכול Kubernetes ולשלוט במיקום של pod. ההפרדה הזו עוזרת לצמצם את הסיכון להתקפות של הסלמת הרשאות. כדי להגדיר מאגרים ייעודיים, צריך להחיל טולרנטיות ותוויות, להתאים אותן לטולרנטיות של עומסי עבודה ולכללי זיקה של צמתים, ולאמת את התזמון.
המסמך הזה מיועד לאדמינים ממחלקת IT בקבוצת האדמינים של הפלטפורמה שמנהלים אשכולות Kubernetes, ולמפתחים בקבוצת מפעילי האפליקציות שמריצים קונטיינרים. מידע נוסף זמין במאמר סקירה כללית על בידוד צמתים ובמאמר קהלי היעד של מסמכי התיעוד של GDC עם air gap.
לפני שמתחילים
כדי להשלים את המשימות שבמסמך הזה, צריך לבקש את ההרשאות הנדרשות ולהכין את הסביבה.
בקשת תפקידים ב-IAM
כדי לקבל את ההרשאות שנדרשות לבידוד עומסי עבודה של קונטיינרים באשכול Kubernetes, צריך תפקידים ספציפיים. התפקידים שאתם צריכים תלויים בשאלה אם אתם עובדים באשכול משותף ברמת הארגון או באשכול רגיל ברמת הפרויקט. מידע נוסף זמין במאמר הגדרות של אשכול Kubernetes.
תפקידים משותפים באשכול
כדי להוסיף דחייה (taint) ותווית למאגר צמתים באשכול משותף, צריך לבקש ממנהל חשבון ארגוני ב-IAM את התפקידים הבאים:
User Cluster Admin (
user-cluster-admin): יצירה, מחיקה, עריכה או הצגה של המשאבים של אשכול משותף שמתארח בשרת ה-API לניהול. התפקיד הזה נותן גישה למאגרי הצמתים של האשכול המשותף.מפתח אשכולות משתמשים (
user-cluster-developer): יצירה, מחיקה, עריכה או הצגה של אשכול משותף. התפקיד הזה נותן גישה לממשקי ה-API של מישור הנתונים שמתארחים באשכול המשותף.
התפקידים האלה לא קשורים למרחב שמות.
תפקידים רגילים באשכול
כדי להוסיף טיינט ותווית למאגר צמתים באשכול רגיל, צריך לבקש מהאדמין של הפרויקט ב-IAM את התפקידים הבאים:
אדמין של אשכול (
cluster-admin): יצירה, מחיקה, עריכה או צפייה בכל המשאבים באשכול רגיל. התפקיד הזה נותן גישה לממשקי ה-API של מישור הנתונים שמתארחים באשכול הרגיל ומנהלים את המשאבים של האשכול.מפתח אשכולות (
cluster-developer): יצירה, מחיקה, עריכה או הצגה של אשכול רגיל. התפקיד הזה נותן גישה לממשקי ה-API של מישור הנתונים שמתארחים באשכול הרגיל ומנהלים אותו.אדמין של אשכול רגיל (
standard-cluster-admin): יצירה, מחיקה, עריכה או צפייה במשאבים של אשכול רגיל שמתארח בשרת ה-API לניהול. התפקיד הזה נותן גישה למאגרי הצמתים של האשכול הרגיל.
התפקידים האלה קשורים למרחב השמות של הפרויקט.
הכנת הסביבה
כדי להריץ פקודות באשכול Kubernetes באמצעות ה-API, צריך לוודא שיש לכם את המשאבים הבאים:
נכנסים לחשבון ויוצרים את קובץ kubeconfig לאשכול Kubernetes.
בהוראות הבאות, מחליפים את
KUBERNETES_CLUSTER_KUBECONFIGבנתיב kubeconfig של אשכול Kubernetes.נכנסים ויוצרים את קובץ kubeconfig לשרת ה-API לניהול.
בהוראות הבאות, מחליפים את
MANAGEMENT_API_SERVERבנתיב kubeconfig של שרת ה-API לניהול.בוחרים שם ספציפי ל-taint ולתווית של הצומת שבהם רוצים להשתמש למאגרי הצמתים הייעודיים. לדוגמה,
workloadType=untrusted.
הוספת טיינט ותווית למאגר צמתים חדש
כשמחילים טאנט או תווית על מאגר צמתים חדש, כל הצמתים, כולל צמתים שנוספו מאוחר יותר, יקבלו באופן אוטומטי את הטאנטים והתוויות שצוינו. אי אפשר להסיר טאג או תווית ממאגר צמתים אחרי שהם הוחלו.
כדי להוסיף טיינט ותווית למאגר צמתים חדש, מבצעים את השלבים הבאים:
עורכים את הקטע
nodePoolsשל המשאב בהתאמה אישיתClusterישירות כשיוצרים את מאגר הצמתים:nodePools: # Several lines of code are omitted here. - machineTypeName: n2-standard-2-gdc name: nodepool-1 nodeCount: 3 taints: - key: "TAINT_KEY" value: "TAINT_VALUE" effect: "TAINT_EFFECT" labels: LABEL_KEY: LABEL_VALUEמחליפים את מה שכתוב בשדות הבאים:
-
TAINT_KEY: החלק של מפתח הטיינט בצמד מפתח/ערך שמשויך לTAINT_EFFECTשל תזמון. לדוגמה,workloadType. -
TAINT_VALUE: החלק של ערך ה-taint בצמד המפתח/ערך שמשויך ל-TAINT_EFFECTשל התזמון. לדוגמה,untrusted. -
TAINT_EFFECT: אחד מערכי ההשפעה הבאים:-
NoSchedule: פודים שלא יכולים לסבול את ה-taint הזה לא מתוזמנים בצומת, ופודים קיימים לא מפונים מהצומת. -
PreferNoSchedule: המערכת של Kubernetes נמנעת מתזמון של Pods שלא יכולים להתמודד עם ה-taint הזה בצומת. -
NoExecute: ה-pod נדחה מהצומת אם הוא כבר פועל בצומת, ולא מתוזמן לצומת אם הוא עדיין לא פועל בצומת.
-
-
LABEL_KEY: LABEL_VALUE: צמדי מפתח/ערך של תוויות הצומת, שתואמים לבוררים שציינתם במניפסטים של עומסי העבודה.
-
מחילים את המשאב
Clusterכדי ליצור את מאגר הצמתים החדש:kubectl apply -f cluster.yaml --kubeconfig MANAGEMENT_API_SERVERמחליפים את
MANAGEMENT_API_SERVERבנתיב kubeconfig של שרת ה-API האזורי שבו מתארח אשכול Kubernetes.
הוספת טיינט ותווית למאגר צמתים קיים
כדי להחיל טאג או תווית על מאגר צמתים קיים, צריך להחיל את השינויים על כל צומת קיים. אי אפשר לעדכן באופן דינמי את ההגדרות של מאגר הצמתים.
אי אפשר להסיר טומאה או תווית ממאגר צמתים אחרי שהיא הוחלה.
כדי להוסיף taint ותווית למאגר צמתים קיים, מבצעים את הפעולות הבאות:
מציגים את הצמתים במאגר הצמתים הייעודי:
kubectl get node --kubeconfig KUBERNETES_CLUSTER_KUBECONFIG \ -l baremetal.cluster.gke.io/node-pool=NODE_POOL_NAMEמחליפים את המשתנים הבאים:
-
KUBERNETES_CLUSTER_KUBECONFIG: הנתיב של kubeconfig לאשכול Kubernetes. -
NODE_POOL_NAME: השם של מאגר הצמתים הייעודי.
בפלט, שימו לב למזהה של כל אחד מהצמתים במאגר הצמתים.
-
לכל צומת במאגר הצמתים, מחילים את ה-taints:
kubectl taint nodes NODE_ID \ TAINT_KEY=TAINT_VALUE:TAINT_EFFECT \ --kubeconfig KUBERNETES_CLUSTER_KUBECONFIGמחליפים את המשתנים הבאים:
-
NODE_ID: המזהה של צומת העובד במאגר הצמתים הייעודי. TAINT_KEY=TAINT_VALUE: צמד מפתח/ערך שמשויך לTAINT_EFFECTשל תזמון. לדוגמה:workloadType=untrusted.-
TAINT_EFFECT: אחד מערכי האפקטים הבאים:-
NoSchedule: פודים שלא יכולים לסבול את ה-taint הזה לא מתוזמנים בצומת, ופודים קיימים לא מפונים מהצומת. -
PreferNoSchedule: המערכת של Kubernetes נמנעת מתזמון של Pods שלא יכולים להתמודד עם ה-taint הזה בצומת. -
NoExecute: ה-pod נדחה מהצומת אם הוא כבר פועל בצומת, ולא מתוזמן לצומת אם הוא עדיין לא פועל בצומת.
-
-
KUBERNETES_CLUSTER_KUBECONFIG: הנתיב של kubeconfig לאשכול Kubernetes.
-
לכל צומת במאגר הצמתים, מוסיפים את התוויות שתואמות לבוררים שתגדירו בעומסי העבודה של הקונטיינר:
kubectl label NODE_ID \ LABEL_KEY:LABEL_VALUE \ --kubeconfig KUBERNETES_CLUSTER_KUBECONFIGמחליפים את המשתנים הבאים:
-
NODE_ID: המזהה של צומת העובד במאגר הצמתים הייעודי. -
LABEL_KEY:LABEL_VALUE: צמדי המפתח/ערך של תוויות הצומת, שתואמים לבוררים שציינתם במניפסטים של עומסי העבודה. -
KUBERNETES_CLUSTER_KUBECONFIG: הנתיב של kubeconfig לאשכול Kubernetes.
-
הוספת כלל של סבילות וכלל של זיקה לצומת
אחרי שמוסיפים טולרנטיות למאגר הייעודי של צומתי ה-Kubernetes, אי אפשר לתזמן בו עומסי עבודה, אלא אם יש להם טולרנטיות שתואמת לטולרנטיות שהוספתם. מוסיפים את ה-toleration למפרט של עומסי העבודה כדי לאפשר לתזמן את הפודים האלה במאגר הצמתים עם ה-taint.
אם הוספתם תווית למאגר הצמתים הייעודי, אתם יכולים גם להוסיף כלל של שיוך צמתים כדי להורות ל-GDC לתזמן את עומסי העבודה רק במאגר הצמתים הזה.
כדי להגדיר את עומס העבודה של הקונטיינר כך שיפעל במאגר הצמתים הייעודי, מבצעים את השלבים הבאים:
מוסיפים את הקטעים הבאים לקטע
.spec.template.specבקובץ המניפסט של עומס העבודה בקונטיינר, כמו משאב בהתאמה אישית שלDeployment:tolerations: - key: TAINT_KEY operator: Equal value: TAINT_VALUE effect: TAINT_EFFECT affinity: nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: - key: LABEL_KEY operator: In values: - "LABEL_VALUE"מחליפים את מה שכתוב בשדות הבאים:
-
TAINT_KEY: מפתח ה-taint שהחלתם על מאגר הצמתים הייעודי. -
TAINT_VALUE: ערך ה-taint שהחלתם על מאגר הצמתים הייעודי. -
TAINT_EFFECT: אחד מערכי ההשפעה הבאים:-
NoSchedule: פודים שלא יכולים לסבול את ה-taint הזה לא מתוזמנים בצומת, ופודים קיימים לא מפונים מהצומת. -
PreferNoSchedule: המערכת של Kubernetes נמנעת מתזמון של Pods שלא יכולים להתמודד עם ה-taint הזה בצומת. -
NoExecute: ה-pod נדחה מהצומת אם הוא כבר פועל בצומת, ולא מתוזמן לצומת אם הוא עדיין לא פועל בצומת.
-
-
LABEL_KEY: מפתח התווית של הצומת שהחלתם על מאגר הצמתים הייעודי. -
LABEL_VALUE: הערך של תווית הצומת שהחלתם על מאגר הצמתים הייעודי.
לדוגמה, המשאב הבא של
Deploymentמוסיף סבילות ל-taint שלworkloadType=untrusted:NoExecuteוכלל של העדפת צומת לתווית הצומתworkloadType=untrusted:kind: Deployment apiVersion: apps/v1 metadata: name: my-app namespace: default labels: app: my-app spec: replicas: 1 selector: matchLabels: app: my-app template: metadata: labels: app: my-app spec: tolerations: - key: workloadType operator: Equal value: untrusted effect: NoExecute affinity: nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: - key: workloadType operator: In values: - "untrusted" containers: - name: my-app image: harbor-1.org-1.zone1.google.gdc.test/harborproject/my-app ports: - containerPort: 80 imagePullSecrets: - name: SECRET-
מעדכנים את עומס העבודה של הקונטיינר:
kubectl apply -f deployment.yaml -n NAMESPACE \ --kubeconfig KUBERNETES_CLUSTER_KUBECONFIGמחליפים את המשתנים הבאים:
-
NAMESPACE: מרחב השמות של עומס העבודה בקונטיינר. באשכולות משותפים, צריך להשתמש במרחב שמות של פרויקט. באשכולות רגילים, זה יכול להיות כל מרחב שמות. -
KUBERNETES_CLUSTER_KUBECONFIG: הנתיב של kubeconfig לאשכול Kubernetes.
-
GDC יוצר מחדש את הפודים המושפעים. כלל הזיקה של הצומת מאלץ את ה-pods להיכנס למאגר הצמתים הייעודי שיצרתם. ה-toleration מאפשר להציב רק את הפודים האלה בצמתים.
איך לוודא שההפרדה פועלת
מוודאים שה-pods שהגדרתם פועלים במאגר הצמתים המתויג.
מציגים את הפודים במרחב השמות הנתון:
kubectl get pods -o=wide -n NAMESPACE \ --kubeconfig KUBERNETES_CLUSTER_KUBECONFIGמחליפים את המשתנים הבאים:
-
NAMESPACE: מרחב השמות של עומס העבודה בקונטיינר. באשכולות משותפים, צריך להשתמש במרחב שמות של פרויקט. באשכולות רגילים, זה יכול להיות כל מרחב שמות. -
KUBERNETES_CLUSTER_KUBECONFIG: הנתיב של kubeconfig לאשכול Kubernetes.
הפלט אמור להיראות כך:
pod/kube-abc-12tyuj pod/kube-abc-39oplef pod/kube-abc-95rzkapמוודאים שעומסי העבודה פועלים במאגר הצמתים הייעודי.
-
המאמרים הבאים
- עומסי עבודה של קונטיינרים ב-GDC
- פריסת אפליקציה בקונטיינר עם זמינות גבוהה
- עומסי עבודה ב-Kubernetes לזמינות גבוהה