פריסת אפליקציה של שרת אינטרנט בקונטיינר

אשכול משותף ב-Google Distributed Cloud (GDC)‎ עם air gap מאפשר להריץ אפליקציות בקונטיינרים בדומייני כשל מבודדים בארגון. אחרי שמצרפים אשכול לפרויקט, אפשר לנהל את עומסי העבודה האלה במרחב שמות ייעודי. במדריך הזה תגדירו מרשם Harbor מנוהל, תעבירו קובץ אימג' לדוגמה של NGINX מ-Docker Hub ותפרסו את שרת האינטרנט.

תהליך העבודה הזה מיועד למפתחים בקבוצת מפעילי האפליקציות שיוצרים עומסי עבודה בארגון שלהם. מידע נוסף זמין במאמר קהלי היעד של מסמכי התיעוד של GDC עם air gap.

מטרות

  • יוצרים מרשם Harbor מנוהל.
  • מעבירים קובץ אימג' של קונטיינר בדחיפה למאגר המנוהל של Harbor.
  • יוצרים אשכול Kubernetes משותף.
  • פורסים את אפליקציית הקונטיינר לדוגמה באשכול.

עלויות

מכיוון ש-GDC מיועד לפעול במרכז נתונים עם air gap, תהליכי החיוב והמידע מוגבלים רק לפריסת GDC ולא מנוהלים על ידי מוצרים אחרים של Google.

כדי להעריך את העלויות בהתאם לשימוש הצפוי, אתם יכולים להשתמש במחשבון העלויות.

אתם יכולים להשתמש בלוח הבקרה Projected Cost כדי לחזות את העלויות העתידיות של המק"טים בחשבוניות.

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

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

כדי להשלים את המשימות שבמסמך הזה, צריך לבקש את ההרשאות הנדרשות ולהכין את הסביבה.

עבדו עם צוות התשתית והאדמינים שלכם כדי להעביר את הקובץ הבינארי של האפליקציה לתחנת העבודה עם ה-air gap, או הריצו את המדריך הזה ישירות בשרת האינטגרציה הרציפה והפיתוח הרציף (CI/CD).

בקשת תפקידים ב-IAM

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

תפקידים בארגון

כדי ליצור, למחוק, לערוך או להציג אשכול Kubernetes משותף, צריך לבקש ממנהל החשבון הארגוני ב-IAM להקצות לכם את התפקיד אדמין של אשכול משתמשים (user-cluster-admin). התפקיד הזה לא קשור למרחב שמות.

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

תפקידים בפרויקט

בקשו מהאדמין של הפרויקט ב-IAM להקצות לכם את התפקידים הבאים במרחב השמות של הפרויקט, בהתאם למשימה שאתם צריכים לבצע:

  • ‫Namespace Admin ‏ (namepspace-admin): יצירה, מחיקה, עריכה וצפייה במשאבי הפרויקט. התפקיד הזה נדרש כדי לפרוס עומסי עבודה של קונטיינרים בפרויקט.

  • אדמין של מכונות Harbor‏ (harbor-instance-admin): יצירה, מחיקה, עריכה וצפייה במשאבי Harbor, כולל מכונות Harbor.

  • צפייה במכונות של Harbor‏ (harbor-instance-viewer): צפייה במכונה של Harbor ובחירה בה.

  • יצירת פרויקטים ב-Harbor ‏ (harbor-project-creator): יצירה של פרויקטים ב-Harbor וצפייה בהם.

הכנת הסביבה

כדי להשלים את המשימות שבמסמך הזה, אתם צריכים את המשאבים הבאים:

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

  2. מגדירים את מרחב השמות של הפרויקט כמשתנה סביבה:

    export NAMESPACE=PROJECT_NAMESPACE
    
  3. מורידים ומתקינים את ה-CLI של gdcloud.

  4. נכנסים לשרת ה-API של ניהול האזורים ויוצרים את קובץ ה-kubeconfig שלו עם זהות משתמש. מגדירים את הנתיב של kubeconfig כמשתנה סביבה:

    export MANAGEMENT_API_SERVER=MANAGEMENT_API_SERVER_KUBECONFIG_PATH
    

