העברה של תמונות קונטיינר אל אשכול וממנו

חפצי מערכת קיימים ב-Artifact Registry של אשכול התשתית הארגונית. כשמנהל פלטפורמה (PA) יוצר ארגון במכשיר עם פער אבטחה ב-Google Distributed Cloud ‏ (GDC), כל הארטיפקטים של המערכת משוכפלים מאשכול התשתית של הארגון.

מפעיל התשתית (IO) צריך לדחוף ארטיפקטים חדשים של המערכת לאשכול התשתית של הארגון. העברת ארטיפקטים חדשים של המערכת מתבצעת רק כשה-PA מבקש להפעיל תכונות אופציונליות, או כשהמערכת מציגה באגים או הפסקות שניתן לתקן באמצעות תיקון ארטיפקטים חדשים.

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

כדי לקבל את ההרשאות שדרושות לגישה למשאבים בפרויקטים של מערכת Artifact Registry כאדמין, צריך לבקש מ-Security Admin להקצות לכם את התפקידים הבאים, בהתאם לאשכול שאליו רוצים לדחוף את קובץ האימג' של הקונטיינר.

אחרי שמקבלים את ההרשאות הנדרשות, צריך לבצע את השלבים הבאים לפני שמעלים תמונה למערכת Artifact Registry של אשכול התשתית:

  1. מורידים ומתקינים את Distributed Cloud CLI לפי ההוראות במאמר ממשק שורת הפקודה (CLI) של gdcloud.

  2. מתקינים את הרכיב docker-credential-gdcloud לפי ההוראות שבמאמר התקנת רכיבים:

    gdcloud components install docker-credential-gdcloud
    
  3. כניסה באמצעות ספק הזהויות שהוגדר:

    gdcloud auth login
    
  4. מייצאים את קובץ ה-kubeconfig:

    gdcloud clusters get-credentials CLUSTER_NAME
    

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

  5. מגדירים את Docker:

    gdcloud auth configure-docker
    

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

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

כדי להוריד את קובץ אימג' של קונטיינר מקטגוריית האחסון, צריך הרשאות:

  • מבקשים מאדמין האבטחה להקצות לכם את התפקיד Project Bucket Object Viewer (project-bucket-object-viewer) במרחב השמות של הפרויקט.

פרטים נוספים מופיעים ב-runbook IAM R0005.

אתם מקבלים הרשאת קריאה בלבד לקטגוריה בפרויקט ולאובייקטים שכלולים בה.

אחרי שמקבלים את ההרשאות הנדרשות, פועלים לפי השלבים הבאים כדי להוריד את קובץ האימג' של קונטיינר ממאגר האחסון של מרחב השמות של פרויקט PA:

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

    object-storage-key-std-user-ID
    

    שם הסוד כולל ערך ייחודי ID לגישה לקטגוריה.

  2. מעתיקים את השם הסודי של הקטגוריה.

  3. מקבלים פרטי כניסה לגישה לדלי ומגדירים את ה-CLI של gcloud:

    SECRET_NAME=SECRET_NAME ACCESS_KEY=$(kubectl get secret ${SECRET_NAME} -n object-storage-access-keys -o=jsonpath='{.data.access-key-id}' | base64 -d)
    SECRET_KEY=$(kubectl get secret ${SECRET_NAME} -n object-storage-access-keys -o=jsonpath='{.data.secret-access-key}' | base64 -d)
    S3_ENDPOINT=objectstorage.$(kubectl get configmap dnssuffix -n gpc-system -o jsonpath='{.data.dnsSuffix}')
    
    echo "Access Key: ${ACCESS_KEY}" \
    && echo "Secret Key: ${SECRET_KEY}" \
    && echo "S3 Endpoint: ${S3_ENDPOINT}"
    
    gdcloud config set storage/s3_access_key_id ${ACCESS_KEY}
    gdcloud config set storage/s3_secret_access_key ${SECRET_KEY}
    gdcloud config set storage/s3_endpoint ${S3_ENDPOINT}
    

    מחליפים את SECRET_NAME בערך שהעתקתם בשלב הקודם.

  4. מורידים את קובץ האימג' של הקונטיינר מקטגוריית האחסון לתחנת העבודה:

    gdcloud cp s3://BUCKET_NAME/g/CONTAINER_IMAGE_NAME
    

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

    • ‫BUCKET_NAME: השם של קטגוריית האחסון שכוללת את קובץ אימג' של קונטיינר. השם הזה מסופק על ידי הרשות הפלסטינית.
    • ‫CONTAINER_IMAGE_NAME: השם של קובץ אימג' של קונטיינר שרוצים להוריד ממאגר האחסון.

העברת התמונה ל-Artifact Registry של המערכת

