从 Artifact Registry 同步 OCI 工件

本页面介绍如何从 Artifact Registry 同步 OCI 工件。

您可以使用 Artifact Registry 将 Config Sync 配置为从 OCI 映像同步。如需使用此功能,您必须启用 RootSync API 和 RepoSync API

由于 Artifact Registry 是一项全代管式服务,同时支持容器映像和非容器工件,因此我们建议您使用该服务来存储和管理 Google Cloud 上的容器映像。您可以通过多种工具将工件推送到 Artifact Registry。例如,您可以推送 Docker 映像推送 Helm 图表,或使用 go-containerregistry 库来处理容器注册表。请选择最适合您的工具。本页面介绍了如何使用 craneoras 创建映像并将其发布到 Artifact Registry 中的代码库。

创建 Artifact Registry 代码库

在本部分中,您将创建一个 Artifact Registry 代码库。如需详细了解如何创建 Artifact Registry 代码库,请参阅创建代码库

  1. 启用 Artifact Registry API:

    gcloud services enable artifactregistry.googleapis.com --project=PROJECT_ID
    
  2. 创建 Artifact Registry 代码库:

    gcloud artifacts repositories create AR_REPO_NAME \
       --repository-format=docker \
       --location=AR_REGION \
       --description="Config Sync Helm repo" \
       --project=PROJECT_ID
    

替换以下内容:

  • PROJECT_ID:组织的项目 ID。
  • AR_REPO_NAME:代码库的 ID。
  • AR_REGION:代码库的单区域或多区域位置。

以下部分中使用的变量:

  • FLEET_HOST_PROJECT_ID:如果您使用的是 GKE Workload Identity,则它与 PROJECT_ID 相同。如果您使用的是舰队 Workload Identity,则这是集群注册到的舰队的项目 ID。
  • GSA_NAME:您要用于连接到 Artifact Registry 的自定义 Google 服务帐号的名称。
  • KSA_NAME:协调器的 Kubernetes 服务账号。
    • 对于根代码库,如果 RootSync 名称为 root-sync,请添加 root-reconciler。否则,请添加 root-reconciler-ROOT_SYNC_NAME
    • 对于命名空间代码库,如果 RepoSync 名称为 repo-sync,请添加 ns-reconciler-NAMESPACE。否则,请添加 ns-reconciler-NAMESPACE-REPO_SYNC_NAME-REPO_SYNC_NAME_LENGTH,其中 REPO_SYNC_NAME_LENGTHREPO_SYNC_NAME 中的字符数。

授予读取者权限

如果集群上的 Config Sync 版本为 1.17.2 或更高版本,您可以使用 Kubernetes 服务帐号向 Artifact Registry 进行身份验证。否则,请使用 Google 服务帐号进行身份验证。

使用 Kubernetes 服务帐号

向带有 Workload Identity 池的 Kubernetes 服务帐号授予 Artifact Registry Reader (roles/artifactregistry.reader) IAM 角色:

gcloud artifacts repositories add-iam-policy-binding AR_REPO_NAME \
   --location=AR_REGION \
   --member="serviceAccount:FLEET_HOST_PROJECT_ID.svc.id.goog[config-management-system/KSA_NAME]" \
   --role=roles/artifactregistry.reader \
   --project=PROJECT_ID

使用 Google 服务帐号

  1. 向 Google 服务账号授予 Artifact Registry Reader (roles/artifactregistry.reader) IAM 角色:

    gcloud artifacts repositories add-iam-policy-binding AR_REPO_NAME \
       --location=AR_REGION \
       --member=serviceAccount:GSA_NAME@PROJECT_ID.iam.gserviceaccount.com \
       --role=roles/artifactregistry.reader \
       --project=PROJECT_ID
    
  2. 在 Kubernetes 服务帐号与 Google 服务帐号之间创建 IAM 政策绑定:

    gcloud iam service-accounts add-iam-policy-binding \
       --role roles/iam.workloadIdentityUser \
       --member "serviceAccount:FLEET_HOST_PROJECT_ID.svc.id.goog[config-management-system/KSA_NAME]" \
       GSA_NAME@PROJECT_ID.iam.gserviceaccount.com \
       --project=PROJECT_ID
    

将映像推送到 Artifact Registry 代码库

在本部分中,您将创建一个 OCI 映像并将其推送到 Artifact Registry。

  1. 创建 Namespace 清单文件:

    cat <<EOF> test-namespace.yaml
    apiVersion: v1
    kind: Namespace
    metadata:
      name: test
    EOF
    
  2. 登录 Artifact Registry:

    gcloud auth configure-docker AR_REGION-docker.pkg.dev
    
  3. 打包映像并将其推送到 Artifact Registry:

    crane

    本部分中的命令使用 crane 与远程映像和注册表进行交互。

    1. 封装文件:

      tar -cf test-namespace.tar test-namespace.yaml
      
    2. 安装 crane 工具。

    3. 将该映像推送到 Artifact Registry。

      crane append -f test-namespace.tar -t AR_REGION-docker.pkg.dev/PROJECT_ID/AR_REPO_NAME/test-namespace:v1
      

    oras

    本部分中的命令使用 oras 与远程映像和注册表进行交互。

    1. 封装文件:

      tar -czf test-namespace.tar.gz test-namespace.yaml
      
    2. 安装 oras 工具。

    3. 将该映像推送到 Artifact Registry。

      oras push AR_REGION-docker.pkg.dev/PROJECT_ID/AR_REPO_NAME/test-namespace:v1 test-namespace.tar.gz
      

将 Config Sync 配置为从映像同步

在本部分中,您将创建一个 RootSync 对象,并将 Config Sync 配置为从 OCI 映像同步。

  1. 创建一个具有唯一名称的 RootSync 对象:

    cat <<EOF>> ROOT_SYNC_NAME.yaml
    apiVersion: configsync.gke.io/v1beta1
    kind: RootSync
    metadata:
      name: ROOT_SYNC_NAME
      namespace: config-management-system
    spec:
      sourceFormat: unstructured
      sourceType: oci
      oci:
        image: AR_REGION-docker.pkg.dev/PROJECT_ID/AR_REPO_NAME/test-namespace:v1
        dir: .
        # The k8sserviceaccount auth type is available in version 1.17.2 and
        # later. Use `gcpserviceaccount` if using an older version.
        # auth: gcpserviceaccount
        # gcpServiceAccountEmail: GSA_NAME@PROJECT_ID.iam.gserviceaccount.com
        auth: k8sserviceaccount
    EOF
    

    ROOT_SYNC_NAME 替换为您的 RootSync 名称。 该名称在集群中必须是唯一的,并且不能超过 26 个字符。 如需查看配置 RootSync 对象时的完整选项列表,请参阅 RootSyncRepoSync 字段

  2. 应用 RootSync 对象:

    kubectl apply -f ROOT_SYNC_NAME.yaml
    
  3. 验证 Config Sync 是否正在从映像同步:

    nomos status --contexts=$(kubectl config current-context)
    

    您应该会看到类似于以下示例的输出:

    Connecting to clusters...
    
    *publish-config-registry
       --------------------
       <root>:root-sync-test   AR_REGION-docker.pkg.dev/PROJECT_ID/AR_REPO_NAME/test-namespace:v1
       SYNCED                  05e6a6b77de7a62286387cfea833d45290105fe84383224938d7b3ab151a55a1
       Managed resources:
          NAMESPACE   NAME             STATUS    SOURCEHASH
                      namespace/test   Current   05e6a6b
    

    您现在已成功将映像同步到您的集群。

后续步骤