使用 IAM 控制访问权限

本页面介绍了如何在 Artifact Registry 中使用 Identity and Access Management (IAM) 进行访问权限控制。

在实现 CI/CD 流水线时,Artifact Registry 的默认权限可以最大限度地减少设置工作量。您还可以将 Artifact Registry 与第三方 CI/CD 工具集成,并配置访问代码库所需的权限和身份验证。

如果您使用 Artifact Analysis 处理容器元数据(例如在映像中发现的漏洞),请参阅 Artifact Analysis 文档,了解如何授予查看或管理元数据的权限。

准备工作

  1. 启用 Artifact Registry,包括启用 API 和安装 Google Cloud CLI。
  2. 如果您要应用特定于代码库的权限,请为软件包创建 Artifact Registry 代码库

概览

IAM 权限角色决定了您是否能够在 Artifact Registry 代码库中创建、查看、修改或删除数据。

一个角色对应一组权限。您不能直接向主账号授予权限,而是需要向主账号授予角色。为主账号授予一个角色就是授予该角色包含的所有权限。您可以为同一位主账号授予多个角色。

Google Cloud 默认权限

默认情况下,以下权限适用于与 Artifact Registry 属于同一项目的 Google Cloud CI/CD 服务:

如果您的所有服务都在同一个 Google Cloud 项目中,并且默认权限满足您的需求,那么您无需配置权限。

在以下情况下,您必须为这些服务配置 Artifact Registry 权限:

  • 您想使用这些服务访问另一个项目中的 Artifact Registry。在具有 Artifact Registry 的项目中,向每项服务的工作负载身份池或服务帐号授予所需的角色。如果要连接到 Cloud Run,请向 Cloud Run Service Agent 授予所需的角色。
  • 您使用的 GKE 版本不内置对从 Artifact Registry 中拉取映像的支持。如需了解配置说明,请参阅 GKE 部分。
  • 您希望默认服务账号拥有代码库的读写权限。如需了解详情,请参阅以下信息:
  • 您为运行时环境使用的是用户提供的服务帐号,而不是默认服务帐号。在包含 Artifact Registry 的项目中,向您的服务账号授予所需的角色。

第三方集成

对于第三方客户端,您必须同时配置权限和身份验证。

传统上,在 Google Cloud 外部运行的应用使用服务帐号密钥来访问 Google Cloud 资源。但是,服务帐号密钥是功能强大的凭据,如果管理不当,可能会带来安全风险。

借助 Workload Identity Federation,您可以使用 Identity and Access Management 向外部身份授予 IAM 角色,包括模拟服务帐号的功能。此方法可消除与服务帐号密钥相关的维护和安全负担。

使用 Workload Identity Federation

  1. 创建 Workload Identity 联合池
  2. 创建工作负载身份联合提供方
  3. 将适当的 Artifact Registry 角色授予工作负载身份池,以允许代码库访问。
  4. 配置第三方客户端以使用 Artifact Registry 进行身份验证。

使用服务帐号

  1. 创建一个服务账号代表您的应用执行操作,或选择一个现有服务账号进行持续集成/持续交付自动化。
  2. 向服务账号授予适当的 Artifact Registry 角色,以提供代码库访问权限。
  3. 配置第三方客户端以使用 Artifact Registry 进行身份验证。

Google Cloud 上的 GitLab

Google Cloud 上的 GitLab 集成使用 Workload Identity Federation 对 Google Cloud 上的 GitLab 工作负载进行授权和身份验证,而无需服务帐号或服务帐号密钥。如需详细了解如何在此合作伙伴关系中使用工作负载身份联合,请参阅身份验证概览

如需为 Google Cloud 上的 GitLab 设置 Workload Identity Federation 和必要的 IAM 角色,请参阅 GitLab 教程 Google Cloud Workload Identity Federation 和 IAM 政策

如需连接 Artifact Registry 代码库,请按照 GitLab 教程 Google Artifact Registry 进行操作。

角色与权限

每种 Artifact Registry API 方法都要求发出请求的主帐号(用户、群组或服务帐号)具有使用相应资源所需的权限。通过设置政策向主账号授予资源的预定义角色,可向主账号授予权限。

