הגדרת שרת 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 יחיד מקבל בקשות ומעביר אותן לקונטיינר של הכניסה (הגשת הבקשות), שבמקרה הזה הוא שרת ה-proxy. לאחר מכן, שרת ה-proxy שולח בקשות לאפליקציית האינטרנט דרך ממשק הרשת localhost, וכך נמנעת גישה לרשת חיצונית.

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

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

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

  1. נכנסים לחשבון Google Cloud . אם אתם משתמשים חדשים ב- Google Cloud, צרו חשבון כדי שתוכלו להעריך את הביצועים של המוצרים שלנו בתרחישים מהעולם האמיתי. לקוחות חדשים מקבלים בחינם גם קרדיט בשווי 300$ להרצה, לבדיקה ולפריסה של עומסי העבודה.
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud 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

  3. Verify that billing is enabled for your Google Cloud project.

  4. In the Google Cloud console, on the project selector page, select or create a Google Cloud 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

  5. Verify that billing is enabled for your Google Cloud project.

  6. מפעילים את Cloud Run API ואת Secret Manager API.

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

    כדי להפעיל ממשקי API, צריך את תפקיד ה-IAM 'אדמין של Service Usage' (roles/serviceusage.serviceUsageAdmin), שכולל את ההרשאה serviceusage.services.enable. איך מקצים תפקידים

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

  7. מתקינים ומפעילים את ה-CLI של gcloud.
  8. מעדכנים את Google Cloud CLI: gcloud components update
  9. מגדירים את Google Cloud CLI: gcloud init
  10. מאמתים באמצעות 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/ שמכיל את קובץ התצורה. אחת הדרכים לטפל בבעיה הזו היא לאחסן את תוכן הקובץ בסוד של 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 של אפליקציית האינטרנט ביציאת localhost‏ 8888.

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

המסוף

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

    מעבר אל Secret Manager

  2. לוחצים על Create secret (יצירת סוד).

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

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

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

  6. לוחצים על Create secret (יצירת סוד).

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

    כניסה לדף IAM

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

  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.gserviceaccount.com --role='roles/secretmanager.secretAccessor'

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

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

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

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

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

בהגדרת השירות, מציינים את שרת ה-proxy של Nginx כמאגר תגים (לצורך הצגה) של תנועה נכנסת, את היציאה שבה הוא יאזין, אם הוא מקבל בקשות 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 במסוף Google Cloud :

    כניסה ל-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. ברשימה אזור, בוחרים מיקום לפריסה, לדוגמה, us-west1.
    4. בקטע Authentication, בוחרים באפשרות Allow public access. אם אין לכם הרשאות (תפקיד אדמין ב-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. לוחצים על יצירה כדי ליצור את נפח ה-Secret.
  4. לוחצים על הכרטיסייה מאגרי תגים כדי להציג את הטופס עריכת מאגר תגים.

    1. לוחצים על הגדרות, ואז בקטע משאבים משנים את הזיכרון ל-256MiB ואת המעבד ל-1 CPU.
    2. לוחצים על Volume mounts (הצמדת אמצעי אחסון).
    3. לוחצים על Mount volume (התקנת אמצעי אחסון).
    4. בוחרים באפשרות nginx-conf-secret מרשימת השמות.
    5. בשדה Mount path (נתיב הטעינה), מזינים 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. עוברים לטופס Edit container (עריכת מאגר התגים) של מאגר התגים הראשון (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: