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

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

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

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

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

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

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

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

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

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

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

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

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

    • Select a project: כדי לבחור פרויקט לא צריך תפקיד IAM ספציפי – אפשר לבחור כל פרויקט שקיבלתם בו תפקיד.
    • יצירת פרויקט: כדי ליצור פרויקט, צריך את התפקיד Project Creator (יצירת פרויקטים) (roles/resourcemanager.projectCreator), שכולל את ההרשאה resourcemanager.projects.create. איך מקצים תפקידים
    • יוצרים Cloud de Confiance פרויקט:

      gcloud projects create PROJECT_ID

      מחליפים את PROJECT_ID בשם של פרויקט Cloud de Confiance שיוצרים.

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

      gcloud config set project PROJECT_ID

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

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

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

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

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

    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.

עלויות

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

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

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

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

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

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

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

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

./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. יכול להיות שזה המקום שבו הקוד שלכם נבדק באופן מקומי.
  1. בספרייה עם מניפסטים של GKE, מריצים את הפקודה הבאה:
    grep -inr -H --include \*.yaml "image:" . | grep -i -v -E 'docker.s3nsregistry.fr'
    הפלט אמור להיראות כך:
        ./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.s3nsregistry.fr'
    הפקודה הזו מחזירה את כל האובייקטים שפועלים באשכול Kubernetes שנבחר ומקבלת את שמות התמונות שלהם. הפלט אמור להיראות כך:
        - image: nginx
          image: nginx:latest
            - image: nginx
            - image: nginx
        

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

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

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

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

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

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

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

    כניסה אל Logs Explorer

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

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

  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 היא רשימה של מזהי פרויקטים, מופרדים ברווחים. Cloud de Confiance לדוגמה 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 הוא שם מערך הנתונים.

העתקת תמונות ל-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.s3nsregistry.fr/${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.s3nsregistry.fr.

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