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

אפשר לכתוב את מאגר התגים של אפליקציית האינטרנט ואת כל מאגרי התגים הנלווים בשפות תכנות שונות. דוגמה שנכתבה ב-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, נדרשת ההרשאה serviceusage.services.enable. אם יצרתם את הפרויקט, סביר להניח שכבר יש לכם את ההרשאה הזו דרך התפקיד 'בעלים' (roles/owner). אחרת, תוכלו לקבל את ההרשאה הזו דרך התפקיד 'אדמין בממשק 'שימוש בשירות'' (roles/serviceusage.serviceUsageAdmin). איך מקצים תפקידים

    הפעלת ממשקי ה-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/ שמכיל את קובץ התצורה. אחת הדרכים לצרף קובץ למיקום ספציפי בקונטיינר שפועל ב-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 של אפליקציית האינטרנט ביציאת 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