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

כשמעבירים קובצי אימג' של קונטיינרים ממאגרים של צד שלישי ל-Artifact Registry, אפשר לאחד את ניהול קובצי האימג' ולמנוע שיבושים ב-build או בפריסה כתוצאה מהפסקות בשירות או ממגבלות קצב חיצוניות. אתם יכולים לזהות קובצי אימג' שנשלפים לעיתים קרובות ולהעתיק אותם ל-Artifact Registry כדי לפרוס אותם בסביבות של Google Cloud , כמו Google Kubernetes Engine.

סקירה כללית על מיגרציה

העברת קובצי האימג' של הקונטיינרים כוללת את השלבים הבאים:

  1. מגדירים את הדרישות המוקדמות.
  2. מזהים את התמונות שרוצים להעביר.
    • מחפשים בקובצי ה-Dockerfile ובמניפסטים של הפריסה הפניות למאגרי צד שלישי.
    • איך בודקים את תדירות השליפה של קובצי אימג' ממאגרי צד שלישי באמצעות Cloud Logging ו-BigQuery.
  3. מעתיקים את התמונות שזוהו ל-Artifact Registry.
  4. מוודאים שההרשאות למאגר מוגדרות כמו שצריך, במיוחד אם Artifact Registry וסביבת הפריסה של Google Cloudנמצאים בפרויקטים שונים.
  5. מעדכנים את המניפסטים של הפריסות.
  6. פורסים מחדש את עומסי העבודה.

‫Artifact Registry לא עוקב אחרי עדכונים של קובצי אימג' שהועתקו במאגרים במעלה הזרם. אם רוצים לשלב גרסה חדשה יותר של תמונה בצינור עיבוד הנתונים, צריך להעביר אותה ל-Artifact Registry.

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

  1. התקינו את ה-CLI של Google Cloud.

  2. הגדירו שה-CLI של gcloud ישתמש בזהות המאוחדת שלכם.

    איך נכנסים ל-CLI של gcloud באמצעות הזהות המאוחדת?

  3. כדי לאתחל את ה-CLI של gcloud, הריצו את הפקודה הבאה:

    gcloud init
  4. יוצרים או בוחרים פרויקט ב- Google Cloud .

    התפקידים שנדרשים כדי לבחור או ליצור פרויקט

    • בחירת פרויקט: כדי לבחור פרויקט לא נדרש תפקיד IAM ספציפי – אתם יכולים לבחור כל פרויקט שקיבלתם בו תפקיד.
    • יצירת פרויקט: כדי ליצור פרויקט, צריך את התפקיד "יצירת פרויקטים" (roles/resourcemanager.projectCreator), שכולל את ההרשאה resourcemanager.projects.create. איך מקצים תפקידים?
    • יוצרים פרויקט ב- Google Cloud :

      gcloud projects create PROJECT_ID

      מחליפים את PROJECT_ID בשם של הפרויקט ב- Google Cloud שאתם יוצרים.

    • בוחרים את הפרויקט שיצרתם ב- Google Cloud :

      gcloud config set project PROJECT_ID

      מחליפים את PROJECT_ID בשם הפרויקט ב- Google Cloud .

  5. מוודאים שהחיוב מופעל בפרויקט ב- Google Cloud .

  6. מפעילים את Artifact Registry API, אם הוא עדיין לא מופעל:

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

    כדי להפעיל ממשקי API, צריך את ההרשאה serviceusage.services.enable. אם אתם יצרתם את הפרויקט, סביר להניח שכבר יש לכם את ההרשאה הזו דרך התפקיד "בעלים" (roles/owner). אחרת, תוכלו לקבל את ההרשאה הזו דרך התפקיד "אדמין בממשק 'שימוש בשירות'" (roles/serviceusage.serviceUsageAdmin). איך מקצים תפקידים

    gcloud services enable artifactregistry.googleapis.com
  7. אם אין לכם מאגר ב-Artifact Registry, צרו מאגר והגדירו אימות ללקוחות של צד שלישי שצריכים גישה למאגר.
  8. בודקים את ההרשאות. צריך להיות לכם תפקיד IAM של בעלים או עריכה בפרויקטים שבהם אתם מעבירים קובצי אימג' ל-Artifact Registry.
  9. מייצאים את משתני הסביבה הבאים:
    export PROJECT=$(gcloud config get-value project)
  10. מוודאים שמותקנת גרסה 1.13 ומעלה של Go.
    go version
    אם אתם צריכים להתקין או לעדכן את Go, קראו את מסמכי התיעוד להתקנה של Go.

עלויות

במדריך הזה משתמשים ברכיבים הבאים של Google Cloud, והשימוש בהם כרוך בתשלום:

זיהוי התמונות שרוצים להעביר

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