您可以在 Google Cloud 项目或 Artifact Registry 代码库中授予角色。

预定义的 Artifact Registry 角色

IAM 提供的预定义角色可授予对特定 Google Cloud 资源的访问权限,并防止对其他资源进行未经授权的访问。

对于 pkg.dev 网域中的标准代码库、虚拟代码库和远程代码库,使用以下预定义角色:

角色 说明
Artifact Registry 读取者
(roles/artifactregistry.reader)
查看和获取工件,查看代码库元数据。
Artifact Registry 写入者
(roles/artifactregistry.writer)
读取和写入工件。
Artifact Registry 代码库管理员
(roles/artifactregistry.repoAdmin)
读取、写入和删除工件。
Artifact Registry 管理员
(roles/artifactregistry.admin)
创建和管理代码库及工件。

以下其他预定义角色可提供创建 gcr.io 代码库来为 gcr.io 网域托管映像的权限。这些角色不具备在 Artifact Registry 中针对 pkg.dev 网域创建其他代码库格式的权限。这些角色支持与 Container Registry 的向后兼容性,因为 Container Registry 使用容器映像的首次推送来创建各个多区域注册表。

角色 说明
Artifact Registry Create-on-push 写入者 (roles/artifactregistry.createOnPushWriter) 读取和写入工件。创建 gcr.io 代码库。
Artifact Registry Create-on-push Repository Administrator (roles/artifactregistry.createOnPushRepoAdmin) 读取、写入和删除工件。创建 gcr.io 代码库。

如需查看每个角色中各项权限的完整列表,请参阅 Artifact Registry 角色。您还可以使用 gcloud iam roles describe 命令查看每个角色的权限列表。

基本 IAM 角色

基本 IAM 角色可为用户授予对所有 Google Cloud 资源的全局项目级别访问权限。尽可能使用预定义角色访问代码库,以便用户和服务帐号仅拥有所需的权限。

下表列出了在引入 IAM 之前已存在的基本角色,以及它们包含的 Artifact Registry IAM 角色:

角色 角色名称 包含的角色
roles/viewer Viewer roles/artifactregistry.reader
roles/editor Editor
  • roles/artifactregistry.writer
  • roles/artifactregistry.repoAdmin
roles/owner 所有者 roles/artifactregistry.admin

授予权限

如果项目中的所有代码库都应用相同的权限,请在项目级层授予权限。如果某些账号需要不同级层的访问权限,请在代码库级层授予角色。

如果您要授予对虚拟代码库的权限,这些权限适用于通过虚拟代码库提供的所有上游代码库,无论各个代码库权限如何。

如果您使用 gcloud 命令授予角色,则可以为主账号指定单个角色绑定,或使用政策文件定义多个绑定。

本页中的示例使用下面的参考政策模板。 参考政策文件以 policy.yaml 命名。该模板包含用户和服务帐号名称示例。请根据您的项目情况替换这些示例用户和服务帐号。

如需详细了解政策格式,请参阅 IAM 政策文档

bindings:

- members:
  - user: user@gmail.com
  role: roles/owner

- members:
  - serviceAccount: repo-readonly@iam.gserviceaccount.com
  - user: user2@gmail.com
  role: roles/artifactregistry.reader

- members:
  - serviceAccount: repo-write@iam.gserviceaccount.com
  role: roles/artifactregistry.writer

- members:
  - serviceAccount: repo-admin@iam.gserviceaccount.com
  role: roles/artifactregistry.repoAdmin

- members:
  - serviceAccount: ar-admin@iam.gserviceaccount.com
  role: roles/artifactregistry.admin

授予项目范围权限

如果项目中的所有代码库都应用相同的权限,请在项目级层授予角色。

如需将用户或服务帐号添加到项目并向其授予 Artifact Registry 角色,请执行以下操作:

控制台

  1. 在 Google Cloud 控制台中打开 IAM 页面。

    打开 IAM 页面

  2. 点击选择项目,选择 Artifact Registry 运行所在的项目,然后点击打开

  3. 点击添加

  4. 输入电子邮件地址。您可以将个人、服务账号或 Google 群组网添加为主账号。

  5. 为主账号选择一个角色。遵循最小权限安全原则,考虑授与可防止对其他资源进行不必要访问所需的最小权限。

  6. 点击保存

