הגדרת Cloud Service Mesh ל-Cloud Run
בדף הזה מוסבר איך להגדיר את Cloud Service Mesh כך שיפעל במגוון תשתיות מחשוב לשירותי Cloud Run.
בעזרת Cloud Service Mesh אפשר להפעיל יכולות מתקדמות לניהול תעבורת נתונים ברשת, כמו פיצול תעבורת נתונים לפי משקל ואיזון עומסים גלובלי, וגם מדיניות ניראות ואבטחה לתעבורת נתונים משירות אחד של Cloud Run לשירות אחר. הוא גם מספק פתרון מנוהל לחלוטין של מישור נתונים, שמסיר את הנטל התפעולי של תחזוקת רכיבי Sidecar של Service mesh משלכם.
לפני שמתחילים
להכיר את Cloud Service Mesh.
מגדירים את הפרויקט:
gcloud config set core/project
PROJECT_IDבמסוף Google Cloud , מפעילים את ממשקי ה-API הבאים בפרויקט:
Serverless VPC Access API אם אתם משתמשים במחבר של חיבור לרשת (VPC) מאפליקציית serverless ולא בחיבור ישיר לרשת (VPC) כדי להגדיר תעבורת נתונים יוצאת (egress) מהרשת.
מעדכנים את הרכיבים של
gcloudלגרסה האחרונה (488.0.0 ואילך):gcloud components update
התפקידים הנדרשים
כדי לקבל את ההרשאות שנדרשות להגדרה ולפריסה של שירותי Cloud Run, צריך לבקש מהאדמין להקצות לכם את תפקידי ה-IAM הבאים:
- Cloud Run Developer (
roles/run.developer) בשירות Cloud Run - משתמש בחשבון שירות
(
roles/iam.serviceAccountUser) בזהות השירות
לחשבון השירות של לקוח Cloud Run צריכים להיות גם התפקידים הבאים:
- Traffic Director Client
(
roles/trafficdirector.client) כדי לגשת אל ממשקי ה-API לניתוב שירותים - Cloud Trace Agent (
roles/cloudtrace.agent) כדי להפעיל מעקב
רשימת ההרשאות והתפקידים ב-IAM שמשויכים ל-Cloud Run מופיעה במאמרים תפקידי IAM ב-Cloud Run והרשאות IAM ב-Cloud Run. אם שירות Cloud Run שלכם מתקשר עםGoogle Cloud ממשקי API, כמו ספריות לקוח ב-Cloud, כדאי לעיין במדריך להגדרת זהות שירות. מידע נוסף על מתן תפקידים זמין במאמרים הרשאות פריסה וניהול גישה.
קריאה בין שירותי Cloud Run באמצעות Cloud Service Mesh
Cloud Run משתמש בממשקי API לניתוב שירותים של Cloud Service Mesh.
ממשקי ה-API האלה מאפשרים לשירות Cloud Run להפעיל שירותי Cloud Run אחרים באמצעות כתובת URL מותאמת אישית, במקום כתובת ה-URL run.app שסופקה. בנוסף, Cloud Run מבצע אימות אוטומטי לשירות היעד ב-Cloud Run, כך שלא צריך להגדיר אימות משלכם כדי לצרף פרטי כניסה לבקשה לשירותים אחרים ב-Cloud Run.
כדי להתקשר משירות אחד ב-Cloud Run לשירות אחר באמצעות Cloud Service Mesh, צריך לבצע את השלבים הבאים:
- הגדרת Cloud Service Mesh
- הגדרה של Cloud DNS
- יצירת שירות היעד ב-Cloud Run
- יצירת ה-NEG ללא שרת
- יצירת שירות הלקוח של Cloud Run
- התקשרות לשירות מלקוח הרשת
הגדרת Cloud Service Mesh
כדי ליצור נתיב שירות באמצעות כתובת ה-URL שמוגדרת כברירת מחדל, שומרים את המפרט
Meshבקובץ בשםmesh.yaml:name:
MESH_NAMEמחליפים את
MESH_NAMEבשם משאב הרשת.כדי לייבא את משאב
Meshמהמפרט, מריצים את הפקודה הבאה:gcloud network-services meshes import
MESH_NAME\ --source=mesh.yaml \ --location=globalמחליפים את
MESH_NAMEבשם משאב הרשת.
הגדרת Cloud DNS
אם אתם משתמשים בנקודת קצה (endpoint) של Private Service Connect עם כתובת ה-URL המלאה run.app כשם המארח, אתם יכולים לדלג על ההגדרה של Cloud DNS ולעבור אל הקטע הבא, כי רק כתובות IP פרטיות נרשמות.
כשלקוח של רשת Mesh קורא לשירות היעד, שם המארח שמשמש בבקשה חייב להיות ניתן לפתרון באמצעות DNS. אפשר להשתמש בכל כתובת IP תקינה של RFC 1918, כי קובץ ה-sidecar מתעד את כל תעבורת ה-IP לטווחי כתובות ה-IP האלה ומפנה אותה מחדש בהתאם.
בדוגמה הבאה מוצג אופן היצירה של רשומת wildcard * באזור Cloud DNS שמתפרשת ככתובת IP יחידה. אם אתם לא רוצים להשתמש בתחום DNS בלעדי של Cloud DNS, צרו רשומה של Cloud DNS לכל שם מארח שמתאים לשירותי Cloud Run שאתם רוצים שיהיה אפשר לגשת אליהם מהרשת.
כדי ליצור רשומת DNS ב-Cloud DNS באזור בלעדי, מריצים את הפקודות הבאות:
יצירת תחום DNS מנוהל פרטי ב-Cloud DNS עבור רשת שירותים.
gcloud dns managed-zones create
MESH_NAME\ --description="Domain forDOMAIN_NAMEservice mesh routes" \ --dns-name=DOMAIN_NAME. \ --network=VPC_NETWORK_NAME\ --visibility=privateיוצרים רשומת DNS בתוך האזור הפרטי המנוהל שנוצר. מוודאים שכתובת ה-IP
10.0.0.1לא נמצאת בשימוש.gcloud dns record-sets create "*.
DOMAIN_NAME." \ --type=A \ --zone="MESH_NAME" \ --rrdatas=10.0.0.1 \ --ttl=3600מחליפים את מה שכתוב בשדות הבאים:
-
DOMAIN_NAME: השם של דומיין ה-DNS. -
MESH_NAME: שם המשאב של הרשת. -
VPC_NETWORK_NAME: השם של רשת ה-VPC, למשל default.
-
גישה לשירותים פנימיים באמצעות Cloud Service Mesh
ב-Cloud Run אפשר להגביל את תנועה ברשת הנכנסת ל'פנימית'. אם ההגבלה הזו על תעבורת נכנסת מופעלת בשירות, אפשר להגדיר את התעבורה שעוברת מהרשת דרך רשת הענן הווירטואלי הפרטי (VPC) כ'פנימית' כשמפעילים נתיב גישה ל-Cloud Run.
כדי לגשת לשירותים פנימיים באמצעות Cloud Service Mesh, משתמשים באחת מהשיטות הבאות:
- הגדרת גישה פרטית ל-Google עבור רשת ה-VPC לא צריך להגדיר רשומת DNS בהתאמה אישית.
- איך מצרפים נקודת קצה מסוג Private Service Connect ל-Cloud Service Mesh
כדי לעשות זאת, צריך להגדיר רשומת DNS בהתאמה אישית לכתובת ה-URL
*.run.appשמוגדרת כברירת מחדל כדי להשתמש בכתובת נקודת הקצה (endpoint) של Private Service Connect.
יצירת שירות היעד ב-Cloud Run
הערה: אי אפשר להשבית את כתובת ה-URL שמוגדרת כברירת מחדל ביעד Cloud Run.
פריסה של שירות חדש או קיים ב-Cloud Run:
gcloud run deploy
DESTINATION_SERVICE_NAME\ --no-allow-unauthenticated \ --region=REGION\ --image=IMAGE_URLמחליפים את מה שכתוב בשדות הבאים:
-
DESTINATION_SERVICE_NAME: השם של שירות Cloud Run ביעד. -
REGION: שם האזור. -
IMAGE_URL: הפניה לקובץ אימג' של קונטיינר, למשלus-docker.pkg.dev/cloudrun/container/hello:latest.
-
יצירת קבוצה של נקודות קצה ברשת (NEG) ללא שרת
כדי ליצור את קבוצת ה-NEG של היעד, מריצים את הפקודה הבאה:
gcloud compute network-endpoint-groups create destination-neg \ --region=
REGION\ --network-endpoint-type=serverless \ --cloud-run-service=DESTINATION_SERVICE_NAMEמחליפים את מה שכתוב בשדות הבאים:
-
REGION: שם האזור. -
DESTINATION_SERVICE_NAME: השם של שירות Cloud Run ביעד.
-
יוצרים שירות פנימי של קצה עורפי בניהול עצמי שמפנה אל ה-NEG ללא שרתים.
יוצרים את שירות הקצה העורפי:
gcloud compute backend-services create
DESTINATION_SERVICE_NAME-REGION\ --global \ --load-balancing-scheme=INTERNAL_SELF_MANAGEDמחליפים את
DESTINATION_SERVICE_NAMEבשם של שירות היעד ואתREGIONבשם של האזור.מוסיפים את הקצה העורפי בלי שרת (serverless) לשירות לקצה העורפי:
gcloud compute backend-services add-backend
DESTINATION_SERVICE_NAME-REGION\ --global \ --network-endpoint-group=destination-neg \ --network-endpoint-group-region=REGIONמחליפים את
DESTINATION_SERVICE_NAMEבשם של שירות היעד ואתREGIONבשם של האזור.
יוצרים נתיב HTTP שמפנה לשירות הקצה העורפי.
המשאב
Meshוהשירותים מוגדרים. אפשר לקשר אותם למשאבHTTPRouteשמקשר שם מארח לשירות לקצה העורפי.יוצרים את
HTTPRouteושומרים אותו בקובץ בשםhttp_route.yaml:name: "
DESTINATION_SERVICE_NAME-route" hostnames: - "DESTINATION_SERVICE_NAME.DOMAIN_NAME" meshes: - "projects/PROJECT_ID/locations/global/meshes/MESH_NAME" rules: - action: destinations: - serviceName: "projects/PROJECT_ID/locations/global/backendServices/DESTINATION_SERVICE_NAME-REGION"מגדירים את שמות המארחים לשמות שרוצים להשתמש בהם כדי לפנות לשירות. כל הלקוחות באותו Service mesh יכולים להתקשר לשירות הזה באמצעות כתובת ה-URL
http://<HOSTNAME>, ללא קשר לאזור ולפרויקט של המתקשר. אם הגדרתם את Cloud DNS לשימוש בכתובת IP פרטית, שם המארח של המסלול יכול להיות גם כתובת ה-URL המלאה שלrun.app. במקרה כזה, אפשר לדלג על שלב ההגדרה של Cloud DNS.מחליפים את מה שכתוב בשדות הבאים:
-
DESTINATION_SERVICE_NAME: השם של שירות Cloud Run ביעד. -
DOMAIN_NAME: השם של דומיין ה-DNS. -
PROJECT_ID: מזהה הפרויקט -
MESH_NAME: השם של הרשת. -
REGION: שם האזור.
-
יוצרים את המשאב
HTTPRouteבאמצעות המפרט בקובץhttp_route.yaml:gcloud network-services http-routes import
DESTINATION_SERVICE_NAME-route \ --source=http_route.yaml \ --location=globalמקצים את התפקיד Cloud Run Invoker (
roles/iam.invoker) בשירות היעד של Cloud Run על ידי הרצת הפקודה הבאה:gcloud run services add-iam-policy-binding
DESTINATION_SERVICE_NAME\ --regionREGION\ --member=serviceAccount:PROJECT_NUMBER-compute@developer.gserviceaccount.com \ --role=roles/run.invokerמחליפים את מה שכתוב בשדות הבאים:
-
DESTINATION_SERVICE_NAME: השם של שירות Cloud Run ביעד. -
REGION: שם האזור. -
PROJECT_NUMBER: מספר הפרויקט.
-
יצירת שירות לקוח ב-Cloud Run
כשיוצרים שירות Cloud Run של לקוח, נוצר קובץ עזר של Envoy שהמשאבים שלו קשורים לשאילתות לשנייה ולגודל הכולל של ההגדרה. ברוב המקרים, השימוש במעבד הוא פחות מאחוז אחד של vCPU, והשימוש בזיכרון הוא פחות מ-50MB.
צריכה להיות לכם גישה לתעבורת נתונים יוצאת (egress) ברשת של ענן וירטואלי פרטי (VPC).
כדי ליצור את שירות הלקוח לבדיקה, פורסים את אפליקציית fortio ב-Cloud Run כדי לאפשר העברת תנועה למסלולי HTTP:
gcloud beta run deploy
CLIENT_SERVICE_NAME\ --region=REGION\ --image=fortio/fortio \ --network=VPC_NETWORK_NAME\ --subnet=SUBNET_NAME\ --mesh="projects/PROJECT_ID/locations/global/meshes/MESH_NAME"מחליפים את מה שכתוב בשדות הבאים:
-
CLIENT_SERVICE_NAME: השם של שירות הלקוח ב-Cloud Run. -
REGION: שם האזור. -
VPC_NETWORK_NAME: השם של רשת ה-VPC, לדוגמה, default. -
SUBNET_NAME: השם של רשת המשנה, לדוגמה, default. -
PROJECT_ID: מזהה הפרויקט. -
MESH_NAME: שם משאב הרשת.
-
התקשרות לשירות מלקוח ברשת Mesh
כדי להעביר בקשה למסלול היעד באמצעות אפליקציית הבדיקה fortio מהקטע הקודם יצירת שירות לקוח:
מריצים את הפקודה הבאה כדי לאחזר את כתובת ה-URL של שירות הלקוח של Cloud Run שיצרתם:
TEST_SERVICE_URL=$(gcloud run services describe
CLIENT_SERVICE_NAME\ --region=REGION--format="value(status.url)" \ --project=PROJECT_ID)מחליפים את מה שכתוב בשדות הבאים:
-
CLIENT_SERVICE_NAME: השם של שירות הלקוח ב-Cloud Run. -
REGION: שם האזור. -
PROJECT_ID: מזהה הפרויקט.
-
משתמשים בפקודה
curlכדי לשלוח בקשה לנתיב היעד של נקודת הקצה של Fortio מהשלב הקודם:curl -H "Authorization: Bearer $(gcloud auth print-identity-token)" "$TEST_SERVICE_URL/fortio/fetch/
DESTINATION_SERVICE_NAME.DOMAIN_NAME"מחליפים את מה שכתוב בשדות הבאים:
-
DESTINATION_SERVICE_NAME: השם של שירות Cloud Run ביעד. -
DOMAIN_NAME: השם של דומיין ה-DNS.
-
קריאה לקצה עורפי של Compute Engine מ-Cloud Run
כדי לפרוס נתיב שירות של Compute Engine ו-Cloud Service Mesh באמצעות קבוצות של מופעים מנוהלים כשרתי קצה עורפיים, צריך להגדיר את שרת ה-HTTP שמבוסס על Compute Engine ב-Cloud Service Mesh. כך לקוחות Cloud Run יכולים להשתמש בנתיב הזה של שירות הקצה העורפי כדי לשלוח בקשות ישירות למכונות Compute Engine.
השלבים הבאים
- בחינת הגדרות נפוצות של רשתות ב-Cloud Run לרשתות ציבוריות ופרטיות
- הגדרת רשת פרטית ל-Cloud Run
- הגדרת שרתי Proxy של Envoy עם שירותי HTTP