זיהוי הפניות בקובצי Docker

מבצעים את השלב הזה במיקום שבו מאוחסנים קובצי ה-Docker. יכול להיות שזה המקום שבו הקוד שלכם נבדק באופן מקומי.

בספרייה עם קובצי ה-Docker, מריצים את הפקודה:

grep -inr -H --include Dockerfile\* "FROM" . | grep -i -v -E 'docker.pkg.dev'

הפלט אמור להיראות כך:

./code/build/baseimage/Dockerfile:1:FROM debian:stretch
./code/build/ubuntubase/Dockerfile:1:FROM ubuntu:latest
./code/build/pythonbase/Dockerfile:1:FROM python:3.5-buster

הפקודה הזו מחפשת את כל קובצי ה-Docker בספרייה ומזהה את השורה "FROM". משנים את הפקודה לפי הצורך, בהתאם לאופן שבו אתם מאחסנים את קובצי ה-Dockerfile.

זיהוי הפניות במניפסטים

מבצעים את השלבים האלה במיקום שבו מאוחסנים המניפסטים של GKE. יכול להיות שזה המקום שבו הקוד שלכם נבדק באופן מקומי.
  1. בספרייה עם המניפסטים של GKE, מריצים את הפקודה הבאה:
    grep -inr -H --include \*.yaml "image:" . | grep -i -v -E 'docker.pkg.dev'
    הפלט אמור להיראות כך:
        ./code/deploy/k8s/ubuntu16-04.yaml:63: image: busybox:1.31
        
    הפקודה הזו בודקת את כל קובצי ה-YAML בספרייה ומזהה את השורה image:‎. משנים את הפקודה לפי הצורך כדי שתתאים לאופן שבו המניפסטים מאוחסנים.
  2. כדי להציג רשימה של קובצי אימג' שפועלים באשכול, מריצים את הפקודה הבאה:
    ‫
    kubectl get all --all-namespaces -o yaml | grep image: | grep -i -v -E 'docker.pkg.dev'
    הפקודה הזו מחזירה את כל האובייקטים שפועלים באשכול Kubernetes שנבחר ומקבלת את שמות התמונות שלהם. הפלט אמור להיראות כך:
        - image: nginx
          image: nginx:latest
            - image: nginx
            - image: nginx
        

כדי לקבל כיסוי מלא, מריצים את הפקודות הקודמות בכל אשכולות GKE בכל הפרויקטים שלGoogle Cloud .

זיהוי תדירות המשיכה ממרשם של צד שלישי

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

איסוף נתוני יומן

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

כדי ליצור sink לפרויקט יחיד:

  1. נכנסים לדף Logs Explorer ב- במסוף Google Cloud :

    נכנסים לדף Logs Explorer.

    אם אתם משתמשים בשורת החיפוש כדי למצוא את הדף הזה, בחרו בתוצאה עם כותרת המשנה Logging.

  2. בוחרים פרויקט ב- Google Cloud .

  3. בכרטיסייה הכלי ליצירת שאילתות, מזינים את השאילתה הבאה:

      resource.type="k8s_pod"
      jsonPayload.reason="Pulling"
    
  4. משנים את המסנן של היסטוריית השינויים מ-Last 1 hour ל-Last 7 Days.

  5. לוחצים על Run Query.

  6. אחרי שמוודאים שהתוצאות מוצגות בצורה נכונה, לוחצים על Actions > Create Sink.

  7. בתיבת הדו-שיח Sink details, מבצעים את הפעולות הבאות:

    1. בשדה Sink Name, מזינים image_pull_logs.
    2. בשדה Sink description, מזינים תיאור של הכיור.
  8. לוחצים על הבא.

  9. בתיבת הדו-שיח Sink destination, בוחרים את הערכים הבאים:

    1. בשדה Select Sink service, בוחרים באפשרות BigQuery dataset.
    2. בשדה Select BigQuery dataset, בוחרים באפשרות Create a new BigQuery dataset וממלאים את הפרטים הנדרשים בתיבת הדו-שיח שנפתחת. במאמר יצירת מערכי נתונים מוסבר איך יוצרים מערך נתונים ב-BigQuery.
    3. לוחצים על Create dataset.
  10. לוחצים על הבא.

    בקטע Choose logs to include in sink, השאילתה תואמת לשאילתה שהרצתם בכרטיסייה הכלי ליצירת שאילתות.

  11. לוחצים על הבא.

  12. אופציונלי: בוחרים יומנים שרוצים לסנן מהכיור. למידע נוסף על שליחת שאילתות וסינון של נתוני Cloud Logging, קראו את המאמר שפת השאילתות של Logging.

  13. לוחצים על Create Sink.

    ה-sink ביומן נוצר.