gcloud

  1. 在 Google Cloud 控制台中,激活 Cloud Shell。

    激活 Cloud Shell

    Cloud Shell 会话随即会在 Google Cloud 控制台的底部启动,并显示命令行提示符。Cloud Shell 是一个已安装 Google Cloud CLI 且已为当前项目设置值的 Shell 环境。该会话可能需要几秒钟时间来完成初始化。

  2. 如需向单个主账号授予角色,请运行以下命令:

    gcloud projects add-iam-policy-binding PROJECT \
       --member=PRINCPAL \
       --role=ROLE
    

    其中

    • PROJECT 是运行 Artifact Registry 的项目的 ID。
    • PRINCIPAL 是要添加绑定的主账号。使用 user|group|serviceAccount:emaildomain:domain 格式。

      示例:user:test-user@gmail.comgroup:admins@example.comserviceAccount:test123@example.domain.comdomain:example.domain.com

    • ROLE 是您要授予的角色

    如需了解详情,请参阅 add-iam-policy-binding 文档。

    要使用政策文件授予角色,请运行以下命令:

    gcloud projects set-iam-policy PROJECT /PATH/TO/policy.yaml

    其中

    • PROJECT 是运行 Artifact Registry 所在项目的 ID 或完全限定标识符。
    • /PATH/TO/policy.yaml 是政策文件的路径和文件名。

    要获取当前配置的政策,请运行以下命令:

    gcloud projects get-iam-policy PROJECT

    其中,PROJECT 是项目 ID 或项目的完全限定标识符。

    如需了解详情,请参阅 set-iam-policy 文档。

授予特定于代码库的权限

如果您希望用户或服务账号对项目中的每个代码库拥有不同级别的访问权限,请授予代码库级层的权限。

控制台

如需授予对特定代码库的访问权限,请执行以下操作:

  1. 打开 Google Cloud 控制台中的制品库页面。

    打开“代码库”页面

  2. 选择相应的代码库。

  3. 如果信息面板未显示,请点击菜单栏中的显示信息面板

  4. 在“权限”标签页上,点击添加主账号

  5. 输入电子邮件地址。您可以将个人、服务帐号或 Google 群组添加为主帐号。

  6. 为主账号选择一个角色。我们建议向主帐号授予其所需的最小权限。

  7. 点击保存

gcloud

  1. 在 Google Cloud 控制台中,激活 Cloud Shell。

    激活 Cloud Shell

    Cloud Shell 会话随即会在 Google Cloud 控制台的底部启动,并显示命令行提示符。Cloud Shell 是一个已安装 Google Cloud CLI 且已为当前项目设置值的 Shell 环境。该会话可能需要几秒钟时间来完成初始化。

  2. 您可以设置一组 IAM 政策绑定或使用政策文件。

    如需向单个主账号授予角色,请运行以下命令:

    gcloud artifacts repositories add-iam-policy-binding REPOSITORY \
       --location=LOCATION \
       --member=PRINCIPAL \
       --role=ROLE
    

    其中

    • REPOSITORY 是代码库的 ID。
    • PRINCIPAL 是要添加绑定的主账号。使用 user|group|serviceAccount:emaildomain:domain 格式。

      示例:user:test-user@gmail.comgroup:admins@example.comserviceAccount:test123@example.domain.comdomain:example.domain.com

    • ROLE 是您要授予的角色

    • LOCATION 是代码库的单区域或多区域位置

    例如,要为使用位置 --us-central1 中代码库 my-repo 的用户 write@gmail.com 的角色 roles/artifactregistry.writer 添加 IAM 政策绑定,请运行以下命令:

    gcloud artifacts repositories add-iam-policy-binding my-repo \
    --location=us-central1 --member=user:write@gmail.com --role=roles/artifactregistry.writer
    

    要使用政策文件授予角色,请运行以下命令:

    gcloud artifacts repositories set-iam-policy REPOSITORY /PATH/TO/policy.yaml --location=LOCATION

    其中

    • REPOSITORY 是代码库的 ID。
    • /PATH/TO/policy.yaml 是政策文件的路径和文件名。
    • LOCATION 是代码库的单区域或多区域位置

    例如,如需使用 policy.yaml 中定义的政策为 --us-central1 位置中的代码库 my-repo 设置 IAM 政策,请运行以下命令:

    gcloud artifacts repositories set-iam-policy my-repo policy.yaml --location=us-central1
    

