הגדרת גישה מוגבלת לאשכולות פרטיים של GKE

במאמר הזה נסביר איך להגדיר רשומות DNS כדי לנתב בקשות לדומיינים pkg.dev ו-gcr.io באמצעות כתובת IP וירטואלית (VIP) מוגבלת כשמשתמשים באשכולות פרטיים של Google Kubernetes Engine בגבולות גזרה לשירות של VPC Service Controls.

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

כדי למנוע זליגת מידע משירות נתמך לשירות לא נתמך, צריך לוודא שלקלאסטרים פרטיים תמיד תהיה גישה ל-Artifact Registry או ל-Container Registry באמצעות כתובת ה-VIP המוגבלת.

הגדרת גישה מוגבלת לאשכולות פרטיים של GKE כשכל התנאים הבאים מתקיימים:

  • אתם משתמשים באשכולות פרטיים של GKE.
  • עדיין לא הגדרתם ניתוב של הדומיינים pkg.dev או gcr.io של הרשם אל restricted.googleapis.com.

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

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

בנוסף, צריך לאפשר יציאה לכתובת 199.36.153.4/30 ביציאה 443. בדרך כלל, ברשת VPC יש כלל מרומז שמאפשר את כל תעבורת הנתונים היוצאת (egress) לכל יעד. עם זאת, אם יש לכם כלל שחוסם תעבורת נתונים כזו, אתם צריכים ליצור כלל חומת אש לתעבורת נתונים יוצאת כדי לאפשר תעבורת נתונים מסוג TCP ביציאה 443 אל ‎199.36.153.4/30.

הגדרת DNS

מגדירים את שרת ה-DNS כך שבקשות לכתובות המרשם יפענחו את restricted.googleapis.com, כתובת ה-VIP המוגבלת. אפשר לעשות את זה באמצעות אזורי DNS פרטיים ב-Cloud DNS.

  1. יוצרים אזור פרטי מנוהל.

    gcloud dns managed-zones create ZONE_NAME \
        --visibility=private \
        --networks=https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/networks/NETWORK \
        --description=DESCRIPTION \
        --dns-name=REGISTRY_DOMAIN \
        --project=PROJECT_ID
    

    כאשר:

    • ZONE_NAME הוא שם האזור שאתם יוצרים. לדוגמה, registry. השם הזה ישמש אתכם בכל אחד מהשלבים הבאים.
    • PROJECT_ID הוא מזהה הפרויקט שמארח את האשכול הפרטי של GKE.
    • NETWORK היא רשימה אופציונלית של שמות של רשתות אשכולות שמהן רוצים להפנות בקשות.
    • DESCRIPTION הוא תיאור קריא (לבני אדם) של האזור המנוהל.
    • REGISTRY_DOMAIN הוא הדומיין של הרשם:
      • pkg.dev ל-Artifact Registry
      • gcr.io ל-Container Registry או למאגרי gcr.io שמתארחים ב-Artifact Registry
  2. מתחילים עסקה.

    gcloud dns record-sets transaction start \
      --zone=ZONE_NAME \
      --project=PROJECT_ID
    

    כאשר:

    • ZONE_NAME הוא השם של האזור שיצרתם בשלב הראשון.

    • PROJECT_ID הוא מזהה הפרויקט שמארח את האשכול הפרטי של GKE.

  3. מוסיפים רשומת CNAME לרישום.

    gcloud dns record-sets transaction add \
      --name=*.REGISTRY_DOMAIN. \
      --type=CNAME REGISTRY_DOMAIN. \
      --zone=ZONE_NAME \
      --ttl=300 \
      --project=PROJECT_ID
    

    כאשר:

    • ZONE_NAME הוא שם האזור שיצרתם בשלב הראשון.
    • PROJECT_ID הוא מזהה הפרויקט שמארח את האשכול הפרטי של GKE.
    • REGISTRY_DOMAIN הוא הדומיין של הרשם:
      • pkg.dev ל-Artifact Registry
      • gcr.io ל-Container Registry או למאגרי gcr.io שמתארחים ב-Artifact Registry
  4. מוסיפים רשומת A ל-VIP המוגבל.

    gcloud dns record-sets transaction add \
      --name=REGISTRY_DOMAIN. \
      --type=A 199.36.153.4 199.36.153.5 199.36.153.6 199.36.153.7 \
      --zone=ZONE_NAME \
      --ttl=300 \
      --project=PROJECT_ID
    

    כאשר:

    • ZONE_NAME הוא שם האזור שיצרתם בשלב הראשון.
    • PROJECT_ID הוא מזהה הפרויקט שמארח את האשכול הפרטי של GKE.
    • REGISTRY_DOMAIN הוא הדומיין של הרשם:
      • pkg.dev ל-Artifact Registry
      • gcr.io ל-Container Registry או למאגרי gcr.io שמתארחים ב-Artifact Registry
  5. מבצעים את העסקה.

    gcloud dns record-sets transaction execute \
      --zone=ZONE_NAME \
      --project=PROJECT_ID
    

    כאשר:

    • ZONE_NAME הוא השם של האזור שיצרתם בשלב הראשון.

    • PROJECT_ID הוא מזהה הפרויקט שמארח את האשכול הפרטי של GKE.

