从集群推送和拉取容器映像

系统制品存在于组织基础架构集群的 Artifact Registry 中。当平台管理员 (PA) 在 Google Distributed Cloud (GDC) 气隙设备中创建组织时,所有系统制品都会从组织基础架构集群复制。

基础设施运营商 (IO) 必须将新的系统制品推送到组织基础设施集群。仅当 PA 请求启用可选功能时,或者当系统显示可通过修补新制品来修复的 bug 或中断时,才会推送新的系统制品。

准备工作

如需获得以管理员身份访问系统 Artifact Registry 项目中资源所需的权限,请让您的 Security Admin 为您授予以下角色,具体取决于您要将容器映像推送到哪个集群。

获得必要的权限后,请在将映像推送到基础架构集群的系统 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 必须提供项目名称和存储桶名称等详细信息。

作为 IO,您需要拥有从存储桶下载容器映像的权限:

  • 请让您的 Security Admin 在项目的命名空间中授予您 Project Bucket Object Viewer (project-bucket-object-viewer) 角色。

如需了解详情,请参阅 IAM R0005 运行手册。

您将获得对项目内存储桶和该存储桶中对象的只读权限。

获得必要的权限后,请按照以下步骤从 PA 项目命名空间的存储桶中下载容器映像:

  1. 向 PA 询问相应存储桶的 Secret 名称。密钥名称类似于以下示例:

    object-storage-key-std-user-ID
    

    Secret 名称包含用于访问相应分桶的唯一 ID 值。

  2. 复制相应存储桶的 Secret 名称。

  3. 获取存储桶访问凭据并配置 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:您要从存储桶下载的容器映像文件的名称。

将映像推送到系统 Artifact Registry

请按以下步骤操作,将工作站中的容器映像文件推送到管理 API 服务器中的系统 Artifact Registry:

  1. 打开控制台。

  2. 获取要将容器映像推送到的集群的系统 Artifact Registry 端点的路径:

    export REGISTRY_ENDPOINT=harbor.$(kubectl get configmap dnssuffix -n gpc-system -o jsonpath='{.data.dnsSuffix}')
    
  3. 将容器映像加载、标记并推送到集群的系统制品注册表端点:

    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。请使用以下方法之一来缓解此错误:

    • 临时解决方法:将 --insecure 标志添加到 gdcloud artifacts pull 命令。
    • 可靠的修复:信任组织基础架构 CA。如需了解详情,请参阅映像拉取错误
  • 您可能需要提取内容:

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