Terraform

使用 google_artifact_registry_repository_iam 资源配置 IAM 政策。以下示例定义了一个资源名称为 repo-account 的服务帐号,并向其授予对资源名称为 my-repo 的代码库的读取权限。

如果您刚开始接触将 Terraform 用于 Google Cloud,请参阅 HashiCorp 网站上的使用入门 - Google Cloud 页面。

provider "google" {
    project = "PROJECT-ID"
}

resource "google_artifact_registry_repository" "my-repo"     {
  provider = google-beta

  location = "LOCATION"
  repository_id = "REPOSITORY"
  description = "DESCRIPTION"
  format = "FORMAT"
}

resource "google_service_account" "repo-account" {
  provider = google-beta

  account_id   = "ACCOUNT-ID"
  display_name = "Repository Service Account"
}

resource "google_artifact_registry_repository_iam_member" "repo-iam" {
  provider = google-beta

  location = google_artifact_registry_repository.my-repo.location
  repository = google_artifact_registry_repository.my-repo.name
  role   = "roles/artifactregistry.reader"
  member = "serviceAccount:${google_service_account.repo-account.email}"
}

ACCOUNT-ID 是服务帐号的 ID。这是服务帐号电子邮件地址字段 @ 符号之前的部分。

如需查看其他示例,请参阅 google_artifact_registry_repository_iam 资源文档。

配置对代码库的公共访问权限

如果您希望互联网上未经身份验证的所有人都可以使用工件,请将它们存储在您公开的代码库中。

如需为代码库配置公开只读访问权限,请向主帐号 allUsers 授予 Artifact Registry Reader 角色。我们还建议为用户请求配额设置上限,这样单个用户就不会用完项目的总配额。

控制台

  1. 打开 Google Cloud 控制台中的制品库页面。

    打开“代码库”页面

  2. 选择相应的代码库。

  3. 如果信息面板未显示,请点击菜单栏中的显示信息面板

  4. 在“权限”标签页上,点击添加主账号

  5. 新的主账号字段中,输入 allUsers

  6. 选择角色 Artifact Registry Reader

  7. 对 Artifact Registry API 请求设置每位用户限制,以防止未经身份验证的用户滥用。如需了解相关说明,请参阅限制用量

gcloud

  1. 在 Google Cloud 控制台中,激活 Cloud Shell。

    激活 Cloud Shell

    Cloud Shell 会话随即会在 Google Cloud 控制台的底部启动,并显示命令行提示符。Cloud Shell 是一个已安装 Google Cloud CLI 且已为当前项目设置值的 Shell 环境。该会话可能需要几秒钟时间来完成初始化。

  2. 运行以下命令:

    gcloud artifacts repositories add-iam-policy-binding REPOSITORY \
    --location=LOCATION --member=allUsers --role=ROLE
    

    其中

    • REPOSITORY 是代码库的 ID。

    • ROLE 是您要授予的角色

    • LOCATION 是代码库的单区域或多区域位置

    例如,将位置 --us-central1 中的代码库 my-repo 配置为公开,并运行以下命令:

    gcloud artifacts repositories add-iam-policy-binding my-repo \
     --location=us-central1 --member=allUsers --role=roles/artifactregistry.reader
    
  3. 对 Artifact Registry API 请求设置每位用户限制,以防止未经身份验证的用户滥用。如需了解相关说明,请参阅限制用量

撤消权限

如需撤消对代码库的访问权限,请从已获授权的主账号列表中移除此主账号。

如需从代码库中移除公开访问权限,请移除 allUsers 主帐号。

控制台