יצירת מאגר מנוהל ב-Harbor

ב-GDC עם air gap יש את Harbor as a Service – שירות שמנוהל במלואו ומאפשר לאחסן ולנהל קובצי אימג' של קונטיינרים באמצעות Harbor.

כדי להשתמש ב-Harbor as a Service, קודם צריך ליצור מכונה של מרשם Harbor ופרויקט Harbor.

יצירת מכונה של מרשם Harbor

כדי ליצור מכונה של Container Registry ב-Harbor, מבצעים את השלבים הבאים:

המסוף

  1. בתפריט הניווט, בקטע CI/CD, בוחרים באפשרות Harbor Container Registry.

  2. בוחרים את האזור שבו רוצים ליצור את המכונה של Harbor. מכונה של Harbor היא משאב של תחום מוגדר, וצריך ליצור אותה בכל תחום באופן ידני כדי להבטיח זמינות גבוהה.

  3. לוחצים על Create Instance.

  4. מזינים את שם המכונה ומאשרים את התנאים וההגבלות של Harbor managed.

  5. לוחצים על Create Instance.

  6. מוודאים שהמכונה החדשה של Harbor קיימת בקטע Harbor Instance.

  7. לוחצים על הקישור החיצוני Go to Harbor Instance ורושמים את כתובת ה-URL של המכונה. לדוגמה, הפורמט של כתובת ה-URL של המכונה דומה ל-harbor-1.org-1.zone1.google.gdc.test. כתובת ה-URL של המכונה לא יכולה לכלול את הקידומת https://.

  8. מגדירים את כתובת ה-URL של המכונה כמשתנה לשימוש בהמשך המדריך:

    export INSTANCE_URL=INSTANCE_URL
    

    מחליפים את INSTANCE_URL בכתובת ה-URL של המכונה של מאגר Harbor.

    לדוגמה:

    export INSTANCE_URL=harbor-1.org-1.zone1.google.gdc.test
    

gdcloud

  1. יוצרים את המכונה החדשה של מאגר קונטיינרים ב-Harbor:

    gdcloud harbor instances create INSTANCE_NAME \
        --project=PROJECT
    

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

    • ‫INSTANCE_NAME: השם של מכונת Harbor.
    • ‫PROJECT: השם של הפרויקט ב-GDC.
  2. מציינים את כתובת ה-URL של המכונה:

    gdcloud harbor instances describe INSTANCE_NAME \
        --project=PROJECT
    

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

    # Several lines of code are omitted here.
    status:
      url: https://harbor-1.org-1.zone1.google.gdc.test
    
  3. מגדירים את כתובת ה-URL של המכונה כמשתנה לשימוש בהמשך המדריך:

    export INSTANCE_URL=INSTANCE_URL
    

    מחליפים את INSTANCE_URL בכתובת ה-URL של המכונה של מאגר Harbor. חשוב לוודא שכתובת ה-URL של המכונה לא כוללת את הקידומת https://.

    לדוגמה:

    export INSTANCE_URL=harbor-1.org-1.zone1.google.gdc.test
    

יצירת פרויקט Harbor במרשם

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

המסוף

  1. בדף Harbor Container Registry, לוחצים על Create A Harbor Project.

  2. מזינים את שם הפרויקט.

  3. לוחצים על יצירה.

  4. מגדירים את שם הפרויקט ב-Harbor כמשתנה לשימוש בהמשך המדריך:

    export HARBOR_PROJECT=HARBOR_PROJECT
    

