הגדרת שרת proxy בחלק הקדמי של האתר באמצעות Nginx

בדף הזה מוסבר איך להשתמש ב-Nginx כפרוקסי frontend עבור קונטיינר האפליקציה. האפשרות הזו שימושית אם רוצים לעבד בקשות או תגובות. אתם יכולים להוסיף דחיסת gzip, או לתרגם HTTP/2 ל-HTTP/1 אם קובצי ה-container של האפליקציה תומכים רק ב-HTTP/1 ואתם צריכים להשתמש ב-HTTP/2 מקצה לקצה מסיבות שקשורות לביצועים.

בדוגמה שמופיעה בדף הזה, קונטיינר Nginx פועל בכל מופע של Cloud Run כקונטיינר הראשי להצגת תוכן, והוא מוגדר להעברת בקשות לקונטיינר האפליקציה, שפועל כקונטיינר sidecar, כפי שמוצג בתרשים הזה:

Cloud Run mc hello nginx 1

הדרך הכי יעילה להגדיר פרוקסי לקצה הקדמי ב-Cloud Run היא לפרוס את קונטיינר שרת הפרוקסי של Nginx ואת קונטיינר אפליקציית האינטרנט כשירות Cloud Run יחיד:

‫Cloud Run mc hello nginx 2

שירות Cloud Run יחיד מקבל בקשות ומעביר אותן לקונטיינר של ה-ingress (הקונטיינר שממלא את הבקשות), שהוא במקרה הזה שרת ה-proxy. לאחר מכן, שרת ה-proxy שולח בקשות לאפליקציית האינטרנט דרך ממשק הרשת של localhost, וכך נמנעת גישה לרשת חיצונית.

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

