שימוש במאגר תמונות פרטי ללא סודות

‫GKE on AWS מספק דרך לשליפת תמונות פרטיות מ-Artifact Registry או מ-Container Registry בלי להשתמש ב-Kubernetes Secret. בעבר, היה צריך לבצע את השלבים הבאים:

  1. יוצרים חשבון שירות של ניהול זהויות והרשאות גישה (IAM) ב-Google.
  2. מעניקים לחשבון השירות הרשאות גישה למאגר הפרטי.
  3. מורידים את המפתח של חשבון השירות ושומרים אותו כסוד של Kubernetes באשכול.
  4. יש להפנות אל ה-Secret הזה במניפסט ה-YAML של ה-Pods או ה-Deployments כדי שהם יוכלו לגשת לתמונות ממאגר הקונטיינרים הפרטי.
  5. מומלץ לבצע רוטציה ולנהל באופן קבוע את המפתחות שמשויכים לחשבון השירות של Google IAM.

‫GKE on AWS מבטל את כל השלבים הידניים האלה, ומטפל אוטומטית באימות ובהרשאה שנדרשים לשליפת תמונות פרטיות.

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

כדי לבצע את השלבים בדף הזה, קודם צריך לבצע את הפעולות הבאות:

בדיקת תמונות ב-Artifact Registry

כדי להשלים את שאר השלבים, צריך קובץ אימג' של קונטיינר. כדי לקבל את השם של קובץ האימג' בקונטיינר, פועלים לפי השלבים הבאים:

  1. מגדירים את כלי שורת הפקודה של Docker לאימות ב-Artifact Registry באמצעות Google Cloud SDK:

    gcloud auth configure-docker
    

    ‫Google Cloud CLI רושם כלי עזר לפרטי כניסה לכל מאגרי Docker שנתמכים על ידי Google.

  2. מוודאים ש-Artifact Registry כולל תמונה באמצעות הפקודה docker images:

    docker images
    

    ‫Docker מתחבר ל-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, מבצעים את השלבים הבאים:

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

    kubectl apply -f YAML_FILE_NAME
    

    מחליפים את YAML_FILE_NAME בשם של קובץ ה-YAML.

דוגמה ליצירת Pods ללא סודות לשליפת תמונות

דוגמה ליצירת Kubernetes Pod בלי צורך ב-image pull Secrets. ה-Pod מושך את התמונה hello-app מ-Artifact Registry.

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

    kubectl apply -f hello-pod.yaml
    
  3. מוודאים שה-Pod פועל באמצעות הפקודה kubectl get:

    kubectl get pod/hello-pod
    

    התשובה כוללת פוד אחד עם סטטוס Running.

    NAME        READY   STATUS    RESTARTS   AGE
    hello-pod   1/1     Running   0          15s
    

יצירת פריסות עם תמונות פרטיות ללא סודות לשליפת תמונות

כדי ליצור Deployment (פריסה) שיכולה לגשת לקובץ אימג' פרטי של קונטיינר מתוך מרשם, כבר לא צריך לציין את השדה spec.imagePullSecrets במפרט הפריסה. כדי להגדיר את הפריסה, מבצעים את השלבים הבאים:

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

    kubectl apply -f name-of-your-yaml-file.yaml
    

דוגמה ליצירת פריסה ללא סודות לשליפת תמונות

הנה דוגמה ליצירת פריסה ללא סודות של משיכת תמונות. הפריסה מושכת תמונה של hello-app מ-Artifact Registry.

  1. יוצרים קובץ בשם 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"
    

    מחליפים את מה שכתוב בשדות הבאים:

  2. מחילים את ההגדרה על האשכול באמצעות הפקודה kubectl.

    kubectl apply -f hello-deployment.yaml
    
  3. מוודאים שהפריסה פועלת עם kubectl pods.

    kubectl get pods --selector=app=products
    

    הפלט מציג שלושה Running Pods.

    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 שבו הגדרתם את הפריסה.

המאמרים הבאים