为 Helm 设置身份验证

本页面介绍如何配置 Helm 以通过 Artifact Registry 代码库进行身份验证。

准备工作

  1. 如果图表的代码库不存在,请创建新的代码库。选择 Docker 作为代码库格式。
  2. 安装 Google Cloud CLI,然后通过运行以下命令初始化 Google Cloud CLI:

    gcloud init
  3. (可选)为 gcloud 命令配置默认值
  4. 安装 Helm 3.8.0 或更高版本。在更早的 Helm 版本中,OCI 格式的图表只作为一项实验性功能提供。

    运行 helm version 以验证您的版本。

选择身份验证方法

在大多数情况下,我们建议您使用服务账号进行 Artifact Registry 身份验证。

对于通常与 Artifact Registry 集成的应用(如 Cloud Build 或 Cloud Run)的服务帐号,系统会默认为同一项目中的代码库配置权限。您无需为这些应用配置 Docker 身份验证。

您可以使用以下身份验证方法:

使用为 Docker 配置的 Artifact Registry 凭据
默认情况下,Helm 可以使用您用于 Docker 的凭据进行身份验证。
访问令牌
应用默认凭据提供短期有效的访问令牌,供服务帐号用于访问 Google Cloud 资源。
JSON 密钥文件

用户管理的密钥对,您可以将其用作服务账号的凭据。由于它是长期凭据,因此它是所有可用身份验证方法中最不安全的选项。

请尽可能使用访问令牌来降低未经授权访问您的工件的风险。

使用 Docker 配置

默认情况下,Helm 支持 Docker 配置文件 config.json 中的注册表设置。Helm 会在默认位置或 DOCKER_CONFIG 环境变量指定的位置查找注册表设置。

如果您使用凭据帮助程序配置 Docker 以向 Artifact Registry 进行身份验证,Helm 会使用 Artifact Registry Docker 代码库的现有配置。

使用访问令牌

访问令牌是一种短期令牌,用于提供对 Google Cloud 资源的访问权限。由于令牌只在短时间内有效,因此您应该在使用它连接 Artifact Registry 代码库之前的一个小时内进行申请。

Google Cloud 使用应用默认凭据获取访问令牌。

如需使用访问令牌,请执行以下操作:

  1. 创建一个服务账号代表您的应用执行操作,或选择一个现有服务账号用于进行自动化。

    您需要服务账号密钥文件所在的位置,才能使用 Artifact Registry 设置身份验证。对于现有账号,您可以在“服务账号”页面上查看密钥和创建新密钥。

    转到“服务账号”页面

  2. 向服务账号授予适当的 Artifact Registry 角色,以提供代码库访问权限。

  3. 将服务账号密钥文件分配给变量 GOOGLE_APPLICATION_CREDENTIALS,以便 Artifact Registry 凭据帮助程序可在与代码库连接时获取您的密钥。

    export GOOGLE_APPLICATION_CREDENTIALS=KEY-FILE
    

    其中,KEY-FILE 是服务账号密钥文件的路径。

  4. 在使用 Docker 进行 Artifact Registry 身份验证时,获取访问令牌作为凭据。

    Linux/macOS

    运行以下命令:

    gcloud auth application-default print-access-token | helm registry login -u oauth2accesstoken \
    --password-stdin https://LOCATION-docker.pkg.dev
    

    Windows

    运行以下命令:

    gcloud auth application-default print-access-token
    ya29.8QEQIfY_...
    
    helm registry login -u oauth2accesstoken -p "ya29.8QEQIfY_..." \
    https://LOCATION-docker.pkg.dev
    

    其中

    • oauth2accesstoken 是在使用访问令牌进行身份验证时要使用的用户名。
    • gcloud auth application-default print-access-token 是用于获取服务帐号的访问令牌的 gcloud 命令。您的访问令牌是用于身份验证的密码。
    • LOCATION 是存储映像的代码库的单区域或多区域位置

Helm 现已通过 Artifact Registry 的身份验证。

使用 JSON 密钥文件

任何有权访问服务账号的有效私钥的人员都可以通过该服务账号访问资源。注意,密钥访问服务账号(以及服务账号可访问的数据)的生命周期与已下载密钥的用户的生命周期无关。

请使用以下准则来限制对代码库的访问:

  • 创建仅用于与代码库进行交互的专用服务账号。
  • 针对该服务帐号所需的访问权限,授予特定的 Artifact Registry 角色。例如,仅下载工件的服务账号只需要 Artifact Registry Reader 角色。
  • 在每个代码库(而不是项目级层)上为您的专用服务账号配置权限。然后,您可以根据代码库上下文指定访问权限。例如,用于开发构建的服务账号对于生产代码库可能拥有 Artifact Registry Reader 角色,对于临时代码库可能拥有 Artifact Registry Writer 角色。
  • 遵循管理服务帐号密钥的最佳实践

要创建仅用于 Artifact Registry 代码库的新服务账号和服务账号密钥,请执行以下操作:

  1. 创建一个服务账号代表您的应用执行操作,或选择一个现有服务账号用于进行自动化。

    您需要服务账号密钥文件所在的位置,才能使用 Artifact Registry 设置身份验证。对于现有账号,您可以在“服务账号”页面上查看密钥和创建新密钥。

    转到“服务账号”页面

  2. 您可以选择性地对密钥文件的所有内容采用 base64 编码。

    Linux

    base64 FILE-NAME > NEW-FILE-NAME
    

    macOS

    base64 -i FILE-NAME -o NEW-FILE-NAME
    

    Windows

    Base64.exe -e FILE-NAME > NEW-FILE-NAME
    

    其中,FILE-NAME 是原始密钥文件名,而 NEW-FILE-NAME 是 base64 编码的密钥文件。

  3. 向服务账号授予适当的 Artifact Registry 角色,以提供代码库访问权限。

  4. 使用服务帐号密钥进行身份验证:

    Linux/macOS

    运行以下命令:

    cat KEY-FILE | helm registry login -u KEY-TYPE --password-stdin \
    https://LOCATION-docker.pkg.dev
    

    Windows

    运行以下命令:

    helm registry login -u KEY-TYPE --password-stdin https://LOCATION-docker.pkg.dev < KEY-FILE
    

    地点

    • KEY-TYPE 是以下值之一:
      • 如果您使用的是在创建文件时提供的 JSON 格式的服务账号密钥,则为 _json_key
      • 如果您已对文件的全部内容进行 base64 编码,则为 _json_key_base64
    • KEY-FILE 是 JSON 格式的服务账号密钥文件的名称。
    • LOCATION 是存储映像的代码库所在的单区域或多区域位置

Helm 现已通过 Artifact Registry 的身份验证。

后续步骤