GKE on AWS מספק דרך לשליפת תמונות פרטיות מ-Artifact Registry או מ-Container Registry בלי להשתמש ב-Kubernetes Secret. בעבר, היה צריך לבצע את השלבים הבאים:
- יוצרים חשבון שירות של ניהול זהויות והרשאות גישה (IAM) ב-Google.
- מעניקים לחשבון השירות הרשאות גישה למאגר הפרטי.
- מורידים את המפתח של חשבון השירות ושומרים אותו כסוד של Kubernetes באשכול.
- יש להפנות אל ה-Secret הזה במניפסט ה-YAML של ה-Pods או ה-Deployments כדי שהם יוכלו לגשת לתמונות ממאגר הקונטיינרים הפרטי.
- מומלץ לבצע רוטציה ולנהל באופן קבוע את המפתחות שמשויכים לחשבון השירות של Google IAM.
GKE on AWS מבטל את כל השלבים הידניים האלה, ומטפל אוטומטית באימות ובהרשאה שנדרשים לשליפת תמונות פרטיות.
לפני שמתחילים
כדי לבצע את השלבים בדף הזה, קודם צריך לבצע את הפעולות הבאות:
- יצירת אשכול.
- יצירת מאגר צמתים
יצירת קובץ אימג' של Docker והעברה שלו בדחיפה ל-Artifact Registry. בדוגמאות שבדף הזה נעשה שימוש בקונטיינר
hello-app. כדי ליצור את הקונטיינר הזה, פועלים לפי השלבים ליצירת קובץ אימג' של קונטיינר והעברת קובץ האימג' של Docker בדחיפה ל-Artifact Registry, שמופיעים במאמרי העזרה של GKE on Google Cloud .שדרגו לגרסה 1.28 של GKE ב-AWS כדי שתוכלו למשוך תמונות פרטיות מ-Artifact Registry או מ-Container Registry בלי להשתמש ב-Kubernetes Secret.
בדיקת תמונות ב-Artifact Registry
כדי להשלים את שאר השלבים, צריך קובץ אימג' של קונטיינר. כדי לקבל את השם של קובץ האימג' בקונטיינר, פועלים לפי השלבים הבאים:
מגדירים את כלי שורת הפקודה של Docker לאימות ב-Artifact Registry באמצעות Google Cloud SDK:
gcloud auth configure-dockerGoogle Cloud CLI רושם כלי עזר לפרטי כניסה לכל מאגרי Docker שנתמכים על ידי Google.
מוודאים ש-Artifact Registry כולל תמונה באמצעות הפקודה
docker images:docker imagesDocker מתחבר ל-Artifact Registry ומחזיר את התמונות שזמינות במאגר. לדוגמה, התגובה הבאה מציגה קובץ אימג' של קונטיינר בשם
hello-appבמאגרPROJECT_NAMEב-us-west1-docker.pkg.dev.REPOSITORY TAG IMAGE ID CREATED SIZE us-west1-docker.pkg.dev/PROJECT_NAME/hello-repo/hello-app v1 f7cfe0d58569 21 minutes ago 11.5MB
אם אין לכם קובץ אימג' של קונטיינר מוכן, צרו אחד לפי השלבים במאמר פריסת אפליקציה בקונטיינרים.
יצירת Pods עם תמונות פרטיות ללא סודות של משיכת תמונות
כדי ליצור Pod שיכול לגשת לקובץ אימג' של קונטיינר פרטי ממאגר, כבר לא צריך לספק את השדה spec.imagePullSecrets במפרט של ה-Pod. כדי להגדיר את ה-Pod, מבצעים את השלבים הבאים:
יוצרים הגדרת Pod בלי השדה
spec.imagePullSecrets:apiVersion: v1 kind: Pod metadata: name: POD_NAME spec: containers: - name: CONTAINER_NAME image: LOCATION-docker.pkg.dev/PROJECT_NAME/REPOSITORY_NAME/IMAGE_NAME:IMAGE_VERSIONמחליפים את מה שכתוב בשדות הבאים:
-
POD_NAME: שם ה-Pod. -
CONTAINER_NAME: השם של הקונטיינר בתוך ה-Pod. -
LOCATION: Google Cloud האזור שמכיל את המאגר. לדוגמה,us-west1. -
PROJECT_NAME: השם של הפרויקט ב-Google שמארח את המאגר שלכם ב-Artifact Registry. יכול להיות שזה יהיה אותו פרויקט כמו הפרויקט של האשכול. אם המאגר נמצא בפרויקט אחר, אפשר לעיין בקטע שימוש ב-Artifact Registry כשהוא לא נמצא באותו פרויקט כמו האשכול כדי לקבל מידע על שלבים נוספים. -
REPOSITORY_NAME: שם המאגר. -
IMAGE_NAME: שם התמונה. -
IMAGE_VERSION: גרסת התמונה.
-
מחילים את התצורה על האשכול באמצעות הפקודה
kubectl:kubectl apply -f YAML_FILE_NAMEמחליפים את
YAML_FILE_NAMEבשם של קובץ ה-YAML.
דוגמה ליצירת Pods ללא סודות לשליפת תמונות
דוגמה ליצירת Kubernetes Pod בלי צורך ב-image pull Secrets. ה-Pod מושך את התמונה hello-app מ-Artifact Registry.
כדי למשוך את התמונה
hello-app, מעתיקים את קוד ה-YAML הבא לקובץ בשםhello-pod.yaml:apiVersion: v1 kind: Pod metadata: name: hello-pod spec: containers: - name: hello-container image: us-west1-docker.pkg.dev/example-project/hello-repo/hello-app:v1מחילים את התצורה על האשכול באמצעות הפקודה
kubectl:kubectl apply -f hello-pod.yamlמוודאים שה-Pod פועל באמצעות הפקודה
kubectl get:kubectl get pod/hello-podהתשובה כוללת פוד אחד עם סטטוס
Running.NAME READY STATUS RESTARTS AGE hello-pod 1/1 Running 0 15s
יצירת פריסות עם תמונות פרטיות ללא סודות לשליפת תמונות
כדי ליצור Deployment (פריסה) שיכולה לגשת לקובץ אימג' פרטי של קונטיינר מתוך מרשם, כבר לא צריך לציין את השדה spec.imagePullSecrets במפרט הפריסה.
כדי להגדיר את הפריסה, מבצעים את השלבים הבאים:
יצירת הגדרת פריסה ללא השדה
spec.imagePullSecrets:apiVersion: apps/v1 kind: Deployment metadata: name: DEPLOYMENT_NAME spec: replicas: NUMBER_OF_REPLICAS template: spec: containers: - name: CONTAINER_NAME image: LOCATION-docker.pkg.dev/PROJECT_NAME/REPOSITORY_NAME/IMAGE_NAME:IMAGE_VERSIONמחליפים את מה שכתוב בשדות הבאים:
-
DEPLOYMENT_NAME: השם של הפריסה. -
NUMBER_OF_REPLICAS: כמה מופעים של ה-Pod שמוגדר ב-Deployment צריכים לפעול בכל רגע נתון. -
CONTAINER_NAME: השם של הקונטיינר בתוך ה-Pod. -
LOCATION: Google Cloud האזור שמכיל את המאגר. לדוגמה,us-west1. -
PROJECT_NAME: השם של פרויקט Google שמארח את מאגר Artifact Registry, שיכול להיות שונה מהפרויקט של האשכול. אם המאגר נמצא בפרויקט אחר, אפשר לעיין בקטע שימוש ב-Artifact Registry כשהוא לא נמצא באותו פרויקט כמו האשכול כדי לקבל מידע על שלבים נוספים. -
REPOSITORY_NAME: שם המאגר. -
IMAGE_NAME: שם התמונה. -
IMAGE_VERSION: גרסת התמונה.
-
מחילים את ההגדרה על האשכול באמצעות הפקודה
kubectl.kubectl apply -f name-of-your-yaml-file.yaml
דוגמה ליצירת פריסה ללא סודות לשליפת תמונות
הנה דוגמה ליצירת פריסה ללא סודות של משיכת תמונות. הפריסה מושכת תמונה של hello-app מ-Artifact Registry.
יוצרים קובץ בשם
hello-deployment.yamlעם התוכן הבא:apiVersion: apps/v1 kind: Deployment metadata: name: hello-app-deployment spec: selector: matchLabels: app: products department: sales replicas: 3 template: metadata: labels: app: products department: sales spec: containers: - name: hello image: LOCATION-docker.pkg.dev/PROJECT_NAME/hello-repo/hello-app:v1 env: - name: "PORT" value: "50001"מחליפים את מה שכתוב בשדות הבאים:
-
LOCATION: Google Cloud האזור שמכיל את המאגר. לדוגמה,us-west1. -
PROJECT_NAME: השם של פרויקט Google שמארח את מאגר Artifact Registry. יכול להיות שהשם הזה לא יהיה זהה לשם הפרויקט של האשכול. אם המאגר נמצא בפרויקט אחר, אפשר לעיין בשלבים נוספים במאמר שימוש ב-Artifact Registry כשהוא לא נמצא באותו פרויקט כמו האשכול.
-
מחילים את ההגדרה על האשכול באמצעות הפקודה
kubectl.kubectl apply -f hello-deployment.yamlמוודאים שהפריסה פועלת עם
kubectl pods.kubectl get pods --selector=app=productsהפלט מציג שלושה
RunningPods.NAME READY STATUS RESTARTS AGE hello-app-deployment-67d9c6d98c-b69f2 1/1 Running 0 14m hello-app-deployment-67d9c6d98c-d6k5c 1/1 Running 0 14m hello-app-deployment-67d9c6d98c-p2md5 1/1 Running 0 14m
שימוש ב-Artifact Registry כשהוא לא נמצא באותו פרויקט כמו האשכול
כדי להשתמש במאגר Artifact Registry שנמצא בפרויקט Google ששונה מהפרויקט שמכיל את האשכול, מבצעים את השלבים הבאים:
צריך לתת לחשבון השירות של המכונות הווירטואליות במאגר הצמתים של האשכול, שנקרא Node pool Machine Service Agent, את ההרשאות הנדרשות לגישה למאגר הזה.
gcloud projects add-iam-policy-binding AR_PROJECT_ID \
--member=NODE_POOL_MACHINE_SERVICE_AGENT \
--role=ROLE
השלב הזה מבטיח שהאשכול יוכל לאחזר ארטיפקטים מהמאגר בפרויקט הנפרד הזה.
מחליפים את מה שכתוב בשדות הבאים:
-
AR_PROJECT_ID: המזהה של פרויקט Google שמארח את Artifact Registry. -
NODE_POOL_MACHINE_SERVICE_AGENT: חשבון השירות של מאגר הצמתים באשכול, בפורמט הבא:service-CLUSTER_RESOURCE_PROJECT_NUMBER@gcp-sa-gkemulticloudnpmachine.iam.gserviceaccount.com -
ROLE: התפקידroles/artifactregistry.readerאו תפקיד בהתאמה אישית שמעניק הרשאות מספיקות לגישה לתמונות במאגר Artifact Registry.
שימוש ב-Google Container Registry פרטי
כדי לשלב Google Container Registry פרטי עם אשכול GKE on AWS, בלי קשר למיקום פרויקט Google שלו, פועלים לפי השלבים הבאים:
נותנים לסוכן שירות המכונה של מאגר הצמתים, חשבון השירות של המכונות הווירטואליות במאגר הצמתים של האשכול, גישה ל-Container Registry:
gcloud projects add-iam-policy-binding GCR_PROJECT_ID \
--member=NODE_POOL_MACHINE_SERVICE_AGENT \
--role=ROLE
בשלב הזה מאפשרים לחשבון השירות של האשכול לגשת לתמונות הפרטיות של הקונטיינרים.
מחליפים את מה שכתוב בשדות הבאים:
-
GCR_PROJECT_ID: מזהה הפרויקט שמארח את Container Registry. -
NODE_POOL_MACHINE_SERVICE_AGENT: חשבון השירות של מאגר הצמתים, בפורמטservice-CLUSTER_RESOURCE_PROJECT_NUMBER@gcp-sa-gkemulticloudnpmachine.iam.gserviceaccount.com. -
ROLE: בוחרים באפשרותstorage.objectViewerאו בתפקיד בהתאמה אישית כדי לקבל גישה מספקת ל-Container Registry. כדאי להיזהר מגישה רחבה באמצעותstorage.objectViewer.
הסרת המשאבים
כדי להסיר את המשאבים שיצרתם בדף הזה, מריצים את הפקודות הבאות:
kubectl apply -f POD_YAML_FILE
kubectl delete -f DEPLOYMENT_YAML_FILE
מחליפים את מה שכתוב בשדות הבאים:
-
POD_YAML_FILE: השם של קובץ ה-YAML שבו הגדרתם את ה-Pod. -
DEPLOYMENT_YAML_FILE: השם של קובץ ה-YAML שבו הגדרתם את הפריסה.
המאמרים הבאים
- קראו את סקירה כללית על Artifact Registry.