系统制品存在于组织基础架构集群的 Artifact Registry 中。当平台管理员 (PA) 在 Google Distributed Cloud (GDC) 气隙设备中创建组织时,所有系统制品都会从组织基础架构集群复制。
基础设施运营商 (IO) 必须将新的系统制品推送到组织基础设施集群。仅当 PA 请求启用可选功能时,或者当系统显示可通过修补新制品来修复的 bug 或中断时,才会推送新的系统制品。
准备工作
如需获得以管理员身份访问系统 Artifact Registry 项目中资源所需的权限,请让您的 Security Admin 为您授予以下角色,具体取决于您要将容器映像推送到哪个集群。
获得必要的权限后,请在将映像推送到基础架构集群的系统 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 必须提供项目名称和存储桶名称等详细信息。
作为 IO,您需要拥有从存储桶下载容器映像的权限:
- 请让您的 Security Admin 在项目的命名空间中授予您 Project Bucket Object Viewer (
project-bucket-object-viewer
) 角色。
如需了解详情,请参阅 IAM R0005 运行手册。
您将获得对项目内存储桶和该存储桶中对象的只读权限。
获得必要的权限后,请按照以下步骤从 PA 项目命名空间的存储桶中下载容器映像:
向 PA 询问相应存储桶的 Secret 名称。密钥名称类似于以下示例:
object-storage-key-std-user-ID
Secret 名称包含用于访问相应分桶的唯一
ID
值。复制相应存储桶的 Secret 名称。
获取存储桶访问凭据并配置 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
:您要从存储桶下载的容器映像文件的名称。
将映像推送到系统 Artifact Registry
请按以下步骤操作,将工作站中的容器映像文件推送到管理 API 服务器中的系统 Artifact Registry:
打开控制台。
获取要将容器映像推送到的集群的系统 Artifact Registry 端点的路径:
export REGISTRY_ENDPOINT=harbor.$(kubectl get configmap dnssuffix -n gpc-system -o jsonpath='{.data.dnsSuffix}')
将容器映像加载、标记并推送到集群的系统制品注册表端点:
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
。请使用以下方法之一来缓解此错误:- 临时解决方法:将
--insecure
标志添加到gdcloud artifacts pull
命令。 - 可靠的修复:信任组织基础架构 CA。如需了解详情,请参阅映像拉取错误。
- 临时解决方法:将
您可能需要提取内容:
gdcloud artifacts extract ${APP_NAME:?}-${TAG:?} ${APP_NAME:?}-${TAG:?}-extracted