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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

שימו לב לנקודות הבאות:

  • כדי לפרוס פונקציה, צריך לציין את הדגל --function עם נקודת הכניסה של הפונקציה מקוד המקור.
  • משתמשים בדגל --base-image כדי לציין את כתובת ה-URL של תמונת הבסיס – לדוגמה, nodejs24 או europe-west1-docker.pkg.dev/serverless-runtimes/google-24/runtimes/nodejs24.
  • כדי להפעיל עדכונים אוטומטיים כשפורסים מקוד המקור באמצעות buildpacks, משתמשים בדגל --automatic-updates. הדגל הזה רלוונטי רק כשמבצעים פריסה ממקור. לא צריך להשתמש בו כשפורסים קובץ אימג' של קונטיינר שנוצר מראש.

שיחה חדשה על סמך scratch

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

כשפורסים שירות 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 multi-stage כדי להעתיק את קוד המקור של האפליקציה ואת התלויות לתמונה scratch שבה לא מופיעים מערכת ההפעלה, החבילות ורכיבי זמן הריצה שיסופקו בזמן הריצה על ידי תמונת הבסיס המנוהלת של Cloud Run.

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

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

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

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

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

gcloud

  1. במסוף Google Cloud , מפעילים את Cloud Shell.

    הפעלת Cloud Shell

    בחלק התחתון של Google Cloud המסוף יתחיל סשן של Cloud Shell ותופיע הודעה של שורת הפקודה. Cloud Shell היא סביבת מעטפת שבה ה-CLI של Google Cloud מותקן ומוגדרים ערכים לפרויקט הקיים. הסשן יופעל תוך כמה שניות.

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

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 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. במסוף Google Cloud , מפעילים את Cloud Shell.

    הפעלת Cloud Shell

    בחלק התחתון של Google Cloud המסוף יתחיל סשן של Cloud Shell ותופיע הודעה של שורת הפקודה. Cloud Shell היא סביבת מעטפת שבה ה-CLI של Google Cloud מותקן ומוגדרים ערכים לפרויקט הקיים. הסשן יופעל תוך כמה שניות.

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

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

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

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

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

    אם קיים קובץ service.yaml, הפקודה gcloud run services replace משתמשת בו כברירת מחדל.

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

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

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

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

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

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