אחרי שמגדירים את ניתוב ה-DNS, צריך לוודא ש-GKE, המאגר ושאר השירותים הנדרשים נמצאים בתוך גבולות גזרה לשירות של VPC Service Controls. הוראות להגדרת גבולות גזרה לשירות מופיעות בקטע הבא.

הגדרת גבולות גזרה לשירות

אחרי הגדרת רשומות ה-DNS, מבצעים את הפעולות הבאות:

  1. יוצרים גבולות גזרה לשירות חדשים או מעדכנים גבולות גזרה לשירות קיימים.
  2. מוסיפים את השירות Container Registry או Artifact Registry לרשימת השירותים שרוצים להגן עליהם באמצעות גבולות גזרה לשירות.
  3. מוסיפים לגבולות גזרה לשירות שירותים נתמכים אחרים שבהם אתם משתמשים עם המאגר, כמו Cloud Build,‏ Artifact Analysis ו-Binary Authorization.
  4. אם אתם צריכים לגשת ל-Container Registry, אתם צריכים להוסיף גם את Cloud Storage לגבולות גזרה לשירות.

איך מוודאים שגבולות הגזרה פועלים

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

לא ניתן לגשת לקובצי אימג' של קונטיינרים בפרויקטים שמחוץ לגבולות גזרה, למעט מאגרי מידע ציבוריים מסוימים לקריאה בלבד.

לדוגמה, אם הפרויקט google-samples לא נמצא בגבולות גזרה לשירות, הפעלת הפקודה ליצירת Deployment (פריסה) מהקונטיינר hello-app תיכשל:

‫ pkg.dev domain

kubectl create deployment hello-server --image=us-docker.pkg.dev/google-samples/containers/gke/hello-app:1.0

דומיין gcr.io

kubectl create deployment hello-server --image=gcr.io/google-samples/hello-app:1.0

בודקים את הסטטוס של ה-pod באמצעות הפקודה:

kubectl get pods

הפקודה מחזירה טבלה שדומה לדוגמה הבאה. הסטטוס של ה-Pod‏ ErrImagePull מציין שהשליפה נכשלה.

NAME                            READY   STATUS         RESTARTS   AGE
hello-server-dbd86c8c4-h5wsf    1/1     ErrImagePull   0          45s

אפשר להשתמש בפקודה kubectl describe pod כדי לראות פרטים נוספים על הפריסה. בדוגמה הקודמת, הפקודה היא:

kubectl describe pod hello-server-dbd86c8c4-h5wsf