כדי ליצור כיור למספר פרויקטים:

  1. פותחים את Cloud Shell.

  2. מריצים את הפקודות הבאות ב-Cloud Shell:

    PROJECTS="PROJECT-LIST"
    DESTINATION_PROJECT="DATASET-PROJECT"
    DATASET="DATASET-NAME"
    
    for source_project in $PROJECTS
    do
      gcloud logging --project="${source_project}" sinks create image_pull_logs bigquery.googleapis.com/projects/${DESTINATION_PROJECT}/datasets/${DATASET} --log-filter='resource.type="k8s_pod" jsonPayload.reason="Pulling"'
    done
    

    כאשר

    • ‫PROJECT-LIST היא רשימה של Google Cloud מזהי פרויקטים, מופרדים ברווחים. לדוגמה project1 project2 project3.
    • ‫DATASET-PROJECT הוא הפרויקט שבו רוצים לאחסן את מערך הנתונים.
    • ‫DATASET-NAME הוא השם של מערך הנתונים, לדוגמה image_pull_logs.

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

שאילתה לגבי תדירות המשיכה

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

  1. נכנסים למסוף BigQuery.

  2. מריצים את השאילתה הבאה:

    SELECT
      REGEXP_EXTRACT(jsonPayload.message, r'"(.*?)"') AS imageName,
      COUNT(*) AS numberOfPulls
    FROM
          `DATASET-PROJECT.DATASET-NAME.events_*`
    GROUP BY
          imageName
    ORDER BY
          numberOfPulls DESC
    

    כאשר

    • ‫DATASET-PROJECT הוא הפרויקט שמכיל את מערך הנתונים.
    • ‫DATASET-NAME הוא שם מערך הנתונים.

העתקת קובצי אימג' ל-Artifact Registry

אחרי שזיהיתם את קובצי האימג' ממאגרי צד שלישי, אתם יכולים להעתיק אותם ל-Artifact Registry. הכלי gcrane עוזר בתהליך ההעתקה.

  1. יוצרים קובץ טקסט images.txt עם שמות התמונות שזיהיתם. לדוגמה:

    ubuntu:18.04
    debian:buster
    hello-world:latest
    redis:buster
    jupyter/tensorflow-notebook
    
  2. מורידים את gcrane.

      GO111MODULE=on go get github.com/google/go-containerregistry/cmd/gcrane
    
  3. יוצרים סקריפט בשם copy_images.sh כדי להעתיק את רשימת הקבצים.

    #!/bin/bash
    
    images=$(cat images.txt)
    
    if [ -z "${AR_PROJECT}" ]
    then
        echo ERROR: AR_PROJECT must be set before running this
        exit 1
    fi
    
    for img in ${images}
    do
        gcrane cp ${img} LOCATION-docker.pkg.dev/${AR_PROJECT}/${img}
    done
    

    מחליפים את LOCATION במיקום האזורי של המאגר.

    הופכים את הסקריפט לניתן להפעלה:

      chmod +x copy_images.sh
    
  4. מריצים את הסקריפט כדי להעתיק את הקבצים:

    AR_PROJECT=${PROJECT}
    ./copy_images.sh
    

אימות ההרשאות

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

למידע נוסף, קראו את מאמר העזרה בנושא בקרת גישה.

עדכון המניפסטים כך שיפנו ל-Artifact Registry

מעדכנים את קובצי ה-Docker ואת המניפסטים כך שיפנו ל-Artifact Registry במקום למאגר של הצד השלישי.

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

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  selector:
    matchLabels:
      app: nginx
  replicas: 2
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.14.2
        ports:
        - containerPort: 80

הגרסה המעודכנת הזו של המניפסט מפנה לתמונה ב-us-docker.pkg.dev.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  selector:
    matchLabels:
      app: nginx
  replicas: 2
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: us-docker.pkg.dev/<AR_PROJECT>/nginx:1.14.2
        ports:
        - containerPort: 80

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

פריסה מחדש של עומסי עבודה (workloads)

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

כדי לעקוב אחרי משיכות חדשות של קובצי אימג', מריצים את השאילתה הבאה במסוף BigQuery:

SELECT`

FORMAT_TIMESTAMP("%D %R", timestamp) as timeOfImagePull,
REGEXP_EXTRACT(jsonPayload.message, r'"(.*?)"') AS imageName,
COUNT(*) AS numberOfPulls
FROM
  `image_pull_logs.events_*`
GROUP BY
  timeOfImagePull,
  imageName
ORDER BY
  timeOfImagePull DESC,
  numberOfPulls DESC

כל משיכות התמונות החדשות צריכות להיות מ-Artifact Registry ולהכיל את המחרוזת docker.pkg.dev.