如需撤消权限,请执行以下操作:

  1. 打开 Google Cloud 控制台中的制品库页面。

    打开“代码库”页面

  2. 选择相应的代码库。

  3. 如果信息面板未显示,请点击菜单栏中的显示信息面板

  4. 在“权限”标签页上,展开相应的主账号。如需将公共代码库设为私有,请展开 allUsers 主账号。

  5. 点击移除主账号以撤消访问权限。

gcloud

  1. 在 Google Cloud 控制台中,激活 Cloud Shell。

    激活 Cloud Shell

    Cloud Shell 会话随即会在 Google Cloud 控制台的底部启动,并显示命令行提示符。Cloud Shell 是一个已安装 Google Cloud CLI 且已为当前项目设置值的 Shell 环境。该会话可能需要几秒钟时间来完成初始化。

  2. 如需撤消项目级层的角色,请运行以下命令:

    gcloud projects remove-iam-policy-binding PROJECT \
       --member=PRINCIPAL \
       --role=ROLE
    
    • PROJECT 是项目 ID。
    • PRINCIPAL 是要为其移除绑定的主账号。使用 user|group|serviceAccount:emaildomain:domain 格式。

      示例:user:test-user@gmail.comgroup:admins@example.comserviceAccount:test123@example.domain.comdomain:example.domain.com

    • ROLE 是要撤消的角色

    如需撤消代码库的角色,请运行以下命令:

    gcloud artifacts repositories remove-iam-policy-binding REPOSITORY
       --location=LOCATION \
       --member=PRINCIPAL \
       --role=ROLE
    

    其中

    • REPOSITORY 是代码库的 ID。
    • PRINCIPAL 是要为其移除绑定的主账号。使用 user|group|serviceAccount:emaildomain:domain 格式。

      示例:user:test-user@gmail.comgroup:admins@example.comserviceAccount:test123@example.domain.comdomain:example.domain.com

      如需撤消对代码库的公开访问权限,请指定主账号 allUsers

    • ROLE 是要撤消的角色

    例如,要为使用位置 --us-central1my-repo 代码库的用户 write@gmail.com 的角色 roles/artifactregistry.writer 移除政策绑定,请运行以下命令:

    gcloud artifacts repositories remove-iam-policy-binding my-repo \
       --location=us-central1 \
       --member=user:write@gmail.com \
       --role=roles/artifactregistry.writer

    如需撤消对 --us-central1 位置对 my-repo 的公开访问权限,请运行以下命令:

    gcloud artifacts repositories remove-iam-policy-binding my-repo \
       --location=us-central1 \
       --member=allUsers \
       --role=roles/artifactregistry.reader
    

使用标记授予条件式访问权限

此功能目前为预览版

项目管理员可以为 Google Cloud 中的资源创建标记,并在 Resource Manager 中管理这些标记。将标记附加到 Artifact Registry 代码库时,管理员可以使用该标记和 IAM 条件来授予对代码库的条件访问权限。

您无法将标记附加到各个工件。

如需了解详情,请参阅以下文档:

与 Google Cloud 服务集成

对于大多数 Google Cloud 服务账号,配置对注册表的访问权限只需授予适当的 IAM 权限。

Google Cloud 服务的默认权限

Cloud Build 或 Google Kubernetes Engine 等 Google Cloud 服务使用默认服务账号或 Google 管理的服务账号与同一项目中的资源进行交互。

在下列情况下,您必须自行配置或修改权限:

  • Google Cloud 服务与 Artifact Registry 位于不同的项目中。
  • 默认权限不能满足您的需求。例如,默认的 Compute Engine 服务账号对同一项目中的存储空间具有只读权限。如果要将映像从虚拟机推送到 Artifact Registry,您可以修改虚拟机服务帐号的权限,也可以使用具有所需权限的其他账号。
  • 您正在使用用户提供的服务帐号(而不是默认服务帐号)与 Artifact Registry 进行交互。

以下服务帐号通常可以访问 Artifact Registry。服务帐号的电子邮件地址包含运行服务的项目的 Google Cloud 项目 ID 或项目编号

