אתם יכולים להשתמש ב-Managed Harbor Service (MHS) של Google Distributed Cloud (GDC) עם air gap כדי ליצור מכונה של מרשם Harbor בכל פרויקט. מכונה של מרשם Harbor משמשת כמאגר מרכזי לאחסון ולניהול של קובצי אימג' של קונטיינרים בסביבה מבוססת-ענן. הוא מרחיב את היכולות של הפצת Docker בקוד פתוח. ההגבלות הבאות חלות:
- אפשר ליצור מכונה אחת לכל היותר בכל פרויקט.
- המופעים מבודדים ולא משתפים נתונים או משאבי מחשוב.
לפני שמתחילים
אם אתם אחראים ליצירת מכונות של מאגר Harbor, פנו לאדמין של הפרויקט ב-IAM ובקשו ממנו להקצות לכם את התפקיד אדמין של מכונות Harbor (harbor-instance-admin). התפקיד הזה מאפשר לכם לקבל, להציג, לעקוב, ליצור, לעדכן, לתקן ולמחוק מכונות של Harbor, מאגרי גיבויים, תוכניות גיבוי, גיבויים ושחזורים במרחב השמות של הפרויקט. התפקיד הזה כולל את ההרשאות שנדרשות כדי להקצות מכונות חדשות של Harbor.
יצירת מכונה של מרשם Harbor
יוצרים מכונה של מאגר Harbor במסוף GDC או ב-gdcloud CLI.
המסוף
במסוף GDC, פועלים לפי השלבים הבאים:
- בתפריט הניווט, בקטע CI/CD, לוחצים על Harbor Container Registry.
- לוחצים על Create Instance.
- בשדה Instance name, נותנים שם למכונה.
- אופציונלי: בקטע Projects, כדי ליצור פרויקט ברירת מחדל למכונה הזו של Harbor, מעבירים את המתג Create a default project when creating this instance למצב מופעל, ואז מבצעים את הפעולות הבאות:
- בשדה Project Name, מזינים שם לפרויקט.
- קוראים את התנאים וההגבלות של Harbor המנוהל, ואם מסכימים לתנאים, מסמנים את התיבה.
- לוחצים על יצירה. הסטטוס הוא In progress, והשם הוא קישור חיצוני שמכיל את השם של המכונה החדשה של Harbor.
- אחרי שיוצרים את המכונה ובשדה Status מופיע הערך Ready, לוחצים על הקישור החיצוני בדף כדי להיכנס לממשק המשתמש באינטרנט של המכונה של Harbor.
gdcloud
יוצרים את המכונה של המרשם של Harbor:
gdcloud harbor instances create INSTANCE \
--project=PROJECT
מחליפים את מה שכתוב בשדות הבאים:
-
INSTANCE: השם של המכונה -
PROJECT: השם של הפרויקט ב-GDC שבו רוצים ליצור את המכונה
אמינות של צומת אשכול למכונות של מרשם Harbor
כשהמופע של מרשם Harbor מוכן, GDC מגדיר באופן אוטומטי את הצמתים של אשכולות Kubernetes משותפים ורגילים בארגון, כך שהם יתנו אמון באישור ה-TLS של המופע, שמונפק על ידי רשות אישורי הבסיס (CA) המהימנה של הארגון. כדי לשלוף קובצי אימג' מהמכונה, לא צריך להתקין את ה-CA הבסיסי או לשנות את הגדרת זמן הריצה של הקונטיינר בצומתי האשכול.
ההגדרה האוטומטית פועלת באופן הבא:
- תזמון עדכון הצומת: GDC מוסיף את המכונה להגדרת המרשם הפרטי של כל אשכול, ואז מעדכן כל צומת באשכול. צומת יכול לשלוף תמונות מהמכונה רק אחרי שהעדכון מסתיים בצומת הזה. העדכון בכל הצמתים יכול להימשך עד 60 דקות.
- אשכולות חדשים ואשכולות באזורים שונים: GDC גם מגדיר אשכולות שאתם יוצרים אחרי שהמכונה מוכנה, ואשכולות באזורים אחרים של הארגון.
- שם מארח מהימן: הצמתים סומכים רק על שם המארח של המכונה, שהוא כתובת ה-URL של המכונה בלי הקידומת
https://, למשלharbor-1-my-project.org-1.zone1.google.gdc.test. כתובת ה-URL של המכונה מופיעה בקישור למכונה במסוף GDC או בשדהstatus.urlבפלט של הפקודהgdcloud harbor instances describe. משתמשים בשם המארח של המכונה בהפניות לאימג', למשלINSTANCE_HOSTNAME/HARBOR_PROJECT/IMAGE:TAG, כאשרHARBOR_PROJECTהוא הפרויקט ב-Harbor שבו מאוחסן האימג'. - לקוח Docker של תחנת עבודה: אמון אוטומטי חל רק על צומתי אשכול. כדי לדחוף או למשוך קובצי אימג' באמצעות Docker מתחנת העבודה, צריך להגדיר את לקוח Docker המקומי כך שיסמוך על ה-CA ברמה הבסיסית (root). למידע נוסף, קראו את המאמר הגדרת Docker כך שיאשר את ה-CA הבסיסי של Harbor.
אם צומתי האשכול לא נותנים אמון במכונה, עיינו במאמר פתרון בעיות שקשורות לשגיאות באישור כששולפים קובצי אימג'.
פתרון שגיאות שקשורות לאישורים כששולפים קובצי אימג'
אם צומתי האשכול לא נותנים אמון באישור של שם המארח בהפניה לתמונה, Pods לא יכולים לשלוף את התמונה. הפודים מציגים את הסטטוס ErrImagePull או ImagePullBackOff, ובאירועי הפודים מוצגת שגיאה שדומה לזו:
failed to pull and unpack image "INSTANCE_HOSTNAME/HARBOR_PROJECT/IMAGE:TAG": ... x509: certificate signed by unknown authority
כדי לפתור שגיאות שקשורות לאישורים, צריך:
- התפקיד צפייה במכונות של Harbor (
harbor-instance-viewer) או אדמין של מכונות Harbor (harbor-instance-admin) בפרויקט GDC שמכיל את המכונה. - תפקיד שמאפשר לראות אירועי pod ולמחוק pod באשכול הרלוונטי:
- באשכול משותף, התפקיד אדמין של מרחב שמות (
namespace-admin) במרחב השמות של הפרויקט של עומס העבודה. - באשכול רגיל, התפקיד מפתח אשכול (
cluster-developer) בפרויקט שמכיל את האשכול.
- באשכול משותף, התפקיד אדמין של מרחב שמות (
- קובץ kubeconfig של אשכול Kubernetes הרלוונטי:
- לאשכול משותף, ראו כניסה.
- לאשכול רגיל, ראו ניהול הגישה לאשכולות רגילים.
כדי לפתור את הבעיה:
מציגים את האירועים של ה-Pod ואת הצומת שמריץ את ה-Pod:
kubectl --kubeconfig CLUSTER_KUBECONFIG \ -n NAMESPACE describe pod POD_NAMEמחליפים את מה שכתוב בשדות הבאים:
-
CLUSTER_KUBECONFIG: הנתיב לקובץ kubeconfig של אשכול Kubernetes הרלוונטי. -
NAMESPACE: מרחב השמות של ה-Pod. באשכול משותף, זהו מרחב שמות של פרויקט. -
POD_NAME: שם ה-Pod.
בפלט, השדה
Nodeמציג את הצומת שמריץ את ה-pod, והקטעEventsמציג את הודעת השגיאה ואת ההפניה לתמונה.-
מוודאים שהמכונה מוכנה ואין בה קודי שגיאה:
- במסוף GDC, מוודאים שבשדה Status של המכונה מופיע הערך Ready. גם אם הסטטוס הוא Ready, צריך להשתמש ב-gdcloud CLI כדי לבדוק אם יש קודי שגיאה.
משתמשים ב-gdcloud CLI כדי לבדוק את סטטוס המכונה ואת קודי השגיאה:
gdcloud harbor instances describe INSTANCE \ --project=PROJECTמחליפים את מה שכתוב בשדות הבאים:
-
INSTANCE: השם של מכונת המרשם של Harbor. -
PROJECT: השם של הפרויקט ב-GDC שמכיל את המכונה.
בפלט, מוודאים שהתנאי עם
type: Readyברשימהstatus.conditionsהואstatus: "True". הפלט אמור להיראות כך:# Several lines of code are omitted here. status: conditions: - message: HarborInstance reconciled reason: Reconciled status: "True" type: Ready # Several lines of code are omitted here. url: https://harbor-1-my-project.org-1.zone1.google.gdc.test-
אם הסטטוס נשאר In progress או שמופיע Unknown או Error, או שהתנאי
Readyלא מכיל אתstatus: "True", פנו למפעיל התשתית (IO). אם הקטעstatusבפלט שלgdcloud harbor instances describeמכיל שדהerrorStatusעם קודי שגיאה, כמוHAAS0008, פנו למנהל ה-IO גם אם התנאי שלReadyהואTrue. ציינו את קודי השגיאה וההודעות.מוודאים שההפניה לתמונה בעומס העבודה משתמשת בשם המארח של המכונה בדיוק כמו שהוא מופיע בכתובת ה-URL של המכונה, בלי הקידומת
https://. הצמתים לא נותנים אמון בשמות אחרים של המכונה, כמו כתובת IP. אם ההפניה לתמונה משתמשת בשם אחר, צריך לעדכן את ההפניה כך שתשתמש בשם המארח של המכונה, ואז לפרוס מחדש את עומס העבודה.אם עברו פחות מ-60 דקות מאז שהמכונה הציגה את הסטטוס Ready או מאז שיצרתם את האשכול (המאוחר מביניהם), המתינו עד ש-GDC יסיים לעדכן את צומתי האשכול:
- עדכוני צמתים חלקיים: אם משיכות התמונות מצליחות בחלק מהצמתים ונכשלות באחרים, העדכון עדיין בתהליך.
- גיבויים ושחזורים: עדכוני הצמתים ממתינים בזמן שמתבצע גיבוי או שחזור של המכונה. פרק הזמן של 60 הדקות מתחיל אחרי שהגיבוי או השחזור מסתיימים.
- אשכולות חדשים או אשכולות באזורים שונים: באשכולות שנוצרו אחרי שהמכונה מוכנה, ובאשכולות שנמצאים באזור שונה מהמכונה, הסטטוס Ready של המכונה לא מראה אם צומתי האשכול מעודכנים.
אחרי שהצומת מתעדכן, מוודאים שעומס העבודה יכול לשלוף את קובץ האימג'. Kubernetes מנסה שוב באופן אוטומטי לשלוף תמונות שנכשלו. כדי לנסות שוב מיד, מוחקים את ה-pod שנכשל כדי שהבקר שלו, כמו
Deployment, ייצור אותו מחדש:kubectl --kubeconfig CLUSTER_KUBECONFIG \ -n NAMESPACE delete pod POD_NAMEאם אין בקר שמנהל את ה-Pod, צריך ליצור אותו מחדש. כדי לוודא שהבעיה נפתרה, בודקים שה-pod החדש מציג את הסטטוס
RunningבמקוםErrImagePullאוImagePullBackOff:kubectl --kubeconfig CLUSTER_KUBECONFIG \ -n NAMESPACE get podsאם השגיאה נמשכת יותר מ-60 דקות אחרי שהמכונה הציגה את הסטטוס Ready או אחרי שיצרתם את האשכול (המאוחר מביניהם), פנו ל-IO. ממלאים את הפרטים הבאים:
- הארגון והאזור של המכונה ושל האשכול המושפע
- שם המכונה והפרויקט ב-GDC שמכיל את המכונה
- השם של אשכול Kubernetes המושפע, אם מדובר באשכול משותף או רגיל, ובאשכול רגיל – הפרויקט שמכיל את האשכול.
- ההפניה המלאה לתמונה והודעת השגיאה המלאה מאירועי ה-pod
- שמות הצמתים שבהם שליפת התמונות נכשלה, והאם שליפת התמונות הצליחה בצמתים אחרים
- מתי המכונה הציגה את הסטטוס Ready, מתי יצרתם את האשכול ואם גיבוי או שחזור של המכונה היו בתהליך.
- הקטע
statusבפלט שלgdcloud harbor instances describe, כולל קודי שגיאה שלerrorStatus
המאמרים הבאים
אחרי שהמכונה של מאגר Harbor מוכנה, אתם יכולים ליצור פרויקטים לאירוח של אוספי האימג'ים או לנהל את המכונות הקיימות: