אשכול משותף ב-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 וצפייה בהם.
הכנת הסביבה
כדי להשלים את המשימות שבמסמך הזה, אתם צריכים את המשאבים הבאים:
מוודאים שיש לכם פרויקט לניהול הפריסות בקונטיינרים. אם אין לכם פרויקט, צרו פרויקט.
מגדירים את מרחב השמות של הפרויקט כמשתנה סביבה:
export NAMESPACE=PROJECT_NAMESPACEנכנסים לשרת ה-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, מבצעים את השלבים הבאים:
המסוף
בתפריט הניווט, בקטע CI/CD, בוחרים באפשרות Harbor Container Registry.
בוחרים את האזור שבו רוצים ליצור את המכונה של Harbor. מכונה של Harbor היא משאב של תחום מוגדר, וצריך ליצור אותה בכל תחום באופן ידני כדי להבטיח זמינות גבוהה.
לוחצים על Create Instance.
מזינים את שם המכונה ומאשרים את התנאים וההגבלות של Harbor managed.
לוחצים על Create Instance.
מוודאים שהמכונה החדשה של Harbor קיימת בקטע Harbor Instance.
לוחצים על הקישור החיצוני Go to Harbor Instance ורושמים את כתובת ה-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:
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:
המסוף
בדף Harbor Container Registry, לוחצים על Create A Harbor Project.
מזינים את שם הפרויקט.
לוחצים על יצירה.
מגדירים את שם הפרויקט ב-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 as a Service. מידע נוסף זמין במאמר הגדרת Docker כך שיאשר את רשות האישורים (CA) ברמה הבסיסית (root) של Harbor.
מגדירים את האימות של Docker ל-Harbor. מידע נוסף זמין במאמר הגדרת אימות Docker למכונות של מאגר Harbor.
יצירת סוד למשיכת קובץ אימג' ב-Kubernetes
מכיוון שאתם משתמשים בפרויקט פרטי ב-Harbor, אתם צריכים ליצור סוד לשליפת קובץ אימג' ב-Kubernetes.
מוסיפים חשבון רובוט של פרויקט Harbor שישמש כחשבון השירות.
במסוף Harbor, בוחרים את הפרויקט ב-Harbor.
לוחצים על Robot Accounts.
לוחצים על 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}כשמוצגת בקשה, מזינים את שם פרויקט הרובוט בשדה Username ואת האסימון הסודי בשדה Password, שסופקו בשלב הקודם במסך ההצלחה של מסוף 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 Registry המנוהל, ותשתמשו בו כדי לפרוס אפליקציה לדוגמה של שרת אינטרנט 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.
לוחצים על Create Cluster.
בשדה 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. בדרך כלל, פורסים פודים כקבוצה של רפליקות שאפשר לשנות את הגודל שלהן ולהפיץ אותן יחד באשכול. אחת הדרכים לפרוס קבוצה של רפליקות היא באמצעות Deployment של Kubernetes.
בקטע הזה, יוצרים Deployment של Kubernetes כדי להריץ את אפליקציית הקונטיינר של nginx באשכול. לפריסה הזו יש רפליקות או פודים. Pod אחד של Deployment מכיל רק קונטיינר אחד: קובץ האימג' של הקונטיינר nginx. בנוסף, אתם יוצרים משאב Service שמספק ללקוחות דרך יציבה לשלוח בקשות לפודים של ה-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יוצרים מדיניות רשת ב-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מייצאים את כתובת ה-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 registry המנוהל, משתמשים במסוף GDC:
בתפריט הניווט, בקטע CI/CD, בוחרים באפשרות Harbor Container Registry.
לוחצים על הקישור החיצוני Go to Harbor Instance.
מוחקים את קובץ האימג' של הקונטיינר באמצעות ממשק המשתמש של 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 ב-GDC מוסבר איך לנהל קונטיינרים שנפרסו באשכולות של Kubernetes.
איך מנהלים את אשכולות Kubernetes אחרי שפורסים את עומסי העבודה בקונטיינרים.
שיטות מומלצות להגדרת עומסי העבודה של קונטיינרים ומשאבי שירות אחרים.