כשמעבירים קובצי אימג' של קונטיינרים ממאגרים של צד שלישי ל-Artifact Registry, אפשר לאחד את ניהול קובצי האימג' ולמנוע שיבושים ב-build או בפריסה כתוצאה מהפסקות בשירות או ממגבלות קצב חיצוניות. אתם יכולים לזהות קובצי אימג' שנשלפים לעיתים קרובות ולהעתיק אותם ל-Artifact Registry כדי לפרוס אותם בסביבות של Google Cloud , כמו Google Kubernetes Engine.
סקירה כללית על מיגרציה
העברת קובצי האימג' של הקונטיינרים כוללת את השלבים הבאים:
- מגדירים את הדרישות המוקדמות.
- מזהים את התמונות שרוצים להעביר.
- מחפשים בקובצי ה-Dockerfile ובמניפסטים של הפריסה הפניות למאגרי צד שלישי.
- איך בודקים את תדירות השליפה של קובצי אימג' ממאגרי צד שלישי באמצעות Cloud Logging ו-BigQuery.
- מעתיקים את התמונות שזוהו ל-Artifact Registry.
- מוודאים שההרשאות למאגר מוגדרות כמו שצריך, במיוחד אם Artifact Registry וסביבת הפריסה של Google Cloudנמצאים בפרויקטים שונים.
- מעדכנים את המניפסטים של הפריסות.
- פורסים מחדש את עומסי העבודה.
Artifact Registry לא עוקב אחרי עדכונים של קובצי אימג' שהועתקו במאגרים במעלה הזרם. אם רוצים לשלב גרסה חדשה יותר של תמונה בצינור עיבוד הנתונים, צריך להעביר אותה ל-Artifact Registry.
לפני שמתחילים
-
התקינו את ה-CLI של Google Cloud.
-
הגדירו שה-CLI של gcloud ישתמש בזהות המאוחדת שלכם.
-
כדי לאתחל את ה-CLI של gcloud, הריצו את הפקודה הבאה:
gcloud init -
יוצרים או בוחרים פרויקט ב- 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 .
מפעילים את Artifact Registry API, אם הוא עדיין לא מופעל:
התפקידים שנדרשים כדי להפעיל ממשקי API
כדי להפעיל ממשקי API, צריך את ההרשאה
serviceusage.services.enable. אם אתם יצרתם את הפרויקט, סביר להניח שכבר יש לכם את ההרשאה הזו דרך התפקיד "בעלים" (roles/owner). אחרת, תוכלו לקבל את ההרשאה הזו דרך התפקיד "אדמין בממשק 'שימוש בשירות'" (roles/serviceusage.serviceUsageAdmin). איך מקצים תפקידיםgcloud services enable artifactregistry.googleapis.com
- אם אין לכם מאגר ב-Artifact Registry, צרו מאגר והגדירו אימות ללקוחות של צד שלישי שצריכים גישה למאגר.
- בודקים את ההרשאות. צריך להיות לכם תפקיד IAM של בעלים או עריכה בפרויקטים שבהם אתם מעבירים קובצי אימג' ל-Artifact Registry.
- מייצאים את משתני הסביבה הבאים:
export PROJECT=$(gcloud config get-value project)
- מוודאים שמותקנת גרסה 1.13 ומעלה של Go.
אם אתם צריכים להתקין או לעדכן את Go, קראו את מסמכי התיעוד להתקנה של Go.go version
עלויות
במדריך הזה משתמשים ברכיבים הבאים של 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. יכול להיות שזה המקום שבו הקוד שלכם נבדק באופן מקומי.- בספרייה עם המניפסטים של GKE, מריצים את הפקודה הבאה:
הפלט אמור להיראות כך:grep -inr -H --include \*.yaml "image:" . | grep -i -v -E 'docker.pkg.dev'
הפקודה הזו בודקת את כל קובצי ה-YAML בספרייה ומזהה את השורה image:. משנים את הפקודה לפי הצורך כדי שתתאים לאופן שבו המניפסטים מאוחסנים../code/deploy/k8s/ubuntu16-04.yaml:63: image: busybox:1.31 - כדי להציג רשימה של קובצי אימג' שפועלים באשכול, מריצים את הפקודה הבאה:
הפקודה הזו מחזירה את כל האובייקטים שפועלים באשכול Kubernetes שנבחר ומקבלת את שמות התמונות שלהם. הפלט אמור להיראות כך:kubectl get all --all-namespaces -o yaml | grep image: | grep -i -v -E 'docker.pkg.dev'
- image: nginx image: nginx:latest - image: nginx - image: nginx
כדי לקבל כיסוי מלא, מריצים את הפקודות הקודמות בכל אשכולות GKE בכל הפרויקטים שלGoogle Cloud .
זיהוי תדירות המשיכה ממרשם של צד שלישי
בפרויקטים ששולפים נתונים ממאגרי תמונות של צד שלישי, אפשר להשתמש במידע על תדירות שליפת התמונות כדי לקבוע אם השימוש קרוב להגבלת קצב של יצירת בקשות של מאגר התמונות של הצד השלישי או חורג מהן.
איסוף נתוני יומן
יוצרים sink ביומן כדי לייצא נתונים ל-BigQuery. sink ביומן כולל יעד ושאילתה שבוחרת את רשומות היומן לייצוא. אפשר ליצור כיור על ידי שליחת שאילתות לפרויקטים ספציפיים, או להשתמש בסקריפט כדי לאסוף נתונים מפרויקטים שונים.
כדי ליצור sink לפרויקט יחיד:
-
נכנסים לדף Logs Explorer ב- במסוף Google Cloud :
אם אתם משתמשים בשורת החיפוש כדי למצוא את הדף הזה, בחרו בתוצאה עם כותרת המשנה Logging.
בוחרים פרויקט ב- Google Cloud .
בכרטיסייה הכלי ליצירת שאילתות, מזינים את השאילתה הבאה:
resource.type="k8s_pod" jsonPayload.reason="Pulling"משנים את המסנן של היסטוריית השינויים מ-Last 1 hour ל-Last 7 Days.
לוחצים על Run Query.
אחרי שמוודאים שהתוצאות מוצגות בצורה נכונה, לוחצים על Actions > Create Sink.
בתיבת הדו-שיח Sink details, מבצעים את הפעולות הבאות:
- בשדה Sink Name, מזינים
image_pull_logs. - בשדה Sink description, מזינים תיאור של הכיור.
- בשדה Sink Name, מזינים
לוחצים על הבא.
בתיבת הדו-שיח Sink destination, בוחרים את הערכים הבאים:
- בשדה Select Sink service, בוחרים באפשרות BigQuery dataset.
- בשדה Select BigQuery dataset, בוחרים באפשרות Create a new BigQuery dataset וממלאים את הפרטים הנדרשים בתיבת הדו-שיח שנפתחת. במאמר יצירת מערכי נתונים מוסבר איך יוצרים מערך נתונים ב-BigQuery.
- לוחצים על Create dataset.
לוחצים על הבא.
בקטע Choose logs to include in sink, השאילתה תואמת לשאילתה שהרצתם בכרטיסייה הכלי ליצירת שאילתות.
לוחצים על הבא.
אופציונלי: בוחרים יומנים שרוצים לסנן מהכיור. למידע נוסף על שליחת שאילתות וסינון של נתוני Cloud Logging, קראו את המאמר שפת השאילתות של Logging.
לוחצים על Create Sink.
ה-sink ביומן נוצר.
כדי ליצור כיור למספר פרויקטים:
מריצים את הפקודות הבאות ב-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.
- PROJECT-LIST היא רשימה של Google Cloud מזהי פרויקטים, מופרדים ברווחים. לדוגמה
אחרי שיוצרים כיור, לוקח זמן עד שהנתונים זורמים לטבלאות ב-BigQuery, בהתאם לתדירות שבה התמונות נשלפות.
שאילתה לגבי תדירות המשיכה
אחרי שיש לכם מדגם מייצג של שליפות תמונות שנוצרו על ידי ה-builds, מריצים שאילתה לגבי תדירות השליפה.
מריצים את השאילתה הבאה:
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 עוזר בתהליך ההעתקה.
יוצרים קובץ טקסט
images.txtעם שמות התמונות שזיהיתם. לדוגמה:ubuntu:18.04 debian:buster hello-world:latest redis:buster jupyter/tensorflow-notebookמורידים את gcrane.
GO111MODULE=on go get github.com/google/go-containerregistry/cmd/gcraneיוצרים סקריפט בשם
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מריצים את הסקריפט כדי להעתיק את הקבצים:
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.