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

במאמר הזה מוסבר איך להשתמש ב-GKE ב-AWS עם מאגר פרטי של קובצי אימג' של קונטיינרים, כמו Container Registry‏ (GCR).

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

לפני שמתחילים להשתמש ב-GKE on AWS, חשוב לוודא שביצעתם את המשימות הבאות:

  • מתקינים שירות ניהול.
  • יוצרים אשכול משתמשים.
  • בספריית anthos-aws, משתמשים ב-anthos-gke כדי להחליף הקשר לאשכול המשתמשים.
    cd anthos-aws
    env HTTPS_PROXY=http://localhost:8118 \
      anthos-gke aws clusters get-credentials CLUSTER_NAME
    מחליפים את CLUSTER_NAME בשם אשכול המשתמש.
  • יצירה של קובץ אימג' של Docker והעברה שלו בדחיפה ל-Container Registry. בדוגמאות שבמאמר הזה נעשה שימוש בקונטיינר hello-app, שנבנה באמצעות השלבים שמפורטים במאמר פריסת אפליקציה בקונטיינר במסמכי GKE on Google Cloud .

מאגרי תמונות פרטיים של קונטיינרים

מאגר קונטיינרים מאחסן ומפיץ תמונות של קונטיינרים. ההתקנה של GKE ב-AWS יכולה לגשת לתמונות ציבוריות כברירת מחדל.

בדיקה אם יש תמונות ב-Container Registry

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

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

    gcloud auth configure-docker
    

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

  2. מוודאים ש-Container Registry כולל תמונה עם docker images.

    docker images
    

    ‫Docker מתחבר ל-Container Registry ומחזיר את קובצי האימג' שזמינים במאגר שלכם ב-Container Registry. לדוגמה, בתגובה שלמטה מוצג קובץ אימג' של קונטיינר בשם hello-app במאגר project-id.

    REPOSITORY                    TAG                 IMAGE ID            CREATED             SIZE
    gcr.io/project-id/hello-app   v1                  732f02cea7cb        12 minutes ago      11.5MB
    

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

יצירת חשבון שירות

אשכולות המשתמשים עוברים אימות באמצעות חשבון שירות של ניהול זהויות והרשאות גישה (IAM).

כדי ליצור חשבון שירות חדש:

  1. יוצרים חשבון שירות של IAM באמצעות Google Cloud CLI.

    gcloud iam service-accounts create account-name
    

    מחליפים את account-name בשם של חשבון השירות החדש Google Cloud.

  2. מעניקים לחשבון השירות גישה ל-Container Registry.

    gcloud projects add-iam-policy-binding project-id \
      --member serviceAccount:account-name@project-id.iam.gserviceaccount.com \
      --role roles/storage.objectViewer
    

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

    • project-id עם הפרויקט Google Cloud
    • account-name עם שם חשבון השירות שלכם Google Cloud
  3. מורידים את המפתח של חשבון השירות.

    gcloud iam service-accounts keys create key.json \
      --iam-account account-name@project-id.iam.gserviceaccount.com
    

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

    • project-id עם הפרויקט Google Cloud
    • account-name עם שם חשבון השירות שלכם Google Cloud

עכשיו אפשר להגדיר את אשכול המשתמשים כדי להתחבר אל Container Registry.

הגדרה של סוד ב-Kubernetes

כדי לספק את המפתח לאימות ב-Container Registry, שומרים את המפתח של חשבון השירות כסוד ב-Kubernetes באופן הבא:

  1. משתמשים ב-kubectl כדי ליצור את הסוד.

    env HTTPS_PROXY=http://localhost:8118 \
      kubectl create secret docker-registry gcr-secret \
      --docker-server=gcr.io \
      --docker-username=_json_key \
      --docker-email=account-name@project-id.iam.gserviceaccount.com \
      --docker-password="$(cat key.json)"
    

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

    • project-id עם הפרויקט Google Cloud
    • account-name עם שם חשבון השירות שלכם Google Cloud
  2. מוחקים את העותק המקומי של המפתח של חשבון השירות.

    rm key.json
    

עכשיו אפשר להפנות אל הסוד הזה בעומסי העבודה.

יצירת עומס עבודה עם תמונה פרטית

כדי להשתמש בתמונה ממאגר פרטי של קונטיינרים עם עומס עבודה, צריך להגדיר את השדה spec.imagePullSecrets לשם הסוד. השדה הזה נמצא במיקומים שונים ב-Pods וב-Deployments.

יצירת Pod

כדי ליצור Pod שיכול לגשת למאגר התמונות של הקונטיינרים, מגדירים את השדה spec.imagePullSecrets לשם הסוד.

  1. יוצרים Pod שמציין את spec.imagePullSecrets.

    apiVersion: v1
    kind: Pod
    metadata:
      name: pod-name
    spec:
      containers:
      - name: container-name
        image: gcr.io/project-id/hello-app:v1
      imagePullSecrets:
      - name: secret-name
    

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

    • pod-name בשם ה-Pod
    • container-name בשם הקונטיינר בתוך ה-Pod
    • project-id עם הפרויקט Google Cloud
    • secret-name בשם הסוד של הרישום

    לדוגמה, כדי למשוך את התמונה hello-app, מעתיקים את קובץ ה-YAML הבא לקובץ בשם hello-pod.yaml.

    apiVersion: v1
    kind: Pod
    metadata:
      name: hello-pod
    spec:
      containers:
      - name: hello-container
        image: gcr.io/project-id/hello-app:v1
      imagePullSecrets:
      - name: gcr-secret
    
  2. מחילים את ההגדרה על האשכול באמצעות הפקודה kubectl.

    env HTTPS_PROXY=http://localhost:8118 \
      kubectl apply -f hello-pod.yaml
    
  3. מוודאים שה-pod פועל באמצעות הפקודה kubectl get.

    env HTTPS_PROXY=http://localhost:8118 \
      kubectl get pod/hello-pod
    

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

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

    יצירת פריסה

  4. כדי להשתמש במאגר פרטי בפריסה, מציינים את imagePullSecret בתוך התבנית.

    לדוגמה, כדי ליצור פריסה של תמונת hello-app, יוצרים קובץ בשם 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: "gcr.io/project-id/hello-app:v1"
            env:
            - name: "PORT"
              value: "50001"
          imagePullSecrets:
          - name: gcr-secret
    
  5. מחילים את ההגדרה על האשכול באמצעות הפקודה kubectl.

    env HTTPS_PROXY=http://localhost:8118 \
      kubectl apply -f hello-deployment.yaml
    
  6. מוודאים שהפריסה פועלת עם kubectl pods.

    env HTTPS_PROXY=http://localhost:8118 \
      kubectl get pods --selector=app=products
    

    הפלט מכיל שלושה פודים של Running.

    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
    

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