הגדרת ניתוב DNS לכתובת IP וירטואלית (VIP) מוגבלת מאפשרת לאשכולות פרטיים של Google Kubernetes Engine לגשת למאגרים של Artifact Registry בתוך גבולות גזרה לשירות של VPC Service Controls.
מכיוון שצומתי אשכולות פרטיים מבודדים מהאינטרנט, ודומיינים של מרשם מתורגמים כברירת מחדל לכתובות IP ציבוריות, צריך לנתב את הבקשות לדומייניםpkg.dev ו-gcr.io דרך ה-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.
יוצרים אזור פרטי מנוהל.
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
-
-
מתחילים עסקה.
gcloud dns record-sets transaction start \ --zone=ZONE_NAME \ --project=PROJECT_IDכאשר:
ZONE_NAME הוא שם האזור שיצרתם בשלב הראשון.
PROJECT_ID הוא המזהה של הפרויקט שמארח את האשכול הפרטי ב-GKE.
מוסיפים רשומת 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
-
-
מוסיפים רשומת 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
-
-
מבצעים את העסקה.
gcloud dns record-sets transaction execute \ --zone=ZONE_NAME \ --project=PROJECT_IDכאשר:
ZONE_NAME הוא שם האזור שיצרתם בשלב הראשון.
PROJECT_ID הוא המזהה של הפרויקט שמארח את האשכול הפרטי ב-GKE.
אחרי שמגדירים את הניתוב של ה-DNS, צריך לוודא ש-GKE, המרשם ושירותים נדרשים אחרים נמצאים בתוך גבולות הגזרה לשירות של VPC Service Controls. בקטע הבא מוסבר איך להגדיר את גבולות הגזרה לשירות.
הגדרת גבולות הגזרה לשירות
אחרי הגדרת רשומות ה-DNS, מבצעים את הפעולות הבאות:
- יוצרים גבולות גזרה חדשים לשירות או מעדכנים גבולות גזרה קיימים.
- מוסיפים את השירות Container Registry או Artifact Registry לרשימת השירותים שרוצים להגן עליהם באמצעות גבולות הגזרה לשירות.
- מוסיפים לגבולות הגזרה לשירות שירותים נתמכים אחרים שאתם משתמשים בהם עם המאגר, כמו Cloud Build, Artifact Analysis ו-Binary Authorization.
- אם אתם צריכים לגשת ל-Container Registry, אתם צריכים להוסיף גם את Cloud Storage לגבולות גזרה לשירות.
איך מוודאים שההיקף פועל
אחרי הגדרת גבולות הגזרה לשירות, הצמתים באשכולות הפרטיים של GKE יכולים לגשת לקובצי אימג' של קונטיינרים ב-Artifact Registry וב-Container Registry, אם קובצי האימג' מאוחסנים בפרויקטים שנמצאים בגבולות הגזרה לשירות.אי אפשר לגשת לקובצי אימג' של קונטיינרים בפרויקטים שמחוץ להיקף, למעט מאגרים ציבוריים ספציפיים לקריאה בלבד.
לדוגמה, אם הפרויקט google-samples לא נמצא בגבולות הגזרה לשירות, הפעלת הפקודה ליצירת פריסה מהמאגר hello-app תיכשל:
הדומיין pkg.dev
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
הפקודה מחזירה טבלה שדומה לדוגמה הבאה. הסטטוס ErrImagePull של ה-pod מציין שהמשיכה נכשלה.
NAME READY STATUS RESTARTS AGE
hello-server-dbd86c8c4-h5wsf 1/1 ErrImagePull 0 45s
אפשר להשתמש בפקודה kubectl describe pod כדי לראות פרטים נוספים על הפריסה. ל-Pod בדוגמה הקודמת, הפקודה היא:
kubectl describe pod hello-server-dbd86c8c4-h5wsf