כדי לדחוף את קובץ האימג' של קונטיינר שנמצא בתחנת העבודה שלכם למערכת Artifact Registry בשרת Management API, פועלים לפי השלבים הבאים:

  1. פותחים את המסוף.

  2. מקבלים את הנתיב לנקודת הקצה של System Artifact Registry של האשכול שאליו רוצים לדחוף את קובץ אימג' של קונטיינר:

    export REGISTRY_ENDPOINT=harbor.$(kubectl get configmap dnssuffix -n gpc-system -o jsonpath='{.data.dnsSuffix}')
    
  3. טוענים את קובץ האימג' של הקונטיינר, מתייגים אותו ומעבירים אותו בדחיפה לנקודת הקצה של System Artifact Registry באשכול:

    docker load --input CONTAINER_IMAGE_PATH
    
    docker tag CONTAINER_IMAGE_PATH ${REGISTRY_ENDPOINT}/CONTAINER_IMAGE_PATH
    
    docker push ${REGISTRY_ENDPOINT}/CONTAINER_IMAGE_PATH
    

    מחליפים את CONTAINER_IMAGE_PATH בנתיב של קובץ אימג' של קונטיינר במערכת הקבצים המקומית. ערך תקין לנתיב הזה הוא, לדוגמה, oracle_db.tar.

שליפת ארטיפקט של Harbor

ברוב המקרים, מערכת ה-GDC מתקשרת עם Artifact Registry של המערכת (SAR) באופן אוטומטי כדי לשלוף את הפריט העדכני ביותר מ-Harbor. במקרים מסוימים, יכול להיות שתצטרכו לבצע את הפעולה הזו באופן ידני. כדי לשלוף באופן ידני את תמונת הארטיפקט מ-Harbor:

  1. מגדירים את פרטי הארטיפקט שמוגדרים לפי כל אפליקציה:

    APP_NAME=APP
    HARBOR_PROJECT=HARBOR_PROJECT_NAME
    REPOSITORY=REPOSITORY
    

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

    • ‫APP: שם האפליקציה.
    • ‫HARBOR_PROJECT_NAME: שם הפרויקט ב-Harbor.
    • ‫REPOSITORY: שם המאגר.
  2. קבלת מידע על הנמל:

    HARBOR_URL=$(kubectl --kubeconfig=${ADMIN_KUBECONFIG} get harborcluster harbor -n harbor-system -o=jsonpath='{.spec.externalURL}')
    HARBOR_IP=${HARBOR_URL#https://}
    
  3. מקבלים את תג הפריט. יש שתי שיטות לאחזור התג:

    • שיטה ראשונה: זו האפשרות המועדפת:

      1. כדי להציג את הארטיפקטים בחבילה המקומית ולקבל את התג המתאים:
      TAG=$(gdcloud artifacts tree ${BUNDLE_SUB_FOLDER:?} | grep ${HARBOR_PROJECT:?}/${REPOSITORY:?} | cut -d ":" -f2 | grep -v '.sig')
      
    • שיטה שנייה: משתמשים בשיטה הזו רק אם השיטה הראשונה לא פועלת כמצופה:

      1. מציגים את התגים ב-Harbor ובוחרים את התג האחרון:

          ADMIN_PASS=$(kubectl --kubeconfig=${ADMIN_KUBECONFIG} -n harbor-system get secret harbor-admin -o jsonpath="{.data.secret}" | base64 -d)
        
          curl -k -X GET \
            --header 'Accept: application/json' \
            --header "authorization: Basic $(echo -n admin:${ADMIN_PASS:?} | base64)" \
          "${HARBOR_URL}/api/v2.0/projects/${HARBOR_PROJECT:?}/repositories/${REPOSITORY:?}/artifacts?with_tag=true" | jq -r '.[] | select(.tags != null) | .tags[] | {tag: .name, updated:.push_time}'
        

        הפלט שלכם צריך להיות דומה לדוגמה הבאה:

        {
          "tag": "<tag1>",
          "updated": "<date1>"
        }
        {
          "tag": "<tag2>",
          "updated": "<date2>"
        }
        
      2. ייצוא הערך של התג עם זמן העדכון האחרון:

        TAG=MOST_RECENT_TAG
        

        מחליפים את MOST_RECENT_TAG בתג עם מועד העדכון האחרון.

  4. מורידים את הארטיפקטים מ-Harbor:

    gdcloud artifacts pull --single-manifest-repo \
    ${HARBOR_IP:?}/${HARBOR_PROJECT:?}/${REPOSITORY:?}:${TAG:?} \
    ${APP_NAME:?}-${TAG:?}
    

    אם הודעת השגיאה הבאה מופיעה, אפשר להתעלם ממנה:

    tee: '/root/logs/artifacts_pull_--single-manifest-repo_2023.07.13:14.59.24.log': Permission denied
    

בעיות מוכרות

יש כמה בעיות מוכרות שקשורות לשליפת ארטיפקט של Harbor:

  • יכול להיות שתצטרכו להוסיף את הארגומנט: --kubeconfig ${INFRA_ORG_KUBECONFIG:?}.
  • יכול להיות שהפקודה curl תציג את הודעת השגיאה הבאה: certificate signed by unknown authority. כדי לפתור את השגיאה הזו, אפשר להשתמש באחת מהשיטות הבאות:

    • פתרון זמני: מוסיפים את הדגל --insecure לפקודה gdcloud artifacts pull.
    • תיקון אמין: צריך להוסיף את רשות האישורים של התשתית הארגונית לרשימת רשויות האישורים המהימנות. מידע נוסף זמין במאמר בנושא שגיאה בשליפת תמונה.
  • יכול להיות שתצטרכו לחלץ את התוכן:

    gdcloud artifacts extract ${APP_NAME:?}-${TAG:?} ${APP_NAME:?}-${TAG:?}-extracted