הגדרת 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 הבאים בפרויקט:

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

    gcloud components update

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

כדי לקבל את ההרשאות שנדרשות להגדרה ולפריסה של שירותי 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. \
      --network=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: שם המשאב של הרשת.
      • 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) ללא שרת

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

השלבים הבאים