הגדרת Cloud Service Mesh ל-Cloud Run

בדף הזה מוסבר איך להגדיר את Cloud Service Mesh כך שיפעל במגוון תשתיות מחשוב לשירותי Cloud Run.

בעזרת Cloud Service Mesh אפשר להפעיל יכולות מתקדמות לניהול תעבורת נתונים ברשת, כמו פיצול תעבורת נתונים לפי משקל ואיזון עומסים גלובלי, וגם מדיניות ניראות ואבטחה לתעבורת נתונים משירות אחד של Cloud Run לשירות אחר. הוא גם מספק פתרון מנוהל מלא למישור הנתונים, שמסיר את הנטל התפעולי של תחזוקת רכיבי sidecar משלכם ב-Service mesh.

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

  1. להכיר את Cloud Service Mesh.

  2. מגדירים את הפרויקט:

    gcloud config set core/project PROJECT_ID
  3. במסוף Google Cloud , מפעילים את ממשקי ה-API הבאים בפרויקט:

    אם אתם משתמשים במחבר Serverless VPC Access ולא ב-Direct VPC ליציאה מהרשת.

  4. מעדכנים את הרכיבים של gcloud לגרסה האחרונה (488.0.0 ואילך):

    gcloud components update

מגבלות

יכול להיות ששירותי Cloud Run שמשתמשים ב-Cloud Service Mesh יחוו עלייה בחביון של הפעלה במצב התחלתי (cold start). בקטע טיפים כלליים לפיתוח במסמכי העזרה של Cloud Run יש עצות לשיפור זמני ההפעלה.

התפקידים הנדרשים

כדי לקבל את ההרשאות שנדרשות להגדרה ולפריסה של שירותי Cloud Run, צריך לבקש מהאדמין להקצות לכם את תפקידי ה-IAM הבאים:

לחשבון השירות של לקוח Cloud Run צריכים להיות גם התפקידים הבאים:

רשימת ההרשאות והתפקידים ב-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, צריך לבצע את השלבים הבאים:

  1. הגדרת Cloud Service Mesh
  2. הגדרה של Cloud DNS
  3. יצירת שירות היעד ב-Cloud Run
  4. יצירת ה-NEG ללא שרת
  5. יצירת שירות לקוח ב-Cloud Run
  6. התקשרות לשירות מלקוח הרשת

הגדרת Cloud Service Mesh

  1. כדי ליצור נתיב שירות באמצעות כתובת ה-URL שמוגדרת כברירת מחדל, שומרים את המפרט Mesh בקובץ בשם mesh.yaml:

    name: MESH_NAME

    מחליפים את MESH_NAME בשם של משאב הרשת.

  2. כדי לייבא את משאב 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 באזור בלעדי, מריצים את הפקודות הבאות:

    1. יצירת תחום DNS מנוהל פרטי ב-Cloud DNS עבור רשת שירותים.

      gcloud dns managed-zones create MESH_NAME \
      --description="Domain for DOMAIN_NAME service mesh routes" \
      --dns-name=DOMAIN_NAME. \
      --networks=VPC_NETWORK_NAME \
      --visibility=private
    2. יוצרים רשומת 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: שם המשאב של רשת ה-mesh.
      • VPC_NETWORK_NAME: השם של רשת ה-VPC, לדוגמה, default.

גישה לשירותים פנימיים באמצעות Cloud Service Mesh

ב-Cloud Run אפשר להגביל את תעבורת הרשת הנכנסת ל'פנימית'. אם ההגבלה הזו מופעלת בשירות שלכם, אפשר להגדיר את התנועה שעוברת מהרשת שלכם דרך רשת הענן הווירטואלי הפרטי (VPC) כ'פנימית' כשמפעילים נתיב גישה ל-Cloud Run.

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

יצירת שירות היעד ב-Cloud Run

הערה: אי אפשר להשבית את כתובת ה-URL שמוגדרת כברירת מחדל ביעד Cloud Run.

  1. פריסה של שירות חדש או קיים ב-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) בלי שרת (serverless)

  1. כדי ליצור את קבוצת ה-NEG של היעד, מריצים את הפקודה הבאה:

    gcloud compute network-endpoint-groups create DESTINATION_SERVICE_NAME-neg \
    --region=REGION \
    --network-endpoint-type=serverless \
    --cloud-run-service=DESTINATION_SERVICE_NAME

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

    • REGION: שם האזור.
    • DESTINATION_SERVICE_NAME: השם של שירות Cloud Run ביעד.
  2. יוצרים שירות פנימי לניהול עצמי של קצה עורפי שמפנה אל ה-NEG ללא שרת.

    1. יוצרים את שירות הקצה העורפי:

      gcloud compute backend-services create DESTINATION_SERVICE_NAME-REGION \
      --global \
      --load-balancing-scheme=INTERNAL_SELF_MANAGED

      מחליפים את DESTINATION_SERVICE_NAME בשם של שירות היעד ואת REGION בשם של האזור.

    2. מוסיפים את העורף בלי שרת (serverless) לשירות לקצה העורפי:

      gcloud compute backend-services add-backend DESTINATION_SERVICE_NAME-REGION \
      --global \
      --network-endpoint-group=DESTINATION_SERVICE_NAME-neg \
      --network-endpoint-group-region=REGION

      מחליפים את DESTINATION_SERVICE_NAME בשם של שירות היעד ואת REGION בשם של האזור.

  3. יוצרים נתיב HTTP שמפנה לשירות הקצה העורפי.

    המשאב Mesh והשירותים מוגדרים. מקשרים אותם למשאב HTTPRoute שמשייך שם מארח לשירות קצה עורפי.

    1. יוצרים את 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: שם האזור.
    2. יוצרים את המשאב HTTPRoute באמצעות המפרט בקובץ http_route.yaml:

      gcloud network-services http-routes import DESTINATION_SERVICE_NAME-route \
      --source=http_route.yaml \
      --location=global
      
    3. מקצים את התפקיד Cloud Run Invoker‏ (roles/iam.invoker) בשירות היעד של Cloud Run על ידי הרצת הפקודה הבאה:

      gcloud run services add-iam-policy-binding DESTINATION_SERVICE_NAME \
      --region REGION \
      --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 sidecar שהמשאבים שלו קשורים ל-QPS ולגודל הכולל של התצורה. ברוב המקרים, השימוש במעבד הוא פחות מאחוז אחד של 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 מהקטע הקודם יצירת שירות לקוח:

  1. מריצים את הפקודה הבאה כדי לאחזר את כתובת ה-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: מזהה הפרויקט.
  2. משתמשים בפקודה 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.

השלבים הבאים