本页面介绍如何从 Artifact Registry 同步 OCI 工件。
您可以使用 Artifact Registry 将 Config Sync 配置为从 OCI 映像同步。如需使用此功能,您必须启用 RootSync API 和 RepoSync API。
由于 Artifact Registry 是一项全代管式服务,同时支持容器映像和非容器工件,因此我们建议您使用该服务来存储和管理 Google Cloud 上的容器映像。您可以通过多种工具将工件推送到 Artifact Registry。例如,您可以推送 Docker 映像、推送 Helm 图表,或使用 go-containerregistry 库来处理容器注册表。请选择最适合您的工具。本页面介绍了如何使用 crane
和 oras
创建映像并将其发布到 Artifact Registry 中的制品库。
创建 Artifact Registry 代码库
在本部分中,您将创建一个 Artifact Registry 代码库。如需详细了解如何创建 Artifact Registry 代码库,请参阅创建代码库。
启用 Artifact Registry API:
gcloud services enable artifactregistry.googleapis.com --project=PROJECT_ID
创建 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,则此 ID 与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_LENGTH
是REPO_SYNC_NAME
中的字符数。
- 对于根代码库,如果
授予读取者权限
如果您的集群上的 Config Sync 版本为 1.17.2 或更高版本,则可以使用 Kubernetes 服务账号向 Artifact Registry 进行身份验证。否则,请使用 Google 服务账号进行身份验证。
使用 Kubernetes 服务账号
向使用工作负载身份池的 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 服务账号
向 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
在 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。
创建
Namespace
清单文件:cat <<EOF> test-namespace.yaml apiVersion: v1 kind: Namespace metadata: name: test EOF
登录 Artifact Registry:
gcloud auth configure-docker AR_REGION-docker.pkg.dev
打包映像并将其推送到 Artifact Registry:
crane
本部分中的命令使用
crane
与远程映像和注册表进行交互。封装文件:
tar -cf test-namespace.tar test-namespace.yaml
安装
crane
工具。将该映像推送到 Artifact Registry。
crane append -f test-namespace.tar -t AR_REGION-docker.pkg.dev/PROJECT_ID/AR_REPO_NAME/test-namespace:v1
oras
本部分中的命令使用
oras
与远程映像和注册表进行交互。封装文件:
tar -czf test-namespace.tar.gz test-namespace.yaml
安装
oras
工具。将该映像推送到 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 映像同步。
创建一个具有唯一名称的
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
对象时的完整选项列表,请参阅RootSync
和RepoSync
字段。应用
RootSync
对象:kubectl apply -f ROOT_SYNC_NAME.yaml
验证 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
您现在已成功将映像同步到您的集群。
后续步骤
- 详细了解如何安装 Config Sync。