gdcloud

  1. יוצרים את הפרויקט החדש ב-Harbor:

    gdcloud harbor harbor-projects create HARBOR_PROJECT \
        --project=PROJECT \
        --instance=INSTANCE_NAME
    

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

    • ‫HARBOR_PROJECT: השם של פרויקט Harbor שרוצים ליצור.
    • ‫PROJECT: השם של הפרויקט ב-GDC.
    • ‫INSTANCE_NAME: השם של מכונת Harbor.
  2. מגדירים את שם הפרויקט ב-Harbor כמשתנה לשימוש בהמשך המדריך:

    export HARBOR_PROJECT=HARBOR_PROJECT
    

הגדרת Docker

כדי להשתמש ב-Docker במרשם Harbor, מבצעים את השלבים הבאים:

  1. מגדירים את Docker כך שייתן אמון ב-Harbor as a Service. מידע נוסף זמין במאמר הגדרת Docker כך שיאשר את רשות האישורים (CA) ברמה הבסיסית (root) של Harbor.

  2. מגדירים את האימות של Docker ל-Harbor. מידע נוסף זמין במאמר הגדרת אימות Docker למכונות של מאגר Harbor.

יצירת סוד למשיכת קובץ אימג' ב-Kubernetes

מכיוון שאתם משתמשים בפרויקט פרטי ב-Harbor, אתם צריכים ליצור סוד לשליפת קובץ אימג' ב-Kubernetes.

  1. מוסיפים חשבון רובוט של פרויקט Harbor שישמש כחשבון השירות.

    1. במסוף Harbor, בוחרים את הפרויקט ב-Harbor.

    2. לוחצים על Robot Accounts.

    3. לוחצים על New Robot Account.

    4. נותנים שם לחשבון הרובוט החדש וקובעים הגדרות נוספות.

    5. לוחצים על הוספה.

    6. השם והסוד של חשבון הרובוט מוצגים במסך ההצלחה. השאירו את המסך הזה פתוח כדי לעיין בו בשלב הבא.

    מידע נוסף זמין במסמכי התיעוד של Harbor: https://goharbor.io/docs/2.8.0/working-with-projects/project-configuration/create-robot-accounts/#add-a-robot-account.

  2. בחלון טרמינל חדש, נכנסים ל-Docker באמצעות חשבון הרובוט והאסימון הסודי של פרויקט Harbor:

    docker login ${INSTANCE_URL}
    

    כשמוצגת בקשה, מזינים את שם פרויקט הרובוט בשדה Username ואת האסימון הסודי בשדה Password, שסופקו בשלב הקודם במסך ההצלחה של מסוף Harbor.

  3. מגדירים שם שרירותי לסוד של משיכת התמונה:

    export SECRET=SECRET
    
  4. יוצרים את הסוד שנדרש כדי למשוך את קובץ האימג':

    kubectl create secret docker-registry ${SECRET}  \
        --from-file=.dockerconfigjson=DOCKER_CONFIG \
        -n ${NAMESPACE}
    

    מחליפים את DOCKER_CONFIG בנתיב לקובץ .docker/config.json.

  5. מוודאים שהסוד קיים במרחב השמות של הפרויקט ב-GDC:

    kubectl get secrets -n ${NAMESPACE}
    

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

    NAME          TYPE                               DATA     AGE
    my-secret     kubernetes.io/dockerconfigjson     1        23s
    

דחיפת קובץ אימג' של קונטיינר למרשם Harbor מנוהל

במדריך הזה תורידו את קובץ האימג' של שרת האינטרנט nginx ותעבירו אותו ל-Harbor Registry המנוהל, ותשתמשו בו כדי לפרוס אפליקציה לדוגמה של שרת אינטרנט nginx באשכול Kubernetes משותף. אפליקציית שרת האינטרנט nginx זמינה במאגר הציבורי של Docker Hub.

  1. מושכים את קובץ האימג' של nginx מ-Docker Hub לתחנת העבודה המקומית באמצעות רשת חיצונית:

    docker pull nginx
    
  2. מתייגים את קובץ האימג' המקומי בשם המאגר:

    docker tag nginx ${INSTANCE_URL}/${HARBOR_PROJECT}/nginx:1.25
    
  3. מעבירים את קובץ האימג' של הקונטיינר nginx למרשם Harbor המנוהל:

    docker push ${INSTANCE_URL}/${HARBOR_PROJECT}/nginx:1.25
    

