系統構件位於機構基礎架構叢集的 Artifact Registry 中。平台管理員 (PA) 在 Google Distributed Cloud (GDC) 氣隙裝置中建立機構時,所有系統構件都會從機構基礎架構叢集複製。
基礎架構操作人員 (IO) 必須將新的系統構件推送至機構基礎架構叢集。只有在 PA 要求啟用選用功能,或是系統顯示可透過修補新構件修正的錯誤或中斷時,才會推送新的系統構件。
事前準備
如要取得權限,以管理員身分存取系統 Artifact Registry 專案中的資源,請要求安全管理員根據您要推送容器映像檔的叢集,授予下列角色。
取得必要權限後,請完成下列步驟,再將映像檔推送至基礎架構叢集的系統 Artifact Registry:
按照「gdcloud 指令列介面 (CLI)」的說明,下載並安裝 Distributed Cloud CLI。
按照「安裝元件」的指示安裝
docker-credential-gdcloud
元件:gdcloud components install docker-credential-gdcloud
-
gdcloud auth login
匯出 kubeconfig 檔案:
gdcloud clusters get-credentials CLUSTER_NAME
將
CLUSTER_NAME
替換為叢集名稱。設定 Docker:
gdcloud auth configure-docker
從儲存空間值區下載容器映像檔
當 PA 要求從儲存空間值區下載映像檔,並將映像檔上傳至系統 Artifact Registry 時,請按照本節的指示操作。PA 必須提供專案和 bucket 名稱等詳細資料。
身為 IO,您需要權限才能從儲存空間 bucket 下載容器映像檔:
- 請要求安全管理員在專案的命名空間中,授予您專案 Bucket 物件檢視者 (
project-bucket-object-viewer
) 角色。
詳情請參閱 IAM R0005 runbook。
您將取得專案內值區和該值區中物件的唯讀存取權。
取得必要權限後,請按照下列步驟,從 PA 專案命名空間的儲存空間 bucket 下載容器映像檔:
請 PA 提供 bucket 的密鑰名稱。密鑰名稱如下所示:
object-storage-key-std-user-ID
密鑰名稱包含存取 bucket 的專屬
ID
值。複製 bucket 的密鑰名稱。
取得 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
換成您在上一步複製的值。將容器映像檔從儲存空間值區下載至工作站:
gdcloud cp s3://BUCKET_NAME/g/CONTAINER_IMAGE_NAME
更改下列內容:
BUCKET_NAME
:儲存容器映像檔的儲存空間值區名稱。PA 會提供這個名稱。CONTAINER_IMAGE_NAME
:要從儲存空間 bucket 下載的容器映像檔名稱。
將映像檔推送至系統 Artifact Registry
請按照下列步驟,將工作站中的容器映像檔推送至 Management API 伺服器中的系統 Artifact Registry:
開啟控制台。
取得要推送容器映像檔的叢集系統 Artifact Registry 端點路徑:
export REGISTRY_ENDPOINT=harbor.$(kubectl get configmap dnssuffix -n gpc-system -o jsonpath='{.data.dnsSuffix}')
將容器映像檔載入、加上標記,然後推送至叢集的系統 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 手動提取構件映像檔:
為每個應用程式設定您定義的構件詳細資料:
APP_NAME=APP HARBOR_PROJECT=HARBOR_PROJECT_NAME REPOSITORY=REPOSITORY
更改下列內容:
APP
:應用程式名稱。HARBOR_PROJECT_NAME
:Harbor 專案名稱。REPOSITORY
:存放區的名稱。
取得 Harbor 資訊:
HARBOR_URL=$(kubectl --kubeconfig=${ADMIN_KUBECONFIG} get harborcluster harbor -n harbor-system -o=jsonpath='{.spec.externalURL}') HARBOR_IP=${HARBOR_URL#https://}
取得構件標記。您可以透過兩種方式擷取代碼:
方法一:這是建議做法:
- 列出本機套件中的構件,並取得對應的標記:
TAG=$(gdcloud artifacts tree ${BUNDLE_SUB_FOLDER:?} | grep ${HARBOR_PROJECT:?}/${REPOSITORY:?} | cut -d ":" -f2 | grep -v '.sig')
方法二:只有在方法一無法正常運作時,才使用這個方法:
列出 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>" }
匯出最近更新時間的標記值:
TAG=MOST_RECENT_TAG
請將
MOST_RECENT_TAG
換成更新時間最近的標記。
從 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