【问题标题】:How to add an configure GKE node pool access scope如何添加配置 GKE 节点池访问范围
【发布时间】:2021-10-27 10:01:10
【问题描述】:

运行gcloud container clusters describe [CLUSTER NAME]:oauthScopes 属性下列出的范围不包括https://www.googleapis.com/auth/devstorage.read_only,但我需要它从容器注册表中提取我的私有映像。

如何添加到授权范围

编辑: 我正在使用 Ansible playbook 自动化我的部署

【问题讨论】:

  • 您是在使用 GKE 的默认服务帐号还是自定义服务帐号?
  • 您可以尝试通过使用答案中第 2 点中提到的新范围创建新节点池来更新 GKE 集群。

标签: google-kubernetes-engine google-container-registry


【解决方案1】:

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

1. Google Kubernetes Engine 使用集群节点的 VM 实例上配置的服务帐号来推送和拉取镜像。您必须授予服务帐号适当的权限才能访问 Container Registry 使用的存储桶。您可以在documentation 中找到相应的权限。从 GCR 下载图片的最低权限是“Storage Viewer”。

2.如果您的 Google Kubernetes Engine 使用默认的 Service Account,您需要额外配置存储访问范围。为了只拉取私有 Docker 镜像,VM 实例需要只读存储访问范围。

要更新 GKE 集群访问范围以添加新范围,我们可以简单地使用新范围创建一个新节点池,如下所示:

    gcloud container node-pools create ADJUSTED-SCOPES \
       --cluster <YOUR_CLUSTER_NAME> --zone <YOUR_ZONE> \
       --num-nodes 3 \
       --scopes https://www.googleapis.com/auth/devstorage.read_only

如果要添加多个范围。可以指定,用逗号分隔。例如:

    gcloud container node-pools create ADJUSTED-SCOPES \
       --cluster <YOUR_CLUSTER_NAME> --zone <YOUR_ZONE> \
       --num-nodes 3 \
       --scopes https://www.googleapis.com/auth/devstorage.read_write,https://www.googleapis.com/WHAT_YOU_NEED

3. 如果您想在运行 Kubernetes 1.10 及更高版本的集群中使用旧的访问范围,则必须在创建集群时手动添加范围。参考Migrating from legacy access scopes

有关信息,请参阅 required permissionsupdating google kubernetes VM scopes

【讨论】:

    【解决方案2】:

    根据google cloud docs 将服务帐户关联到实例

    当您使用 gcloud 命令行工具或 Google Cloud Console,您可以指定哪个服务帐户 调用 Google Cloud API 时使用的实例。实例是 自动配置以下访问范围:

    Cloud Storage 是我需要的权限,所以它应该默认启用,但需要注意的是,以上内容适用于使用 gcloud 命令行工具或 Google Cloud Console 创建实例时

    在我的例子中,我使用 Ansible playbook 创建了我的实例。 google.cloud.gcp_container_node_pool 这是我在创建节点池时使用的模块,它需要几个参数,其中包括 config 然后 oauth_scopes 是:

    要在所有节点上提供的一组 Google API 范围 “默认”服务帐户下的虚拟机。以下范围是 推荐,但不是必需的,默认情况下不包括: 安装需要https://www.googleapis.com/auth/compute 节点上的持久存储。 https://www.googleapis.com/auth/devstorage.read_only 是必需的 与 gcr.io(Google Container Registry)通信。如果 未指定,不添加任何范围,除非 Cloud Logging 或 Cloud 启用监控,在这种情况下,它们所需的范围将是 已添加。

    这意味着与使用命令行工具或云控制台时不同,当您使用 Ansible 模块创建节点池时,默认情况下不会添加任何范围。除了为您的项目启用时始终添加的云日志记录和监控范围。

    为了解决这个问题,我包含了一个oath_scopes 我想启用的列表:

    - name: create k8s node pool
      google.cloud.gcp_container_node_pool:
        name: "node-pool-{{ cluster_name }}"
        initial_node_count: "{{ initial_node_count }}"
        cluster: "{{ cluster }}"
        config:
          disk_size_gb: "{{ disk_size_gb }}"
          disk_type: "{{ disk_type }}"
          machine_type: "{{ machine_type }}"
          oauth_scopes: 
            - https://www.googleapis.com/auth/devstorage.read_only
            - https://www.googleapis.com/auth/logging.write
            - https://www.googleapis.com/auth/monitoring.write
        location: "{{ zone }}"
        project: "{{ project_id }}"
        auth_kind: serviceaccount
        service_account_file: "{{ credentials_file }}"
        state: present
    

    当您再次运行 playbook 时,将重新创建节点池,这次使用您指定的范围。

    【讨论】:

      猜你喜欢
      • 2021-06-20
      • 1970-01-01
      • 2022-01-23
      • 2021-04-19
      • 1970-01-01
      • 2022-01-15
      • 2020-09-15
      • 2017-10-11
      • 2019-08-11
      相关资源
      最近更新 更多