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

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

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

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

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

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

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

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

  3. אם אתם משתמשים בספק זהויות חיצוני (IdP), קודם אתם צריכים להיכנס ל-CLI של gcloud באמצעות המאגר המאוחד לניהול זהויות.

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

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

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

    • Select a project: כדי לבחור פרויקט לא צריך תפקיד IAM ספציפי – אפשר לבחור כל פרויקט שקיבלתם בו תפקיד.
    • יצירת פרויקט: כדי ליצור פרויקט, צריך את התפקיד Project Creator (יצירת פרויקטים) (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 .

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

  7. מפעילים את Artifact Registry API:

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

    כדי להפעיל ממשקי API, צריך את תפקיד ה-IAM 'אדמין של Service Usage' (roles/serviceusage.serviceUsageAdmin), שכולל את ההרשאה serviceusage.services.enable. איך מקצים תפקידים

    gcloud services enable artifactregistry.googleapis.com
  8. התקינו את ה-CLI של Google Cloud.

  9. אם אתם משתמשים בספק זהויות חיצוני (IdP), קודם אתם צריכים להיכנס ל-CLI של gcloud באמצעות המאגר המאוחד לניהול זהויות.

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

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

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

    • Select a project: כדי לבחור פרויקט לא צריך תפקיד IAM ספציפי – אפשר לבחור כל פרויקט שקיבלתם בו תפקיד.
    • יצירת פרויקט: כדי ליצור פרויקט, צריך את התפקיד Project Creator (יצירת פרויקטים) (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 .

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

  13. מפעילים את Artifact Registry API:

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

    כדי להפעיל ממשקי API, צריך את תפקיד ה-IAM 'אדמין של Service Usage' (roles/serviceusage.serviceUsageAdmin), שכולל את ההרשאה serviceusage.services.enable. איך מקצים תפקידים

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

עלויות

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

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

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

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

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

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

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

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

./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

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

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

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

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

זיהוי תדירות השליפה ממאגר מידע של צד שלישי

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

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

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

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

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

    כניסה אל Logs Explorer

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

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

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

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

  5. לוחצים על Run Query (הפעלת שאילתה).

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

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

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

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

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

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

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

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

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

  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 הוא שם מערך הנתונים.
בדוגמה הבאה מוצג פלט מהשאילתה. בעמודה imageName אפשר לבדוק את תדירות השליפה של תמונות שלא מאוחסנות ב-Artifact Registry.

תמונה

העתקת תמונות ל-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

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

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

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

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