從叢集推送及提取容器映像檔

系統構件位於機構基礎架構叢集的 Artifact Registry 中。平台管理員 (PA) 在 Google Distributed Cloud (GDC) 氣隙裝置中建立機構時,所有系統構件都會從機構基礎架構叢集複製。

基礎架構操作人員 (IO) 必須將新的系統構件推送至機構基礎架構叢集。只有在 PA 要求啟用選用功能,或是系統顯示可透過修補新構件修正的錯誤或中斷時,才會推送新的系統構件。

事前準備

如要取得權限,以管理員身分存取系統 Artifact Registry 專案中的資源,請要求安全管理員根據您要推送容器映像檔的叢集,授予下列角色。

取得必要權限後,請完成下列步驟,再將映像檔推送至基礎架構叢集的系統 Artifact Registry:

  1. 按照「gdcloud 指令列介面 (CLI)」的說明,下載並安裝 Distributed Cloud CLI。

  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 必須提供專案和 bucket 名稱等詳細資料。

身為 IO,您需要權限才能從儲存空間 bucket 下載容器映像檔:

  • 請要求安全管理員在專案的命名空間中,授予您專案 Bucket 物件檢視者 (project-bucket-object-viewer) 角色。

詳情請參閱 IAM R0005 runbook。

您將取得專案內值區和該值區中物件的唯讀存取權。

取得必要權限後,請按照下列步驟,從 PA 專案命名空間的儲存空間 bucket 下載容器映像檔:

  1. 請 PA 提供 bucket 的密鑰名稱。密鑰名稱如下所示:

    object-storage-key-std-user-ID
    

    密鑰名稱包含存取 bucket 的專屬 ID 值。

  2. 複製 bucket 的密鑰名稱。

  3. 取得 bucket 存取憑證,並設定 gdcloud CLI:

    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:儲存容器映像檔的儲存空間值區名稱。PA 會提供這個名稱。
    • CONTAINER_IMAGE_NAME:要從儲存空間 bucket 下載的容器映像檔名稱。

將映像檔推送至系統 Artifact Registry

請按照下列步驟,將工作站中的容器映像檔推送至 Management API 伺服器中的系統 Artifact Registry:

  1. 開啟控制台。

  2. 取得要推送容器映像檔的叢集系統 Artifact Registry 端點路徑:

    export REGISTRY_ENDPOINT=harbor.$(kubectl get configmap dnssuffix -n gpc-system -o jsonpath='{.data.dnsSuffix}')
    
  3. 將容器映像檔載入、加上標記,然後推送至叢集的系統 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 系統會自動與系統構件登錄檔 (SAR) 互動,從 Harbor 提取最新構件。在某些極端情況下,您可能需要手動執行這項作業。請按照下列步驟,從 Harbor 手動提取構件映像檔:

  1. 為每個應用程式設定您定義的構件詳細資料:

    APP_NAME=APP
    HARBOR_PROJECT=HARBOR_PROJECT_NAME
    REPOSITORY=REPOSITORY
    

    更改下列內容:

    • APP:應用程式名稱。
    • HARBOR_PROJECT_NAME:Harbor 專案名稱。
    • REPOSITORY:存放區的名稱。
  2. 取得 Harbor 資訊:

    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。請使用下列任一方法解決這個錯誤:

    • 暫時修正:在 gdcloud artifacts pull 指令中新增 --insecure 標記。
    • 可靠的修正方式:信任機構基礎架構 CA。詳情請參閱映像檔提取錯誤
  • 您可能需要解壓縮內容:

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