במדריך הזה מוסבר איך להעלות אפליקציה בקונטיינר בסביבה מבודדת של Google Distributed Cloud (GDC), ולהריץ את האפליקציה הזו באשכול Kubernetes. עומס עבודה בקונטיינר פועל באשכול Kubernetes בתוך מרחב שמות של פרויקט. אשכולות מופרדים באופן לוגי מפרויקטים ומאשכולות אחרים כדי לספק תחומים שונים של כשל והבטחות בידוד. עם זאת, צריך לוודא שהאשכול מצורף לפרויקט כדי לאפשר ניהול של עומסי עבודה בקונטיינרים בתוך פרויקט.
תהליך העבודה הזה מיועד למפתחי אפליקציות בקבוצת מפעילים של אפליקציות, שאחראים ליצירת עומסי עבודה של אפליקציות עבור הארגון שלהם. מידע נוסף מופיע במאמרי העזרה בנושא קהלים ב-GDC עם פער אבטחה.
אחד המכשולים הגדולים ביותר בפריסת אפליקציית קונטיינר הוא העברת הקובץ הבינארי של האפליקציה למרכז הנתונים עם פערי האוויר. אתם יכולים לעבוד עם צוות התשתית והאדמינים כדי להעביר את האפליקציה לתחנת העבודה שלכם או להטמיע את ההדרכה הזו ישירות בשרת האינטגרציה הרציפה (CI) והפיתוח הרציף (CD) שלכם.
במדריך הזה נעשה שימוש באפליקציית שרת אינטרנט לדוגמה שזמינה ב- Google CloudArtifact Registry.
מטרות
- יוצרים מאגר Harbor מנוהל.
- דחיפה של קובץ אימג' של קונטיינר למאגר Harbor המנוהל.
- יוצרים אשכול Kubernetes.
- פורסים את אפליקציית הקונטיינר לדוגמה באשכול.
עלויות
GDC מיועדת להפעלה במרכז נתונים עם בידוד פיזי, ולכן תהליכי החיוב והמידע מוגבלים רק לפריסת GDC ולא מנוהלים על ידי מוצרים אחרים של Google.
כדי ליצור הערכת עלויות על סמך השימוש החזוי, אתם יכולים להשתמש במחשבון התמחור.
אפשר להשתמש בלוח הבקרה של העלות החזויה כדי לצפות את העלויות העתידיות של המק"טים בחשבוניות.
כדי לעקוב אחרי נפח האחסון וצריכת המחשוב, אפשר להשתמש במרכזי הבקרה של נתוני החיוב.
לפני שמתחילים
מוודאים שיש לכם פרויקט לניהול הפריסות של הקונטיינרים. אם אין לכם פרויקט, אתם יכולים ליצור פרויקט.
מגדירים את מרחב השמות של הפרויקט כמשתנה סביבה:
export NAMESPACE=PROJECT_NAMESPACEצריך לבקש מאדמין IAM בארגון להקצות לכם את התפקידים הבאים:
תפקיד אדמין במרחב שמות (
namepspace-admin) במרחב השמות של הפרויקט. התפקיד הזה נדרש כדי לפרוס עומסי עבודה של מאגר תגים בפרויקט.תפקיד אדמין של מופע Harbor (
harbor-instance-admin) במרחב השמות של הפרויקט. התפקיד הזה נדרש לגישת קריאה וכתיבה לכל משאבי Harbor. היא נדרשת גם למחיקת מופעי Harbor.תפקיד הצפייה במופע Harbor (
harbor-instance-viewer) במרחב השמות של הפרויקט. התפקיד הזה נדרש כדי להציג ולבחור מופע של Harbor.התפקיד 'יצירת פרויקטים ב-Harbor' (
harbor-project-creator) במרחב השמות של הפרויקט. התפקיד הזה נדרש כדי לגשת לפרויקט Harbor ולנהל אותו.תפקיד אדמין באשכול משתמשים (
user-cluster-admin). התפקיד הזה נדרש כדי ליצור אשכול Kubernetes, והוא לא משויך למרחב שמות.
נכנסים לשרת של API לניהול אזורי ויוצרים את קובץ ה-kubeconfig שלו עם זהות משתמש. מגדירים את הנתיב של kubeconfig כמשתנה סביבה:
export MANAGEMENT_API_SERVER=MANAGEMENT_API_SERVER_KUBECONFIG_PATH
יצירת מאגר Harbor מנוהל
GDC air-gapped מספקת את Harbor כשירות (Harbor as a Service). זהו שירות מנוהל מלא שמאפשר לאחסן ולנהל קובצי אימג' של קונטיינרים באמצעות Harbor.
כדי להשתמש ב-Harbor כשירות, קודם צריך ליצור מופע של מאגר Harbor ופרויקט Harbor.
יצירת מופע של מאגר Harbor
כדי ליצור מופע של מאגר תמונות של קונטיינרים ב-Harbor, פועלים לפי השלבים הבאים:
המסוף
בתפריט הניווט, בוחרים באפשרות Harbor Container Registry בקטע CI/CD.
בוחרים את האזור שבו רוצים ליצור את מופע Harbor. מופע של Harbor הוא משאב של תחום מוגדר, וצריך ליצור אותו בכל תחום (zone) באופן ידני כדי להבטיח זמינות גבוהה.
לוחצים על Create Instance.
מזינים את השם של המופע ומאשרים את התנאים וההגבלות של Harbor בניהול Google.
לוחצים על Create Instance.
מוודאים שמופע Harbor החדש מופיע בקטע Harbor Instance.
לוחצים על הקישור החיצוני Go to Harbor Instance (מעבר למופע Harbor) ורושמים את כתובת ה-URL של המופע. לדוגמה, הפורמט של כתובת ה-URL של המופע דומה ל-
harbor-1.org-1.zone1.google.gdc.test. כתובת ה-URL של המופע לא יכולה לכלול את הקידומתhttps://.מגדירים את כתובת ה-URL של המופע כמשתנה לשימוש בהמשך המדריך:
export INSTANCE_URL=INSTANCE_URLמחליפים את INSTANCE_URL בכתובת ה-URL של מופע הרישום של Harbor.
לדוגמה:
export INSTANCE_URL=harbor-1.org-1.zone1.google.gdc.test
gdcloud
יוצרים את מופע Harbor container registry החדש:
gdcloud harbor instances create INSTANCE_NAME \ --project=PROJECT \מחליפים את מה שכתוב בשדות הבאים:
-
INSTANCE_NAME: השם של מופע Harbor. -
PROJECT: השם של פרויקט GDC.
-
מציינים את כתובת ה-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מגדירים את כתובת ה-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:
המסוף
לוחצים על Create A Harbor Project (יצירת פרויקט Harbor) בדף Harbor Container Registry (מאגר Harbor של קונטיינרים).
מזינים את שם הפרויקט.
לוחצים על יצירה.
מגדירים את שם הפרויקט ב-Harbor כמשתנה כדי להשתמש בו בהמשך המדריך:
export HARBOR_PROJECT=HARBOR_PROJECT
gdcloud
יוצרים את פרויקט Harbor החדש:
gdcloud harbor harbor-projects create HARBOR_PROJECT \ --project=PROJECT \ --instance=INSTANCE_NAMEמחליפים את מה שכתוב בשדות הבאים:
-
HARBOR_PROJECT: השם של פרויקט Harbor שרוצים ליצור. -
PROJECT: השם של פרויקט GDC. -
INSTANCE_NAME: השם של מופע Harbor.
-
מגדירים את שם הפרויקט ב-Harbor כמשתנה כדי להשתמש בו בהמשך המדריך:
export HARBOR_PROJECT=HARBOR_PROJECT
הגדרת Docker
כדי להשתמש ב-Docker במאגר Harbor, צריך לבצע את השלבים הבאים:
הגדרת Docker כך שיסמוך על Harbor כשירות. מידע נוסף זמין במאמר הגדרת Docker כך שיסמוך על CA הבסיסי של Harbor.
הגדרת אימות Docker ל-Harbor. מידע נוסף זמין במאמר בנושא הגדרת אימות Docker למופעי מאגר Harbor.
יצירת סוד למשיכת תמונות ב-Kubernetes
מכיוון שאתם משתמשים בפרויקט פרטי של Harbor, אתם צריכים ליצור סוד משיכת תמונות של Kubernetes.
מוסיפים חשבון רובוט של פרויקט Harbor שישמש כחשבון השירות.
במסוף של Harbor, בוחרים את פרויקט Harbor.
לוחצים על חשבונות רובוט.
בוחרים באפשרות New Robot Account (חשבון רובוט חדש).
נותנים שם לחשבון הרובוט החדש ומגדירים הגדרות נוספות.
לוחצים על הוספה.
השם והסוד של חשבון הרובוט מוצגים במסך ההצלחה. משאירים את המסך הזה פתוח כדי שיהיה אפשר להשתמש בו בשלב הבא.
מידע נוסף זמין במסמכי התיעוד של Harbor: https://goharbor.io/docs/2.8.0/working-with-projects/project-configuration/create-robot-accounts/#add-a-robot-account.
בחלון טרמינל חדש, נכנסים ל-Docker עם חשבון הרובוט של פרויקט Harbor ועם אסימון הסודיות:
docker login ${INSTANCE_URL}כשמוצגת בקשה, מזינים את שם פרויקט הרובוט בשדה שם משתמש ואת אסימון הסודיות בשדה סיסמה שסופקו בשלב הקודם במסך ההצלחה של מסוף Harbor.
מגדירים שם שרירותי לסוד של משיכת התמונה:
export SECRET=SECRETיוצרים את הסוד שנדרש לשליפת התמונה:
kubectl create secret docker-registry ${SECRET} \ --from-file=.dockerconfigjson=DOCKER_CONFIG \ -n ${NAMESPACE}מחליפים את הערך של
DOCKER_CONFIGבנתיב של קובץ.docker/config.json.מוודאים שהסוד קיים במרחב השמות של פרויקט GDC:
kubectl get secrets -n ${NAMESPACE}הפלט אמור להיראות כך:
NAME TYPE DATA AGE my-secret kubernetes.io/dockerconfigjson 1 23s
העברת קובץ אימג' של קונטיינר למאגר Harbor מנוהל
במדריך הזה תורידו ותדחפו את תמונת שרת האינטרנט nginx למאגר Harbor המנוהל, ותשתמשו בה כדי לפרוס אפליקציית שרת אינטרנט לדוגמה של nginx לאשכול Kubernetes. אפליקציית שרת האינטרנט nginx זמינה במאגר הציבורי Docker Hub.
מושכים את התמונה
nginxמ-Docker Hub לתחנת העבודה המקומית באמצעות רשת חיצונית:docker pull nginxמתייגים את התמונה המקומית עם שם המאגר:
docker tag nginx ${INSTANCE_URL}/${HARBOR_PROJECT}/nginx:1.25מעלים את קובץ האימג' של הקונטיינר
nginxלמאגר Harbor המנוהל:docker push ${INSTANCE_URL}/${HARBOR_PROJECT}/nginx:1.25
יצירת אשכול Kubernetes
עכשיו, אחרי שקובץ האימג' של קונטיינר nginx מאוחסן במאגר Harbor המנוהל ויש לכם גישה אליו, אתם יכולים ליצור אשכול Kubernetes משותף כדי להריץ את שרת האינטרנט nginx.
המסוף
בתפריט הניווט, בוחרים באפשרות Kubernetes Engine > Clusters.
לוחצים על יצירת אשכול.
בשדה Name (שם), מציינים שם לאשכול.
בוחרים את האזור שבו רוצים ליצור את אשכול Kubernetes. אשכול Kubernetes הוא משאב של תחום מוגדר, וצריך ליצור אותו בכל אזור באופן ידני כדי להבטיח זמינות גבוהה.
לוחצים על Attach Project (צירוף פרויקט) ובוחרים פרויקט לצירוף לאשכול. לאחר מכן לוחצים על שמירה.
לוחצים על יצירה.
ממתינים ליצירת האשכול. כשהאשכול זמין לשימוש, הסטטוס
READYמופיע לצד שם האשכול.
API
יוצרים משאב בהתאמה אישית
Clusterושומרים אותו כקובץ YAML, כמוcluster.yaml:apiVersion: cluster.gdc.goog/v1 kind: Cluster metadata: name: CLUSTER_NAME namespace: platformמחליפים את הערך
CLUSTER_NAMEבשם של האשכול.מחילים את המשאב המותאם אישית על מופע GDC:
kubectl create -f cluster.yaml --kubeconfig ${MANAGEMENT_API_SERVER}צירוף פרויקט לאשכול Kubernetes באמצעות מסוף GDC. בשלב הזה אי אפשר לצרף פרויקט לאשכול באמצעות ה-API.
מידע נוסף על יצירת אשכול Kubernetes משותף זמין במאמר יצירת אשכול משותף. מידע נוסף על אפשרויות ההגדרה של אשכולים זמין במאמר הגדרות של אשכול Kubernetes.
פריסת אפליקציית הקונטיינר לדוגמה
עכשיו אתם מוכנים לפרוס את קובץ אימג' של קונטיינר של nginx באשכול Kubernetes.
ב-Kubernetes, אפליקציות מיוצגות כמשאבי Pod, שהם יחידות ניתנות להרחבה שמכילות קונטיינר אחד או יותר. ה-Pod הוא היחידה הקטנה ביותר שניתנת לפריסה ב-Kubernetes. בדרך כלל, פורסים את ה-Pods כקבוצה של רפליקות שאפשר לשנות את הגודל שלהן ולפזר אותן יחד ברחבי האשכול. אחת הדרכים לפרוס קבוצה של רפליקות היא באמצעות Deployment ב-Kubernetes.
בקטע הזה, יוצרים Deployment Kubernetes כדי להריץ את אפליקציית nginx הקונטיינר באשכול. לפריסה הזו יש רפליקות או pods. פוד Deployment אחד מכיל רק קונטיינר אחד: קובץ האימג' של קונטיינר nginx. אפשר גם ליצור משאב Service שמספק ללקוחות דרך יציבה לשליחת בקשות ל-pods של Deployment.
פורסים את שרת האינטרנט nginx לאשכול Kubernetes:
נכנסים לאשכול Kubernetes ויוצרים את קובץ ה-kubeconfig שלו עם זהות משתמש. מגדירים את הנתיב של kubeconfig כמשתנה סביבה:
export KUBECONFIG=CLUSTER_KUBECONFIG_PATHיוצרים ופורסים את המשאבים המותאמים אישית של 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בודקים שה-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יוצרים מדיניות רשת שמאפשרת את כל תעבורת הנתונים ברשת אל מרחב השמות:
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מייצאים את כתובת ה-IP של שירות
nginx:export IP=`kubectl --kubeconfig=${KUBECONFIG} get service nginx-service \ -n ${NAMESPACE} -o jsonpath='{.status.loadBalancer.ingress[*].ip}'`בודקים את כתובת ה-IP של השרת
nginxבאמצעותcurl:curl http://$IP
הסרת המשאבים
כדי להימנע מחיובים בחשבון GDC על המשאבים שבהם השתמשתם במדריך הזה, אתם צריכים למחוק את המשאבים שיצרתם.
מחיקת קובץ אימג' של קונטיינר
כדי למחוק את קובץ האימג' של הקונטיינר מהסביבה שלכם ב-GDC עם air gap, אפשר למחוק את מופע Harbor שמכיל את התמונה, או לשמור את מופע Harbor ולמחוק את קובץ האימג' של הקונטיינר הספציפי.
כדי למחוק את קובץ אימג' של קונטיינר ממאגר Harbor המנוהל, משתמשים במסוף GDC:
בתפריט הניווט, בוחרים באפשרות Harbor Container Registry בקטע CI/CD.
לוחצים על הקישור החיצוני Go to Harbor Instance (מעבר למופע של Harbor).
מוחקים את קובץ אימג' של קונטיינר באמצעות ממשק המשתמש של Harbor. מידע נוסף מופיע במאמר בנושא מחיקת מופעים של מאגר Harbor.
מחיקת אפליקציית הקונטיינר
כדי למחוק את אפליקציית הקונטיינר שנפרסה, אפשר למחוק את פרויקט GDC שמכיל את המשאבים, או להשאיר את פרויקט GDC ולמחוק את המשאבים הבודדים.
כדי למחוק את המשאבים הספציפיים, פועלים לפי השלבים הבאים:
מוחקים את האובייקט
Serviceשל אפליקציית הקונטיינר:kubectl delete service nginx-service -n ${NAMESPACE}מוחקים את האובייקט
Deploymentשל אפליקציית הקונטיינר:kubectl delete deployment nginx-deployment -n ${NAMESPACE}אם יצרתם אשכול Kubernetes לבדיקה רק לצורך המדריך הזה, צריך למחוק אותו:
kubectl delete clusters.cluster.gdc.goog/USER_CLUSTER_NAME \ -n platform --kubeconfig ${MANAGEMENT_API_SERVER}הפעולה הזו מוחקת את המשאבים שמרכיבים את אשכול Kubernetes, כמו מופעי מחשוב, דיסקים ומשאבי רשת:
המאמרים הבאים
כדאי לעיין בהיררכיית המשאבים ובפרטים על בידוד משאבים.
במאמר Kubernetes containers for GDC מוסבר איך לנהל קונטיינרים שנפרסו באשכולות Kubernetes.
איך מנהלים את אשכולות Kubernetes אחרי פריסת עומסי העבודה (workload) של הקונטיינרים.
מומלץ לעיין בשיטות המומלצות להגדרת עומסי העבודה של מאגר התגים ומשאבי שירות אחרים.