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

צומתי Google Kubernetes Engine (GKE) נרשמים בשרת ה-API של Kubernetes על ידי יצירת אובייקטים מסוג Node.

רכיב המערכת שיוצר את האובייקט Node ב-Kubernetes API הוא אחד מהבאים:

  • תהליך kubelet.
  • רכיב מהימן של מישור הבקרה.

במאמר הזה מתוארים המצבים ליצירת צמתים ב-GKE, ומוסבר איך להגדיר את המצב לאשכולות שמשתמשים בצומתי GKE מוגנים. מהנדסי אבטחה ומנהלי פלטפורמות יכולים להשתמש ביצירת צומת של מישור הבקרה כדי להגביל את ההרשאות של הצמתים.

אתם כבר אמורים להכיר את המושגים הבאים:

מצבי יצירת צמתים ב-GKE

צומתי GKE מוגנים, שמופעלים בכל אשכולות GKE, אוכפים אימות קריפטוגרפי של זהויות הצמתים במהלך תהליך הרישום של הצומת. האימות הזה עוזר לוודא שרק צמתים לגיטימיים יכולים להירשם בשרת ה-API של Kubernetes ולהריץ עומסי עבודה.

תהליך העבודה של רישום עצמי של צומת, שבו kubelet בכל צומת יוצר ומשנה את האובייקט Node שלו בשרת ה-API, יוצר סיכון אם צומת נפרץ. לדוגמה, ב-CVE-2025-5187, נקודת חולשה אפשרה למשתמשי צומת למחוק את האובייקטים התואמים של Node ולרשום צמתים שנפרצו.

ב-GKE יש תמיכה במצבים הבאים ליצירת צמתים:

  • יצירת צומת במישור הבקרה: רכיב מהימן במישור הבקרה של GKE יוצר אובייקטים מסוג Node. זהו מצב ברירת המחדל לאשכולות חדשים שפועלים ב-GKE בגרסה 1.37.1-gke.3020000 ואילך.
  • יצירת צומת kubelet: ה-kubelet בכל צומת רושם את הצומת באופן עצמאי. זהו מצב ברירת המחדל לאשכולות שנוצרו בגרסאות GKE שקדמו ל-1.37.1-gke.3020000.

יצירת צומת של מישור הבקרה

בגרסה 1.35.3-gke.1189000 ואילך של GKE, אתם יכולים להגדיר רכיב מהימן של מישור הבקרה של GKE כדי ליצור אובייקטים מסוג Node, במקום לאפשר ל-kubelet לרשום את הצמתים בעצמו. אחרי ש-kubelet מגדיר חיבור TLS לשרת ה-API באמצעות זהות הצומת שאומתה באופן קריפטוגרפי, מישור הבקרה יוצר את האובייקט Node. בקר קבלה דוחה את כל הבקשות מ-kubelet ליצירת האובייקט Node. אם משתמשים ברכיב של מישור הבקרה כדי ליצור אובייקטים של Node, אפשר לצמצם את הסיכון שצומת שעלול להיות חשוף ייצור אובייקטים שרירותיים של Node או ישנה את המפרט של Node. כדי להגדיר באופן מפורש את מצב יצירת הצמתים כשיוצרים אשכול Standard או Autopilot, מבצעים אחת מהפעולות הבאות:

  • ‫Google Cloud CLI: מציינים את הערך CONTROL_PLANE או KUBELET בדגל --node-creation-mode.
  • ‫Kubernetes Engine API: מציינים את הערך VIA_CONTROL_PLANE או VIA_KUBELET בשדה nodeCreationMode של האובייקט NodeCreationConfig.

כדי להפעיל באופן ידני יצירה של צומת במישור הבקרה, האשכול צריך לעמוד בכל הדרישות הבאות:

  • באשכול צריכה לפעול גרסת GKE‏ 1.35.3-gke.1189000 ואילך.
  • באשכול צריך להפעיל צומתי GKE מוגנים. אם משביתים את צומתי GKE המוגנים, אי אפשר להשתמש ביצירת צומת של מישור הבקרה.

מגבלות

יש עיכוב קצר בין הזמן שבו מישור הבקרה יוצר אובייקט Node ב-Kubernetes API לבין הזמן שבו kubelet מעדכן את האובייקט Node עם קבוצת התוויות וההערות המלאה של הצומת. יכול להיות שתהיה התנהגות לא צפויה בעומסי עבודה או בבקרים שתלויים בקבוצה מלאה של תוויות או הערות מיד עם יצירת הצומת. יכול להיות שתוויות והערות מסוימות יותאמו בזמן שונה מהרישום של kubelet. לפני שאתם מבצעים פעולה, ודאו שעומסי העבודה וה-DaemonSets משתמשים בבדיקות נוכחות של תוויות והערות.

  • הימנעו מפריסת DaemonSets ועומסי עבודה עם טולרנטיות לכל ה-taints של הצמתים, כי זה עלול לגרום לפודים לפעול בצמתים שלא מוכנים.
  • משתמשים ב-initContainer כדי לבדוק תוויות של צמתים לפני שמאפשרים למאגרים הראשיים לפעול.

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

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

  • מפעילים את Google Kubernetes Engine API.
  • הפעלת Google Kubernetes Engine API
  • כדי להשתמש ב-Google Cloud CLI למשימה הזו, מתקינים ואז מאתחלים את ה-CLI של gcloud. אם כבר התקנתם את ה-CLI של gcloud, הריצו את הפקודה gcloud components update כדי לקבל את הגרסה העדכנית. יכול להיות שבגרסאות קודמות של ה-CLI של gcloud אי אפשר להריץ את הפקודות שבמסמך הזה.

הפעלת יצירת צומת של מישור הבקרה

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

הפקודה הבאה מפעילה את מצב היצירה של צומת מישור הבקרה באשכול קיים:

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.

השבתת היצירה של צומת מישור הבקרה

אתם יכולים לאפשר לתהליך kubelet לרשום צמתים בכל שלב. כדי לעשות את זה, צריך לציין את הערך KUBELET בדגל --node-creation-mode של Google Cloud CLI או את הערך VIA_KUBELET בשדה nodeCreationMode של האובייקט NodeCreationConfig ב-Kubernetes Engine API. באשכולות קיימים, השינוי הזה משפיע רק על צמתים חדשים באשכול.

הפקודה הבאה מעדכנת אשכול כדי להשבית את היצירה של צומת מישור הבקרה:

gcloud container clusters update CLUSTER_NAME \
    --node-creation-mode=KUBELET \
    --location=CONTROL_PLANE_LOCATION \

מחליפים את מה שכתוב בשדות הבאים:

  • ‫CLUSTER_NAME: שם האשכול.
  • ‫CONTROL_PLANE_LOCATION: האזור או התחום של מישור הבקרה של האשכול.

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