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

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

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

  • סטאק: סטאק מורכב מגרסת הפצה של 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 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 בנתיב המלא של תמונת בסיס תואמת. רשימה של קובצי אימג' בסיסיים זמינה במאמר קובצי אימג' בסיסיים של Buildpacks של Google Cloud.

  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.

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

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

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

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