如何添加配置 GKE 节点池访问范围

How to add an configure GKE node pool access scope

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

如何添加到授权范围

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

一般来说,对于大多数 Google 云服务帐户,配置对注册表的访问只需要授予适当的 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 permissions and updating google kubernetes VM scopes获取信息。

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

When you create an instance using the gcloud command-line tool or the Google Cloud Console, you can specify which service account the instance uses when calling Google Cloud APIs. The instance is automatically configured with the following access scopes:

Cloud Storage是我需要的权限,所以应该是默认开启的,但需要注意的是,上面的内容适用于使用gcloud命令行工具或者Google 云控制台

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

The set of Google API scopes to be made available on all of the node VMs under the "default" service account. The following scopes are recommended, but not required, and by default are not included: https://www.googleapis.com/auth/compute is required for mounting persistent storage on your nodes. https://www.googleapis.com/auth/devstorage.read_only is required for communicating with gcr.io (the Google Container Registry). If unspecified, no scopes are added, unless Cloud Logging or Cloud Monitoring are enabled, in which case their required scopes will be added.

这意味着与使用命令行工具或云控制台时不同,当您使用 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

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