运行gcloud container clusters describe [CLUSTER NAME]
: oauthScopes属性下列出的范围不包括https://www.googleapis.com/auth/devstorage.read_only,但我需要它从容器注册表中提取我的私有映像。
如何添加到权限范围
编辑:我正在使用Ansible剧本自动部署
一般来说,对于大多数Google Cloud服务帐户,配置对注册表的访问只需要授予适当的IAM权限。
1。Google Kubernetes引擎使用在集群节点的虚拟机实例上配置的服务帐号来推送和拉取镜像。您必须授予服务帐户访问Container Registry使用的存储桶的适当权限。您可以在文档中找到适当的权限。从GCR下载图像的最低权限是"Storage viewer"。
2。如果您的Google Kubernetes引擎使用默认的服务帐户,则需要额外配置存储访问范围。如果只拉Docker私有镜像,虚拟机实例需要使用只读存储访问范围。
要更新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或更高版本的集群中使用遗留访问作用域,则必须在创建集群时手动添加作用域。参考从遗留访问范围迁移。
请参考所需的权限和更新google kubernetes VM作用域获取信息。
根据google cloud docs关于将服务帐户关联到实例
当您使用gcloud命令行工具或谷歌云控制台,您可以指定哪个服务帐户调用Google Cloud api时使用的实例。这个实例是自动配置以下访问范围:
只读访问云存储:https://www.googleapis.com/auth/devstorage.read_only
写Compute Engine日志:
https://www.googleapis.com/auth/logging.write
写入访问发布度量数据到您的谷歌云项目:https://www.googleapis.com/auth/monitoring.write
对Google Cloud endpoint (Alpha)所需的服务管理功能的只读访问:https://www.googleapis.com/auth/service.management.readonly
对Google Cloud endpoint (Alpha)所需的服务控制功能的读写访问:
https://www.googleapis.com/auth/servicecontrol
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容器注册表)。如果未指定,则不添加作用域,除非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
当您再次运行剧本时,将重新创建节点池,这一次使用您指定的范围。
根据google cloud docs,我们也可以为已经创建的Compute Engine VM/GKE集群设置作用域。