כברירת מחדל, צמתים של Google Kubernetes Engine (GKE) משתמשים בתהליך kubelet בכל צומת כדי לרשום אובייקטים של צמתים בשרת Kubernetes API. במאמר הזה נסביר איך למנוע את ההרשמה העצמית הזו בצומתי GKE מוגנים, ולדרוש במקום זאת שרכיב מהימן של מישור הבקרה ב-GKE יבצע את פעולות ההרשמה. מהנדסי אבטחה ואדמינים של פלטפורמות יכולים להשתמש ביצירת צמתים של מישור הבקרה כדי להגביל את ההרשאות של הצמתים.
כדאי להכיר את המושגים הבאים:
מצבי יצירה של צמתים ב-GKE
צומתי GKE מוגנים, שמופעלים בכל אשכולות GKE, אוכפים אימות קריפטוגרפי של זהויות הצומת במהלך תהליך רישום הצומת. האימות הזה עוזר לוודא שרק צמתים לגיטימיים יכולים להירשם בשרת ה-API של Kubernetes ולהריץ עומסי עבודה.
תהליך ההרשמה שמוגדר כברירת מחדל לאשכולות GKE, שבו kubelet בכל צומת יוצר ומשנה את אובייקט Node בשרת ה-API, יוצר סיכון אם צומת מסוים נפרץ. לדוגמה, ב-CVE-2025-5187, נקודת חולשה אפשרה למשתמשי צמתים למחוק את האובייקטים התואמים של Node ולרשום צמתים שנפרצו.
יצירת צומת של מישור הבקרה
ב-GKE בגרסה 1.35.3-gke.1189000 ואילך, אתם יכולים לדרוש מרכיב מהימן במישור הבקרה של GKE בשם gcp-controller-manager ליצור אובייקטים של Node במקום לאפשר ל-kubelet לרשום את הצמתים בעצמו. אחרי ש-kubelet מגדיר חיבור TLS עם שרת ה-API באמצעות זהות הצומת שאומתה קריפטוגרפית, רכיב gcp-controller-manager יוצר את האובייקט Node. בקרת הכניסה דוחה כל בקשה מ-kubelet ליצור את האובייקט Node. באמצעות רכיב מישור הבקרה ליצירת אובייקטים מסוג Node, אפשר לצמצם את הסיכון לכך שצומת שנפרץ עלול ליצור אובייקטים שרירותיים מסוג Node או לשנות את המפרט של Node.
כדי לשנות את התנהגות ברירת המחדל של יצירת צמתים ורישום שלהם, מבצעים אחת מהפעולות הבאות כשיוצרים אשכול רגיל או אשכול במצב טייס אוטומטי:
- Google Cloud CLI: מציינים את הערך
CONTROL_PLANEבדגל--node-creation-mode. - Kubernetes Engine API: מציינים ערך של
VIA_CONTROL_PLANEבשדהnode-creation-modeבשיטהNodeCreationConfig.
מגבלות
יש עיכוב קצר בין הרגע שבו gcp-controller-manager יוצר אובייקט Node ב-Kubernetes API לבין הרגע שבו kubelet מעדכן את אובייקט Node עם כל התוויות וההערות של הצומת. עומסי עבודה או בקרי (controllers) שתלויים בסט מלא של תוויות או הערות מיד עם יצירת הצומת, עשויים להציג התנהגות לא צפויה. יכול להיות שחלק מהתוויות וההערות יתעדכנו בזמן אחר מאשר בזמן ההרשמה ל-kubelet. לפני שמבצעים פעולה, צריך לוודא שעומסי העבודה ו-DaemonSets משתמשים בבדיקות של נוכחות תווית והערה.
- מומלץ להימנע מפריסת DaemonSets ועומסי עבודה עם tolerations לכל ה-taints של הצומת, כי הם עלולים לגרום להפעלת Pods בצמתים שלא מוכנים.
- משתמשים ב-
initContainerכדי לבדוק את תוויות הצמתים לפני שמפעילים את המאגרים הראשיים.
לפני שמתחילים
לפני שמתחילים, חשוב לוודא שביצעתם את הפעולות הבאות:
- מפעילים את ממשק Google Kubernetes Engine API. הפעלת Google Kubernetes Engine API
- אם רוצים להשתמש ב-CLI של Google Cloud למשימה הזו, צריך להתקין ואז להפעיל את ה-CLI של gcloud. אם התקנתם בעבר את ה-CLI של gcloud, מריצים את הפקודה
gcloud components updateכדי לקבל את הגרסה העדכנית. יכול להיות שגרסאות קודמות של ה-CLI של gcloud לא יתמכו בהרצת הפקודות שמופיעות במסמך הזה.
הפעלת יצירה של צומת מישור בקרה
אפשר להפעיל יצירת צמתים באמצעות הרכיב gcp-controller-manager כשיוצרים אשכול או מעדכנים אשכול קיים. באשכולות קיימים,
העדכון משפיע רק על צמתים חדשים באשכול. השינוי לא ישפיע על צמתים קיימים.
הפקודה הבאה מפעילה את מצב יצירת הצמתים של מישור הבקרה באשכול קיים:
gcloud container clusters update CLUSTER_NAME \
--node-creation-mode=CONTROL_PLANE \
--location=CONTROL_PLANE_LOCATION \
מחליפים את מה שכתוב בשדות הבאים:
-
CLUSTER_NAME: השם של האשכול. -
CONTROL_PLANE_LOCATION: האזור או האזור הזמין של מישור הבקרה של האשכול.
אפשר גם לציין את הדגל --node-creation-mode בפקודה clusters create ובפקודה clusters create-auto.
השבתת יצירה של צומת מישור בקרה
אפשר לחזור להתנהגות ברירת המחדל של GKE, שבה kubelet יוצר צמתים בכל שלב, על ידי ציון הערך KUBELET בדגל --node-creation-mode של Google Cloud CLI או VIA_KUBELET בשיטת NodeCreationConfig GKE API. במקרה של אשכולות קיימים, השינוי הזה משפיע רק על צמתים חדשים באשכול.
הפקודה הבאה מעדכנת אשכול כדי להשבית את יצירת הצמתים של מישור הבקרה:
gcloud container clusters update CLUSTER_NAME \
--node-creation-mode=KUBELET \
--location=CONTROL_PLANE_LOCATION \
מחליפים את מה שכתוב בשדות הבאים:
-
CLUSTER_NAME: השם של האשכול. -
CONTROL_PLANE_LOCATION: האזור או האזור הזמין של מישור הבקרה של האשכול.