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

אם אתם שולפים כמה תמונות של קונטיינרים ישירות ממאגרי תמונות של צד שלישי כדי לפרוס אותן בסביבות Google Cloud כמו Google Kubernetes Engine או Cloud Run, יכול להיות שהגבלות קצב על שאיבת תמונות או הפסקות שירות של צד שלישי ישבשו את הבנייה והפריסה שלכם. בדף הזה מוסבר איך לזהות את קובצי האימג' של הקונטיינרים האלה ולהעתיק אותם ל-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, נדרשת ההרשאה serviceusage.services.enable. אם יצרתם את הפרויקט, סביר להניח שכבר יש לכם את ההרשאה הזו דרך התפקיד 'בעלים' (roles/owner). אחרת, תוכלו לקבל את ההרשאה הזו דרך התפקיד 'אדמין בממשק Service Usage' (roles/serviceusage.serviceUsageAdmin). איך מקצים תפקידים

    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, נדרשת ההרשאה serviceusage.services.enable. אם יצרתם את הפרויקט, סביר להניח שכבר יש לכם את ההרשאה הזו דרך התפקיד 'בעלים' (roles/owner). אחרת, תוכלו לקבל את ההרשאה הזו דרך התפקיד 'אדמין בממשק Service Usage' (roles/serviceusage.serviceUsageAdmin). איך מקצים תפקידים

    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

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

זיהוי הפניות בקובצי המניפסט

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

    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

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

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

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

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