服务 服务账号 电子邮件地址 权限
App Engine 柔性环境 App Engine 服务帐号 PROJECT-ID@appspot.gserviceaccount.com Editor 角色,可以对代码库执行读写操作
Compute Engine Compute Engine 默认服务账号 PROJECT-NUMBER-compute@developer.gserviceaccount.com Editor 角色,仅拥有对代码库的只读权限
Cloud Build Cloud Build 服务帐号 PROJECT-NUMBER@cloudbuild.gserviceaccount.com
默认权限包括对代码库的读写权限以及创建 gcr.io 代码库的权限。
Cloud Run Cloud Run 服务代理
run.googleapis.com 的服务代理。
service-PROJECT-NUMBER@serverless-robot-prod.iam.gserviceaccount.com 读取者权限,仅限对代码库进行只读访问
GKE Compute Engine 默认服务帐号
节点的默认服务帐号。
PROJECT-NUMBER-compute@developer.gserviceaccount.com Editor 角色,仅拥有对代码库的只读权限

授予对 Compute Engine 实例的访问权限

访问代码库的虚拟机实例必须同时配置 Artifact Registry 权限和存储空间访问权限范围

虽然服务帐号的访问权限级别由授予服务帐号的 IAM 角色决定,但虚拟机实例上的访问权限范围决定了通过 gcloud CLI 和实例上的客户端库发出的请求的默认 OAuth 范围。因此,在使用应用默认凭据进行身份验证时,访问权限范围可能会进一步限制对 API 方法的访问权限。

Compute Engine 使用以下默认值:

  • Compute Engine 默认服务帐号是虚拟机实例的身份。服务帐号电子邮件地址的后缀为 @developer.gserviceaccount.com
  • 如果您尚未停用此行为,则默认服务帐号具有 IAM 基本 Editor 角色。
  • 您通过默认服务帐号创建的实例拥有 Compute Engine 默认访问权限范围,包括对存储空间的只读权限。虽然 Editor 角色通常会授予写入权限,但 read-only 存储访问权限范围将实例服务帐号限制为仅从同一项目中的任何代码库下载工件。

在以下情况下,您必须配置服务账号的访问权限范围:

  • 虚拟机服务账号需要访问其他项目中的代码库。
  • 除了从代码库读取工件之外,虚拟机服务账号还需要执行一些操作。这通常适用于虚拟机上需要推送映像或运行 Artifact Registry gcloud 命令的第三方工具。

如需配置权限并设置访问权限范围,请执行以下操作:

  1. 在包含虚拟机实例的项目中,获取 Compute Engine 默认服务账号的名称。该服务账号电子邮件地址的后缀为 @developer.gserviceaccount.com

  2. 在包含代码库的项目中,授予权限以便服务账号可以访问代码库。

  3. 使用 --scopes 选项设置访问权限范围。

    1. 停止虚拟机实例。请参阅停止实例

    2. 使用以下命令设置访问权限范围:

      gcloud compute instances set-service-account INSTANCE --scopes=SCOPE
      

      SCOPE 替换为适当的值。

      • 对于 Docker,支持以下选项:

        • storage-ro - 仅授予拉取映像的读取权限。
        • storage-rw - 授予推送或拉取映像的读写权限。
        • cloud-platform - 查看和管理整个 Google Cloud 服务中的数据(包括元数据)。
      • 对于其他格式,您必须使用 cloud-platform 范围。

    3. 重启虚拟机实例。请参阅启动已停止的实例

授予对 Google Kubernetes Engine 集群的访问权限

如果满足以下所有要求,则 GKE 集群和节点池无需任何其他配置即可拉取容器:

如果您的 GKE 环境不符合这些要求,则授予访问权限的说明取决于您是使用 Compute Engine 默认服务帐号还是用户提供的服务账号作为节点的身份。

默认服务账号

以下配置要求适用于 Compute Engine 默认服务账号

  1. 如果 GKE 与 Artifact Registry 位于不同的项目中,请向服务帐号授予所需的权限。

  2. 如需推送映像、与代码库进行交互以采用容器以外的格式,或从集群运行 gcloud 命令,您必须在创建集群或节点池时为服务帐号设置访问权限范围

  3. 如果您使用的不是受支持的 GKE 版本,请配置 imagePullSecrets

用户提供的服务帐号