יצירת אשכול Kubernetes

עכשיו, כשקובץ האימג' של הקונטיינר nginx מאוחסן במרשם המנוהל של Harbor ואפשר לגשת אליו, יוצרים אשכול Kubernetes משותף כדי להריץ את שרת האינטרנט nginx.

המסוף

  1. בתפריט הניווט, לוחצים על Kubernetes Engine > Clusters.

  2. לוחצים על Create Cluster.

  3. בשדה Name, נותנים שם לאשכול.

  4. בוחרים את האזור שבו רוצים ליצור את אשכול Kubernetes. אשכול Kubernetes הוא משאב של תחום מוגדר, וכדי להבטיח זמינות גבוהה צריך ליצור אותו בכל אזור באופן ידני.

  5. לוחצים על Attach Project ובוחרים פרויקט שרוצים לצרף לאשכול. לאחר מכן לוחצים על שמירה.

  6. לוחצים על יצירה.

  7. מחכים שהאשכול ייווצר. כשהאשכול זמין לשימוש, הסטטוס READY מופיע לצד שם האשכול.

API

  1. יוצרים משאב בהתאמה אישית של Cluster ושומרים אותו כקובץ YAML, למשל cluster.yaml:

    apiVersion: cluster.gdc.goog/v1
    kind: Cluster
    metadata:
      name: CLUSTER_NAME
      namespace: platform
    

    מחליפים את הערך CLUSTER_NAME בשם של האשכול.

  2. מחילים את המשאב בהתאמה אישית על המכונה של GDC:

    kubectl create -f cluster.yaml --kubeconfig ${MANAGEMENT_API_SERVER}
    
  3. מצרפים פרויקט לאשכול Kubernetes באמצעות מסוף GDC. בשלב הזה אי אפשר לצרף פרויקט לאשכול באמצעות ה-API.

למידע נוסף על יצירת אשכול Kubernetes משותף, ראו יצירת אשכול משותף. מידע נוסף על אפשרויות ההגדרה של אשכולות זמין במאמר הגדרות של אשכולות Kubernetes.

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

עכשיו אפשר לפרוס את קובץ האימג' של הקונטיינר nginx באשכול Kubernetes.

ב-Kubernetes, אפליקציות מיוצגות כמשאבי Pod, שהם יחידות ניתנות להתאמה שמכילות קונטיינר אחד או יותר. Pod הוא היחידה הקטנה ביותר שאפשר לפרוס ב-Kubernetes. בדרך כלל, פורסים פודים כקבוצה של רפליקות שאפשר לשנות את הגודל שלהן ולהפיץ אותן יחד באשכול. אחת הדרכים לפרוס קבוצה של רפליקות היא באמצעות Deployment של Kubernetes.

בקטע הזה, יוצרים Deployment של Kubernetes כדי להריץ את אפליקציית הקונטיינר של nginx באשכול. לפריסה הזו יש רפליקות או פודים. ‫Pod אחד של Deployment מכיל רק קונטיינר אחד: קובץ האימג' של הקונטיינר nginx. בנוסף, אתם יוצרים משאב Service שמספק ללקוחות דרך יציבה לשלוח בקשות לפודים של ה-Deployment.

פורסים את שרת האינטרנט nginx באשכול Kubernetes:

  1. נכנסים לאשכול Kubernetes ויוצרים את קובץ ה-kubeconfig שלו עם זהות משתמש. מגדירים את הנתיב של kubeconfig כמשתנה סביבה:

    export KUBECONFIG=CLUSTER_KUBECONFIG_PATH
    
  2. יוצרים ופורסים את המשאבים בהתאמה אישית של Kubernetes, Deployment ו-Service:

    kubectl --kubeconfig ${KUBECONFIG} -n ${NAMESPACE} \
    create -f - <<EOF
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: nginx-deployment
      labels:
        app: nginx
    spec:
      replicas: 2
      selector:
        matchLabels:
          app: nginx
      template:
        metadata:
          labels:
            app: nginx
        spec:
          containers:
          - name: nginx
            image: ${INSTANCE_URL}/${HARBOR_PROJECT}/nginx:1.25
            ports:
            - containerPort: 80
          imagePullSecrets:
          - name: ${SECRET}
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: nginx-service
    spec:
      selector:
        app: nginx
      ports:
        - port: 80
          protocol: TCP
      type: LoadBalancer
    EOF
    
  3. מוודאים שה-pods נוצרו על ידי הפריסה:

    kubectl get pods -l app=nginx -n ${NAMESPACE}
    

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

    NAME                                READY     STATUS    RESTARTS   AGE
    nginx-deployment-1882529037-6p4mt   1/1       Running   0          1h
    nginx-deployment-1882529037-p29za   1/1       Running   0          1h
    nginx-deployment-1882529037-s0cmt   1/1       Running   0          1h
    
  4. יוצרים מדיניות רשת ב-Kubernetes שמאפשרת את כל התנועה ברשת למרחב השמות:

    kubectl --kubeconfig ${KUBECONFIG} -n ${NAMESPACE} \
    create -f - <<EOF
    apiVersion: networking.k8s.io/v1
    kind: NetworkPolicy
    metadata:
      annotations:
      name: allow-all
    spec:
      ingress:
      - from:
        - ipBlock:
            cidr: 0.0.0.0/0
      podSelector: {}
      policyTypes:
      - Ingress
    EOF
    
  5. מייצאים את כתובת ה-IP של השירות nginx:

      export IP=`kubectl --kubeconfig=${KUBECONFIG} get service nginx-service \
          -n ${NAMESPACE} -o jsonpath='{.status.loadBalancer.ingress[*].ip}'`
    
  6. בודקים את כתובת ה-IP של שרת nginx באמצעות curl:

      curl http://$IP
    

הסרת המשאבים

כדי להימנע מחיובים בחשבון GDC בגלל השימוש במשאבים שנעשה במסגרת המדריך הזה, אתם צריכים למחוק את המשאבים שיצרתם.

מחיקת קובץ האימג' של הקונטיינר

כדי למחוק את קובץ האימג' של הקונטיינר מסביבת GDC עם air gap, אפשר למחוק את המכונה של Harbor שמכילה את קובץ האימג' או להשאיר את המכונה של Harbor ולמחוק את קובץ האימג' של הקונטיינר הספציפי.

כדי למחוק את קובץ האימג' של הקונטיינר מה-Harbor registry המנוהל, משתמשים במסוף GDC:

  1. בתפריט הניווט, בקטע CI/CD, בוחרים באפשרות Harbor Container Registry.

  2. לוחצים על הקישור החיצוני Go to Harbor Instance.

  3. מוחקים את קובץ האימג' של הקונטיינר באמצעות ממשק המשתמש של Harbor. מידע נוסף זמין במאמר מחיקת מופעים של מרשם Harbor.

מחיקת האפליקציה שמכילה את הווידג'ט

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

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

  1. מוחקים את האובייקט Service של אפליקציית הקונטיינר:

    kubectl delete service nginx-service -n ${NAMESPACE}
    
  2. מוחקים את האובייקט Deployment של אפליקציית הקונטיינר:

    kubectl delete deployment nginx-deployment -n ${NAMESPACE}
    
  3. אם יצרתם אשכול Kubernetes לבדיקה רק בשביל המדריך הזה, מחקו אותו:

    kubectl delete clusters.cluster.gdc.goog/USER_CLUSTER_NAME \
        -n platform --kubeconfig ${MANAGEMENT_API_SERVER}
    

    הפקודה הזו מוחקת את המשאבים שמרכיבים את אשכול Kubernetes, כמו המכונות, הדיסקים ומשאבי הרשת:

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