מניעת רישום עצמי של צמתים באשכולות GKE

כברירת מחדל, צמתים של 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.

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

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

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

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

  • מפעילים את ממשק ה-API של Google Kubernetes Engine.
  • הפעלת 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: האזור או האזור הזמין של מישור הבקרה של האשכול.

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