如果要将用户提供的服务帐号用作集群的身份,您必须执行以下操作:

  1. 向运行 Artifact Registry 的 Google Cloud 项目中的服务帐号授予所需的权限。

  2. 默认情况下,使用用户提供的服务账号创建集群或节点池会授予 cloud-platform 访问权限范围。

    如果您将 --scopes 标志与 gcloud container clusters creategcloud container node-pools create 命令搭配使用,则必须包含用于 Artifact Registry 的相应访问权限范围

设置访问权限范围

访问权限范围是为 Compute Engine 虚拟机指定授权的传统方法。如需从 Artifact Registry 代码库中拉取映像,GKE 节点必须具有存储空间只读访问权限范围或包含存储空间读取访问权限的其他存储空间访问权限范围。

您只能在创建集群或节点池时设置访问权限范围。您无法更改现有节点上的访问权限范围。

  • 如果您使用的是 Compute Engine 默认服务帐号,则 GKE 会创建具有 Compute Engine 默认访问权限范围(包括对存储空间的只读权限)的节点。
  • 如果您使用的是用户提供的服务帐号,则 GKE 会创建范围为 cloud-platform 的节点,这是大多数 Google Cloud 服务所需的范围。

如需在创建集群时指定访问权限范围,请运行以下命令:

gcloud container clusters create NAME --scopes=SCOPES

如需在创建节点池时指定访问权限范围,请运行以下命令:

gcloud container node-pools create NAME --scopes=SCOPES

替换以下值:

  • NAME 是集群或节点池的名称。
  • SCOPES 是要授予的访问权限范围列表(以英文逗号分隔)。

    • 如需访问 Docker 代码库,请使用以下范围之一:

    • storage-ro - 授予拉取映像的只读权限。

    • storage-rw - 授予推送或拉取映像的读写权限。

    • cloud-platform - 查看和管理整个 Google Cloud 服务中的数据(包括元数据)。

    • 如需访问其他代码库,您必须使用 cloud-platform 范围。

    如需查看完整的范围列表,请参阅 gcloud container clusters creategcloud container node-pools create 文档。

如需详细了解创建新集群时可设置的范围,请参阅 gcloud container clusters create 命令的文档。

配置 imagePullSecret

如需配置 imagePullSecret,请执行以下操作:

  1. 在包含 GKE 的项目中,找到 Compute Engine 默认服务帐号。该账号电子邮件地址的后缀为 @developer.gserviceaccount.com

  2. 下载服务帐号的服务帐号密钥

  3. 在包含代码库的项目中,验证您是否已向代码库授予权限

  4. 在包含集群的项目中,使用服务账号密钥创建名为 artifact-registryimagePullSecret 密文。

    kubectl create secret docker-registry artifact-registry \
    --docker-server=https://LOCATION-docker.pkg.dev \
    --docker-email=SERVICE-ACCOUNT-EMAIL \
    --docker-username=_json_key \
    --docker-password="$(cat KEY-FILE)"
    

    其中

    • LOCATION 是代码库的单区域或多区域位置
    • SERVICE-ACCOUNT-EMAIL 是 Compute Engine 服务账号的电子邮件地址。
    • KEY-FILE 是您的服务账号密钥文件的名称。例如 key.json
  5. 打开默认服务账号:

    kubectl edit serviceaccount default --namespace default

    Kubernetes 集群中的每个命名空间都有一个名为 default 的默认服务账号。此默认服务账号用于拉取容器映像。

  6. 将新创建的 imagePullSecret Secret 添加到您的默认服务账号:

    imagePullSecrets:
    - name: artifact-registry
    

    您的服务账号现在应如下所示:

    apiVersion: v1
    kind: ServiceAccount
    metadata:
      name: default
      namespace: default
      ...
    secrets:
    - name: default-token-zd84v
    # The secret you created:
    imagePullSecrets:
    - name: artifact-registry
    

现在,当前 default 命名空间中创建的所有新 Pod 都将定义了 imagePullSecret Secret。

Artifact Registry 服务账号

Artifact Registry Service Agent 是一个 Google 代管式服务帐号,在与 Google Cloud 服务交互时代表 Artifact Registry。如需详细了解该帐号及其权限,请参阅 Artifact Registry 服务帐号

后续步骤

设置权限后,详细了解如何使用工件。