אפשר לכתוב את מאגר האפליקציות לאינטרנט ואת כל מאגרי ה-sidecar בשפות תכנות שונות. דוגמה שכתובה ב-PHP זמינה בדוגמה ל-PHP nginx ב-GitHub.

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

  1. In the Cloud de Confiance console, on the project selector page, select or create a Cloud de Confiance project.

    Roles required to select or create a project

    • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
    • Create a project: To create a project, you need the Project Creator role (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  2. Verify that billing is enabled for your Cloud de Confiance project.

  3. מפעילים את ממשקי ה-API של Cloud Run ו-Secret Manager, אם הם עדיין לא מופעלים.

    תפקידים שנדרשים להפעלת ממשקי API

    כדי להפעיל ממשקי API, נדרשת ההרשאה serviceusage.services.enable. אם יצרתם את הפרויקט, סביר להניח שכבר יש לכם את ההרשאה הזו דרך התפקיד 'בעלים' (roles/owner). אחרת, תוכלו לקבל את ההרשאה הזו דרך התפקיד 'אדמין בממשק Service Usage' (roles/serviceusage.serviceUsageAdmin). איך מקצים תפקידים

    הפעלת ממשקי ה-API

  4. מתקינים ומפעילים את ה-CLI של gcloud.
  5. מעדכנים את Google Cloud CLI: gcloud components update
  6. מגדירים את Google Cloud CLI: gcloud init
  7. מאמתים את הזהות באמצעות Google Cloud CLI: gcloud auth login

ההרשאות שנדרשות לפריסה

צריך להיות לכם אחד מהפריטים הבאים:

סקירה כללית של ההגדרה

ההוראות האלה מתבססות על קובצי אימג' מוכנים מראש של קונטיינרים, כך שכל מה שצריך לעשות כדי להגדיר שרת proxy לקצה הקדמי הוא להגדיר את הקונטיינרים ואת השירות עצמו.

הגדרת קונטיינר Nginx ingress

קובץ האימג' של הקונטיינר nginx זמין ב-Docker Hub. הוא מוכן לשימוש כמעט כמו שהוא, אבל צריך להגדיר אותו כך שיפעל כשירות proxy, ויעביר את הבקשות שעברו דרך ה-proxy אל היציאה שבה מאזין קונטיינר ה-sidecar localhost. בדוגמה שבדף הזה מופעלת גם דחיסת gzip לבקשות ולתגובות.

ההגדרה מסופקת באמצעות קובץ טקסט שנטען ב-/etc/nginx/conf.d/nginx.conf. אי אפשר לערוך קבצים ישירות במאגר, ולכן צריך לטעון נפח ב-/etc/nginx/conf.d/ שמכיל את קובץ התצורה. אחת הדרכים לטפל בקובץ במיקום ספציפי בקונטיינר שפועל ב-Cloud Run היא לאחסן את תוכן הקובץ בסוד של Secret Manager, ולטפל בסוד הזה במיקום שנבחר.

מעתיקים את הקוד הבא לקובץ בשם nginx.conf בספרייה הנוכחית במחשב המקומי.


server {
    # Listen at port 8080
    listen 8080; 
    # Server at localhost
    server_name _;
    # Enables gzip compression to make our app faster
    gzip on;

    location / {
        # Passes initial requests to port 8080 to `hello` container at port 8888
        proxy_pass   http://127.0.0.1:8888;
    }
}

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

  • מקצים את nginx להאזין באותה יציאת ברירת מחדל של Cloud Run‏ 8080, שנמצאת ב-localhost.
  • כדאי להשתמש בדחיסת gzip כדי לשפר את הביצועים.
  • מנחים את proxy_pass להעביר את כל הבקשות למאגר הכניסה הזה אל מאגר ה-sidecar של אפליקציית האינטרנט ביציאה 8888 ב-localhost.

יוצרים סוד עם התוכן של קובץ nginx.conf.

המסוף

  1. נכנסים לדף Secret Manager במסוף Cloud de Confiance :

    מעבר אל Secret Manager

  2. לוחצים על יצירת סוד.

  3. בשדה הטופס name, מזינים nginx_config.

  4. מעלים את הקובץ nginx.conf שנמצא במיקום multi-container/hello-nginx-sample/nginx.conf בתור הערך הסודי.

  5. משאירים את ברירות המחדל (Google Cloud-powered encryption key, etc).

  6. לוחצים על יצירת סוד.

  7. נותנים לחשבון השירות של Compute בפרויקט גישה לסוד החדש הזה. כדי לעשות את זה, נכנסים לדף IAM במסוף Cloud de Confiance :

    כניסה לדף IAM

  8. מחפשים את חשבון השירות הראשי עם השם: Compute Engine default service account ולוחצים על Edit principal (עריכת חשבון המשתמש).

  9. לוחצים על Add another role ובוחרים באפשרות Secret Manager Secret Accessor.

  10. לוחצים על Save.

gcloud

  1. במסוף, משתמשים בפקודה הבאה כדי ליצור סוד חדש nginx_config ב-Secret Manager:

    gcloud secrets create nginx_config --replication-policy='automatic' --data-file='./nginx.conf'

  2. נותנים לחשבון השירות של Compute בפרויקט גישה לסוד החדש באמצעות הפקודה

    export PROJECT_NUMBER=$(gcloud projects describe $(gcloud config get-value project) --format='value(projectNumber)')
    gcloud secrets add-iam-policy-binding nginx_config --member=serviceAccount:$PROJECT_NUMBER-compute@developer.s3ns-system.iam.gserviceaccount.com --role='roles/secretmanager.secretAccessor'

  3. כדי לוודא שהסוד נוצר, מריצים את הפקודה gcloud secrets list.

מידע על תמונת הדוגמה של סרגל הצד באפליקציית האינטרנט

ההוראות האלה מתבססות על קובץ אימג' של קונטיינר לדוגמה בכתובת us-docker.pkg.dev/cloudrun/container/hello. צריך לציין את מספר היציאה שהקונטיינר יאזין לו ואת localhost כמארח, כמו שמתואר בקטע ציון הגדרות של קונטיינר sidecar, כפי שמתואר בקטעים הבאים.

הגדרת השירות מרובה הקונטיינרים

אתם יכולים להשתמש במסוף Cloud de Confiance או בקובץ ה-YAML של Cloud Run כדי להגדיר שירות Cloud Run עם יותר מקונטיינר אחד.

בהגדרת השירות, מציינים את שרת ה-proxy של Nginx כמאגר (serving) של תעבורת נכנסת, את היציאה שבה הוא יאזין, אם הוא מקבל בקשות HTTP 1 או HTTP 2 ואת סדר ההפעלה של מאגר התגים. מאגר הכניסה (שרת proxy) תלוי ב-sidecar של אפליקציית האינטרנט, ולכן צריך להפעיל קודם את ה-sidecar של אפליקציית האינטרנט.

התצורות האלה מוצגות בכמה מהקטעים הבאים.

הוספת מטא-נתונים של YAML

המסוף

הוראות מלאות לשימוש במסוף מופיעות במאמר פריסת השירות.

YAML

  1. אם אתם יוצרים שירות חדש, דלגו על השלב הזה. אם אתם מעדכנים שירות קיים, אתם צריכים להוריד את הגדרות ה-YAML שלו:

    gcloud run services describe SERVICE --format export > service.yaml
  2. ב-service.yaml, מוסיפים את הפריטים הבאים:

    metadata:
      name: "MC_SERVICE_NAME"
      labels:
        cloud.googleapis.com/location: "REGION"
      annotations:
        # Required to use Cloud Run multi-containers (preview feature)
        run.googleapis.com/launch-stage: BETA
        run.googleapis.com/description: sample tutorial service
        # Externally available
        run.googleapis.com/ingress: all

בקטע הזה מתואר גרסת השירות, שכוללת מאפיינים שיכולים להשתנות מגרסה לגרסה.

הגדרה של סדר הפעלת הקונטיינרים

המסוף

הוראות מלאות לשימוש במסוף מופיעות במאמר פריסת השירות.

YAML

ב-service.yaml, מוסיפים את הטקסט הבא:

spec:
  template:
    metadata:
      annotations:
        # Defines container startup order within multi-container service.
        # Below requires hello container to spin up before nginx container,
        # which depends on the hello container.
        # https://cloud.google.com/run/docs/configuring/containers#container-ordering
        run.googleapis.com/container-dependencies: "{nginx: [hello]}"

שימו לב להערה container-dependencies שמורה ל-Cloud Run להמתין עד שהקונטיינר hello יופעל לפני הפעלת הקונטיינר nginx. אחרת, אם קונטיינר nginx יופעל ראשון, הוא עלול לנסות להעביר שרת proxy בקשה לאחזור מהרשת לקונטיינר של אפליקציית האינטרנט שלא מוכן, וכתוצאה מכך ייווצרו תגובות שגיאה באינטרנט.

אפשר להגדיר לכל קונטיינר מאפיין שם, שמשמש להפניה אליו בהוראות אחרות. קונטיינר ההצגה מפעיל את שרת ה-proxy שנקרא nginx. זהו הקונטיינר שאליו Cloud Run מעביר בקשות נכנסות, ולכן צריך לציין את הגרסה של HTTP ואת יציאת הקונטיינר שאליהן הבקשות יועברו.

ציון הגדרות של קונטיינר להצגת מודעות

המסוף

הוראות מלאות לשימוש במסוף מופיעות במאמר פריסת השירות.

YAML

בקובץ service.yaml, מוסיפים את השורות הבאות:

spec:
  containers:
    # A) Serving ingress container "nginx" listening at PORT 8080
    # Main entrypoint of multi-container service.
    # Source is stored in nginx_config secret in Secret Manager.
    # Any pings to this container will proxy over to hello container at PORT 8888.
    # https://cloud.google.com/run/docs/container-contract#port
    - image: nginx
      name: nginx
      ports:
        - name: http1
          containerPort: 8080
      resources:
        limits:
          cpu: 500m
          memory: 256Mi
      # Referencing declared volume below,
      # Declaring volume to mount in current ingress container's filesystem
      # https://cloud.google.com/run/docs/reference/rest/v2/Container#volumemount
      volumeMounts:
        - name: nginx-conf-secret
          readOnly: true
          mountPath: /etc/nginx/conf.d/
      startupProbe:
        timeoutSeconds: 240
        periodSeconds: 240
        failureThreshold: 1
        tcpSocket:
          port: 8080

השרת nginx דורש קובץ הגדרה בספרייה /etc/nginx/conf.d/. כדי לעשות את זה, צריך לטעון נפח אחסון שמכיל את הקובץ במיקום הזה. בקטע volumeMount מצוין שצריך להציב שם עוצמת קול שנקראת configuration. הווליום עצמו מוגדר בקטע משלו בהמשך הקובץ.

ציון הגדרות של קונטיינר sidecar

המסוף

הוראות מלאות לשימוש במסוף מופיעות במאמר פריסת השירות.

YAML

ב-service.yaml, מוסיפים את הטקסט הבא:

- image: us-docker.pkg.dev/cloudrun/container/hello
  name: hello
  env:
    - name: PORT
      value: "8888"
  resources:
    limits:
      cpu: 1000m
      memory: 512Mi
  startupProbe:
    timeoutSeconds: 240
    periodSeconds: 240
    failureThreshold: 1
    tcpSocket:
      port: 8888

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

ציון הנפח הסודי

המסוף

הוראות מלאות לשימוש במסוף מופיעות במאמר פריסת השירות.

YAML

בקובץ service.yaml, מוסיפים את השורות הבאות:

volumes:
  - name: nginx-conf-secret
    secret:
      secretName: nginx_config
      items:
        - key: latest
          path: default.conf

מציינים את ההגדרה volume שמועלית בקטע volumeMount. הוא מכיל קובץ יחיד בשם nginx.conf שהתוכן שלו מוגדר כערך של הסוד שנקרא nginx-conf-secret.

פריסת השירות

המסוף

  1. נכנסים לדף Cloud Run במסוף Cloud de Confiance :

    כניסה ל-Cloud Run

  2. בתפריט בוחרים באפשרות Services (שירותים) ולוחצים על Deploy container (פריסת מאגר) כדי להציג את הטופס Create service (יצירת שירות).

    1. בוחרים באפשרות Deploy one revision from an existing container image (פריסת עדכון אחד מקובץ אימג' קיים של קונטיינר) ומזינים את nginx בתור Container image URL (כתובת URL של קובץ אימג' של קונטיינר).
    2. בשדה Service name (שם השירות), מציינים שם לשירות, לדוגמה, hello-mc.
    3. ברשימה Region, בוחרים מיקום לפריסה, לדוגמה, us-west1.
    4. בקטע אימות, בוחרים באפשרות אפשר גישה לכולם. אם אין לכם הרשאות (תפקיד אדמין ב-Cloud Run) לבחור באפשרות הזו, השירות יופעל ויידרש אימות.
  3. לוחצים על Containers, Networking, Security (מאגרי תגים, רשתות, אבטחה) כדי להרחיב את טופס ההגדרה.

    1. לוחצים על הכרטיסייה Volumes (אמצעי אחסון).
    2. לוחצים על הוספת עוצמת קול.
    3. ברשימה סוג נפח, בוחרים באפשרות סוד.
    4. בשדה Volume name, מזינים nginx-conf-secret.
    5. בשדה Secret (סוד), מזינים nginx_config.
    6. בקטע Specified paths for secret versions (נתיבים שצוינו לגרסאות של סודות), מציינים את default.conf כנתיב ואת latest כגרסה.
    7. לוחצים על Create (יצירה) כדי ליצור את נפח ה-Secret.
  4. לוחצים על הכרטיסייה מאגרי תגים כדי להציג את הטופס עריכת מאגר תגים.

    1. לוחצים על הגדרות, ואז בקטע משאבים משנים את הזיכרון ל-256MiB ואת המעבד ל-1 CPU.
    2. לוחצים על Volume mounts (נקודות חיבור של אמצעי אחסון).
    3. לוחצים על Mount volume (התקנת אמצעי אחסון).
    4. בוחרים באפשרות nginx-conf-secret מתוך רשימת השמות.
    5. בשדה נתיב הטעינה, מזינים etc/nginx/conf.d.
    6. לוחצים על סיום כדי להשלים את ההגדרה של מאגר התגים הראשון.
  5. לוחצים על Add container (הוספת מאגר) כדי להוסיף את מאגר ה-sidecar ולהציג את הטופס New container (מאגר חדש).

    1. בוחרים את כתובת ה-URL של קובץ האימג' של קונטיינר ברירת המחדל us-docker.pkg.dev/cloudrun/container/hello
    2. לוחצים על הכרטיסייה הגדרות, ואז בקטע משאבים משנים את הזיכרון ל-256MiB ואת המעבד ל-1 CPU.
    3. לוחצים על Variables & Secrets (משתנים וסודות).
    4. לוחצים על הוספת משתנה.
    5. מזינים PORT כשם משתנה הסביבה החדש ו-8888 כערך.
    6. לוחצים על סיום.
  6. עוברים לטופס עריכת מאגר של המאגר הראשון (nginx).

    1. לוחצים על הכרטיסייה הגדרות.
    2. בקטע Container start up order, בוחרים באפשרות nginx מהרשימה Depends on. כלומר, קונטיינר nginx מתחיל לפעול רק אחרי שקונטיינר hello מתחיל לפעול בהצלחה.
    3. לוחצים על Create (יצירה) ומחכים לפריסת השירות.

YAML

כדי לפרוס את קונטיינר שרת ה-proxy ואת קונטיינר אפליקציית האינטרנט כשירות יחיד:

gcloud run services replace service.yaml

אימות השירות שנפרס

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

curl --header "Authorization: Bearer $(gcloud auth print-identity-token)" SERVICE_URL

אמור להופיע שרת proxy של nginx שהועבר בהצלחה למאגר hello sidecar עם סטטוס תגובה 200.

רוצים לנסות בעצמכם?

כדי לעקוב אחרי המדריך הזה:

gcloud

  1. בטרמינל, משכפלים את מאגר האפליקציה לדוגמה למחשב המקומי:

    git clone https://github.com/GoogleCloudPlatform/cloud-run-samples

  2. עוברים לספרייה שמכילה את הקוד לדוגמה של Cloud Run:

    cd cloud-run-samples/multi-container/hello-nginx-sample/

המאמרים הבאים

כדי לקבל מידע נוסף על שימוש בקובצי עזר בשירות Cloud Run: