הגדרת עדכונים אוטומטיים של תמונות בסיס

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

במאמר אבטחת סביבת ההפעלה מוסבר איך מגדירים מדיניות עדכוני אבטחה לפונקציות שנוצרו באמצעות פקודות gcloud functions או באמצעות Cloud Functions v2 API.

בתרשים הבא מוצג איך קוד האפליקציה והתלויות שלה ('תמונת האפליקציה') מונחים על גבי זמן הריצה של השפה, חבילות מערכת ההפעלה ומערכת ההפעלה ('תמונת הבסיס'). רכיבי תמונת הבסיס מתעדכנים אוטומטית על ידי Google.

תרשים של תמונת בסיס ב-Cloud Run

מדיניות עדכוני אבטחה

  • עדכונים אוטומטיים: עדכונים ותיקוני אבטחה לסביבת זמן הריצה מתפרסמים בגרסאות חדשות של תמונת זמן הריצה. אחרי תקופה של בדיקות יציבות ומהימנות, זמן הריצה המעודכן מושק לכל השירותים, וכתוצאה מכך מתבצע עדכון ללא השבתה. כדי להחיל תיקוני אבטחה ברמת השפה, יכול להיות שתצטרכו לבנות מחדש פונקציות או שירותים שמשתמשים בשפות שעברו קומפילציה כמו Go או Java.

  • בנוגע לעדכונים של פריסות: עדכונים ותיקוני אבטחה מוחלים על סביבות זמן ריצה רק כששירותים נפרסים או נפרסים מחדש, אלא אם צוין אחרת. עדכונים לגבי פריסה זמינים גם בפונקציות Cloud Run (דור ראשון) וגם בפונקציות Cloud Run.

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

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

כדי להגדיר עדכונים אוטומטיים של תמונת הבסיס:

  • בוחרים קובץ אימג' בסיסי תואם של Cloud Run.
  • יוצרים ופורסים את קובץ האימג' של האפליקציה באופן שמאפשר לבצע בבטחה rebase של השירות הפועל.

בחירת תמונת בסיס

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

Buildpacks של Google Cloud מפרסם ומעדכן קובצי אימג' בסיסיים ליצירת אפליקציות Serverless. תמונות הבסיס האלה מבוססות על הפצת Ubuntu Linux.

‫Cloud Run תומך רק בתמונות בסיס אוטומטיות שמבוססות על תמונות בסיס של Buildpacks של Google Cloud.

כשבוחרים תמונת בסיס של Buildpack, צריך להביא בחשבון את הנקודות הבאות:

  • סטאק: סטאק מורכב מגרסת הפצה של Linux ומחבילות מערכת, כמו OpenSSL ו-curl.
  • שפה: הגרסה הספציפית של שפת התכנות שבה נעשה שימוש באפליקציה.

מידע נוסף על וריאציות של תמונות בסיס

יצירת תמונת האפליקציה

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

  • שימוש בפריסה מ-Cloud Run מקוד המקור (מומלץ)
  • באמצעות מערכת build, מעתיקים את האפליקציה אל קובץ אימג' של scratch

פריסה מקוד המקור

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

לדוגמה, כדי לפרוס שירות Node.js עם הפעלה של עדכונים אוטומטיים של קובץ האימג' הבסיסי, משתמשים בפקודה הבאה:

gcloud run deploy \
    --source . \
    --base-image nodejs24 \
    --automatic-updates

כדי לפרוס פונקציה, צריך לציין את הדגל --function עם נקודת הכניסה של הפונקציה מקוד המקור.

בונים על scratch

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

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

כדי ליצור את קובץ האימג' של הקונטיינר של האפליקציה:

  1. יוצרים קובץ Dockerfile רב-שלבי שכולל את הפעולות הבאות:
    1. הכלי בונה את האפליקציה באמצעות תמונת בסיס מתאימה עם יחסי התלות הנדרשים.
    2. מעתין את הרכיבים שנוצרו לתמונה זמנית.
  2. יוצרים את קובץ האימג' של קונטיינר האפליקציה ומעבירים אותו בדחיפה ל-Artifact Registry.
  3. פורסים את קובץ האימג' של הקונטיינר של האפליקציה ב-Cloud Run ומציינים קובץ אימג' בסיסי.

יצירת Dockerfile עם כמה שלבים

במדריך הזה נשתמש באפליקציית Node.js. המדריך הזה לא ספציפי לשפה מסוימת, ואפשר להתאים אותו לאפליקציה ולשפה שלכם.

  • יוצרים קובץ Dockerfile בספריית השורש של הפרויקט עם התוכן הבא:

    # This Dockerfile will produce an image that only includes the Node.js app and *not* the Node.js runtime.
    # The resulting image will not run locally. It is intended at being layered on top of a Node.js base image.
    
    FROM node:24-slim as builder
    
    # Create and change to the app directory.
    WORKDIR /usr/src/app
    
    # Copy application dependency manifests to the container image and install
    # production dependencies.
    COPY package*.json ./
    RUN npm install --only=production
    
    # Copy local code to the container image.
    COPY . ./
    
    # Copy the application source code and dependencies onto a scratch image.
    FROM scratch
    WORKDIR /workspace
    COPY --from=builder --chown=33:33 /usr/src/app/ ./
    USER 33:33
    
    # Run the web service on container startup.
    CMD [ "node", "index.js" ]
    

קובץ ה-Dockerfile הזה משתמש ב-build רב-שלבי כדי להעתיק את קוד המקור של האפליקציה ואת התלות שלה לתמונה של scratch, שלא כוללת את מערכת ההפעלה, החבילות ורכיבי זמן הריצה שיסופקו בזמן הריצה על ידי תמונת הבסיס המנוהלת של Cloud Run.

יצירת תמונת האפליקציה

יוצרים את קובץ האימג' של האפליקציה ומעלים אותו ל-Artifact Registry. במאמר בנושא יצירת קונטיינרים מוסבר איך ליצור קובץ Dockerfile באמצעות Cloud Build ולהעלות אותו ל-Artifact Registry.

פריסת תמונת האפליקציה

עכשיו אפשר לפרוס את תמונת האפליקציה עם עדכונים אוטומטיים מופעלים באמצעות תמונת הבסיס התואמת ביותר לאפליקציה. בדוגמה הבאה נעשה שימוש בסביבת זמן הריצה nodejs24 ובאזור europe-west1. מידע נוסף על וריאציות של תמונות בסיסיות זמין במאמר בנושא תמונות בסיסיות בזמן ריצה.

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

gcloud

  1. In the Google Cloud console, activate Cloud Shell.

    Activate Cloud Shell

    At the bottom of the Google Cloud console, a Cloud Shell session starts and displays a command-line prompt. Cloud Shell is a shell environment with the Google Cloud CLI already installed and with values already set for your current project. It can take a few seconds for the session to initialize.

  2. כדי להפעיל עדכונים אוטומטיים של זמן הריצה nodejs24 במהלך פריסת קובץ האימג' של האפליקציה, מריצים את הפקודה הבאה:

    gcloud run deploy SERVICE \
        --image APP_IMAGE \
        --base-image BASE_IMAGE

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

    • SERVICE: השם של השירות שרוצים לפרוס.
    • APP_IMAGE: כתובת ה-URL של קובץ האימג' של הקונטיינר של האפליקציה.
    • BASE_IMAGE: כתובת ה-URL של תמונת הבסיס, לדוגמה nodejs24 או europe-west1-docker.pkg.dev/serverless-runtimes/google-24/runtimes/nodejs24 כדאי לעיין במאמר בנושא תמונות בסיס של זמן ריצה כדי לקבל מידע נוסף על וריאציות של תמונות בסיס.
  3. YAML

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

      gcloud run services describe SERVICE --format export > service.yaml
    2. מעדכנים את runtimeClassName ואת ההערות run.googleapis.com/base-images:

      apiVersion: serving.knative.dev/v1
      kind: Service
      metadata:
        name: SERVICE
      spec:
        template:
          metadata:
            annotations:
              run.googleapis.com/base-images: '{"NAME":"BASE_IMAGE"}'
          spec:
            containers:
            - name: NAME
              image: APP_IMAGE
            runtimeClassName: run.googleapis.com/linux-base-image-update

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

      • SERVICE: השם של השירות שרוצים לפרוס.
      • APP_IMAGE: כתובת ה-URL של קובץ האימג' של הקונטיינר של האפליקציה.
      • BASE_IMAGE: כתובת ה-URL של תמונת הבסיס, לדוגמה europe-west1-docker.pkg.dev/serverless-runtimes/google-24/runtimes/nodejs24. כדי לקבל מידע נוסף על וריאציות של תמונות בסיס, אפשר לעיין במאמר בנושא תמונות בסיס של זמן ריצה.

    Terraform

    כדי ללמוד איך להחיל הגדרות ב-Terraform או להסיר אותן, ראו פקודות בסיסיות ב-Terraform.

    מוסיפים את השורות הבאות למשאב google_cloud_run_v2_service בקובץ התצורה של Terraform:
    resource "google_cloud_run_v2_service" "default" {
      name     = "SERVICE"
      location = "REGION"
    
      template {
        containers {
          image = "IMAGE_URL"
          base_image_uri = "BASE_IMAGE"
        }
      }
    }
    

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

    • SERVICE: השם של השירות שרוצים לפרוס.
    • REGION: Google Cloud האזור.
    • IMAGE_URL: הפניה לקובץ אימג' בקונטיינר, לדוגמה, us-docker.pkg.dev/cloudrun/container/hello:latest. אם אתם משתמשים ב-Artifact Registry, צריך ליצור מראש את המאגר REPO_NAME. כתובת ה-URL היא בפורמט LOCATION-docker.pkg.dev/PROJECT_ID/REPO_NAME/PATH:TAG .
    • BASE_IMAGE: כתובת ה-URL של תמונת הבסיס, לדוגמה us-central1-docker.pkg.dev/serverless-runtimes/google-24/runtimes/nodejs24. כדי לקבל מידע נוסף על וריאציות של תמונות בסיס, אפשר לעיין במאמר בנושא תמונות בסיס של זמן ריצה.

הרכבה מחדש של קובצי אימג' בקונטיינרים כדי להריץ אותם באופן מקומי

קובצי אימג' של קונטיינרים של אפליקציות שמשמשים לעדכונים אוטומטיים של קובצי אימג' בסיסיים מבוססים על scratchולא ניתן להריץ אותם מחוץ ל-Cloud Run עם עדכונים אוטומטיים של קובצי אימג' בסיסיים מופעלים. כדי להפוך את תמונת האפליקציה לניתנת להפעלה, צריך לבצע rebase לתמונת האפליקציה על גבי תמונת בסיס תואמת.

  1. מתקינים את Docker Community Edition (CE)‎ בתחנת העבודה.

  2. מורידים את התמונה של האפליקציה:

    docker pull APP_IMAGE
    

    מחליפים את APP_IMAGE בכתובת ה-URL של קובץ האימג' בקונטיינר.

  3. מורידים את קובץ האימג' הבסיסי:

    docker pull BASE_IMAGE
    

    מחליפים את BASE_IMAGE בנתיב המלא של תמונת בסיס תואמת. רשימה של קובצי אימג' בסיסיים זמינה במאמר קובצי אימג' בסיסיים של Google Cloud's buildpacks.

  4. מרכיבים מחדש את התמונה:

    משתמשים ב-Dockerfile כדי להעתיק את כל הקבצים מתמונת האפליקציה בחזרה לתמונת הבסיס:

    ARG APP_IMAGE
    ARG NEW_BASE_IMAGE
    
    # first copy all files from the app image onto the builder image
    FROM ${APP_IMAGE} AS app
    FROM ${NEW_BASE_IMAGE} AS builder
    COPY --from=app / /
    
    # restore the app image config by copying everything from previous step back
    # back onto the app image
    FROM ${APP_IMAGE}
    COPY --from=builder / /
    

    יוצרים את התמונה:

    docker build \
        -t IMAGE \
        --build-arg APP_IMAGE=APP_IMAGE \
        --build-arg NEW_BASE_IMAGE=BASE_IMAGE \
        .
    

    מחליפים את IMAGE בשם של האימג' שאוחד מחדש.

    אם מופיעות אזהרות שלפיהן ARG ${APP_IMAGE} ו-ARG ${NEW_BASE_IMAGE} הן לא תמונות בסיס תקינות, אפשר להתעלם מהן ולהריץ את התמונה:

    docker run -p 8080:8080 IMAGE
    

השבתת עדכונים אוטומטיים

כשפורסים מקוד המקור

כשמבצעים פריסה ממקור, אפשר להשבית את העדכונים האוטומטיים של תמונת הבסיס באמצעות הדגל --no-automatic-updates. בדוגמה הבאה מוצג איך משביתים עדכונים אוטומטיים של תמונת בסיס לשירות Node.js:

gcloud

gcloud run deploy SERVICE \
    --source . \
    --base-image nodejs24 \
    --no-automatic-updates

כשפורסים קובץ אימג' של קונטיינר

כדי להשבית עדכונים של קובץ אימג' בסיסי בשירות שמשתמש בקובץ אימג' של קונטיינר שנבנה על scratch, צריך לפרוס קובץ אימג' חדש של קונטיינר שכולל את קובץ האימג' הבסיסי ולהסיר את קובץ האימג' הבסיסי:

gcloud

  1. In the Google Cloud console, activate Cloud Shell.

    Activate Cloud Shell

    At the bottom of the Google Cloud console, a Cloud Shell session starts and displays a command-line prompt. Cloud Shell is a shell environment with the Google Cloud CLI already installed and with values already set for your current project. It can take a few seconds for the session to initialize.

  2. כדי להשבית את העדכונים האוטומטיים של קובץ האימג' הבסיסי, מריצים את הפקודה הבאה:

    gcloud run deploy SERVICE \
        --image IMAGE \
        --base-image ""

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

    • SERVICE: השם של השירות שרוצים לפרוס.
    • IMAGE: כתובת ה-URL של קובץ האימג' של הקונטיינר שמכיל את האפליקציה, את זמן הריצה ואת מערכת ההפעלה.
  3. YAML

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

      gcloud run services describe SERVICE --format export > service.yaml
    2. מוחקים את ההערה run.googleapis.com/base-images.

    3. מוחקים את המאפיין runtimeClassName.

    4. ב-image, חשוב להשתמש בקובץ אימג' של קונטיינר שכולל את האפליקציה, את זמן הריצה ואת מערכת ההפעלה.

    5. יוצרים או מעדכנים את השירות באמצעות הפקודה הבאה:

      gcloud run services replace service.yaml

הצגת גרסת התמונה של הבסיס

כדי לראות את גרסת תמונת הבסיס שמשמשת להצגת האפליקציה, מעיינים במשאב LogEntry.labels.run.googleapis.com/base_image_versions ביומני השירות של Cloud Run.

מגבלות ידועות

  • עדכונים אוטומטיים של תמונות בסיסיות תומכים רק בתמונות בסיסיות של Google Cloud buildpacks. אי אפשר להשתמש בתמונות בסיס משלכם.

  • אפליקציות שמשתמשות בשפות שעברו קומפילציה לא יעברו קומפילציה מחדש כתוצאה מעדכון אוטומטי של תמונת הבסיס.

  • יכול להיות שסריקות האבטחה של תמונת האפליקציה לא יושלמו. התמונה של האפליקציה מבוססת עכשיו על scratch, ולכן סורקי האבטחה יסרקו רק את החלק של האפליקציה בתמונה. כדי לקבל תמונה מלאה יותר של אבטחת הקונטיינר, צריך להריץ סריקות גם על תמונת הבסיס התואמת שסופקה על ידי Google. אפשר להוריד את תמונת הבסיס ולהשתמש בכלים של קוד פתוח כדי להריץ סריקה.