从旧版访问权限范围迁移

本页面说明了运行 Kubernetes 1.10 及更高版本的集群的访问权限范围的更改。这些更改仅影响集群与 Cloud Storage 和 Compute Engine 的交互。

什么是访问权限范围?

访问权限范围是为节点以及节点上运行的工作负载(如果工作负载使用应用默认凭据 (ADC))指定权限的传统方法。 在运行 Kubernetes 1.10 之前的版本的集群中,系统会为集群的默认服务帐号授予一组默认访问权限范围gcloud 和 Google Cloud Console 为这些集群授予了以下访问权限范围:

  • compute-rw 授予对所有 Compute Engine API 方法的完全访问权限。
  • storage-ro 授予对所有 Cloud Storage 资源(包括存储在 Container Registry 中的私有映像)的只读访问权限

访问权限范围的变化

从 Kubernetes 1.10 版开始,gcloud 和 Cloud Console 默认情况下不再授予新集群和新节点池上的 compute-rw 访问权限范围。此外,如果 gcloud container create 中指定了 --scopesgcloud 不再以静默方式添加 compute-rwstorage-ro

这些更改可确保您的默认服务帐号仅具有运行集群所需的权限,从而提高项目的安全性。

我的工作负载是否受影响?

如果您的工作负载不需要调用由这些范围授予访问权限的 API,则无需执行任何操作。

但是,如果您的工作负载需要与 Compute Engine 或 Cloud Storage 交互的权限,则您的工作负载可能会受到影响。我们建议创建一个自定义服务帐号,使其具有等效的 Identity and Access Management (IAM) 角色。

如果您覆盖范围并且您的工作负载需要与 Cloud Storage 交互(包括从 Container Registry 中提取私有容器映像)的权限,则还必须包含 storage-ro 范围。

或者,要复制 1.10 版之前的集群的行为,请参阅还原到旧版访问权限范围

影响

Compute Engine 和 Cloud Storage 会向缺少必要范围的 Kubernetes 1.10 集群中运行的应用返回 403 错误。

此外,范围不足的请求收到的响应中包括详细说明必要范围的 HTTP 标头。例如:

WWW-Authenticate: Bearer realm="https://accounts.google.com/", error=insufficient_scope, scope="https://www.googleapis.com/auth/compute.readonly"

为工作负载配置自定义服务帐号

IAM 是一种访问权限控制系统,用于向 GCP 项目中的用户和服务帐号授予已获授权的角色。服务帐号是一种特殊的 Google 帐号,用于代表您执行部署应用等任务。您可以使用 IAM 创建服务帐号,然后使用 IAM 政策绑定来保护该帐号。

如果您的工作负载需要访问 Compute Engine,请向服务帐号授予 Compute Engine Admin 角色。如果您的工作负载需要从 Container Registry 拉取私有映像,请授予 Storage Object Viewer 角色。

创建服务帐号

如需创建名为 kubernetes-engine-node-sa 的自定义服务帐号,请运行以下命令:

export NODE_SA_NAME=kubernetes-engine-node-sa
gcloud iam service-accounts create $NODE_SA_NAME \
  --display-name "GKE Node Service Account"
export NODE_SA_EMAIL=`gcloud iam service-accounts list --format='value(email)' \
  --filter='displayName:GKE Node Service Account'`

授予最小角色

如需为服务帐号配置最小的必要角色和权限以便 GKE 节点正常运行,请运行以下命令,其中 $PROJECT 是您的项目 ID

export PROJECT=`gcloud config get-value project`
gcloud projects add-iam-policy-binding $PROJECT \
  --member serviceAccount:$NODE_SA_EMAIL \
  --role roles/monitoring.metricWriter
gcloud projects add-iam-policy-binding $PROJECT \
  --member serviceAccount:$NODE_SA_EMAIL \
  --role roles/monitoring.viewer
gcloud projects add-iam-policy-binding $PROJECT \
  --member serviceAccount:$NODE_SA_EMAIL \
  --role roles/logging.logWriter

授予其他角色

要向服务帐号授予 Compute Engine Admin 角色,请运行以下命令:

gcloud projects add-iam-policy-binding $PROJECT \
  --member serviceAccount:$NODE_SA_EMAIL \
  --role roles/compute.admin

如需授予 Storage Object Viewer 角色,请运行以下命令:

gcloud projects add-iam-policy-binding $PROJECT \
  --member serviceAccount:$NODE_SA_EMAIL \
  --role roles/storage.objectViewer

如需了解如何向服务帐号授予 Container Registry 中所存储私有映像的访问权限,请参阅授予 IAM 权限

创建使用自定义服务帐号的集群或节点池

要创建使用自定义服务帐号的集群,请运行以下命令:

gcloud container clusters create --service-account=$NODE_SA_EMAIL

要在现有集群中创建节点池,请运行以下命令:

gcloud container node-pools create --service-account=$NODE_SA_EMAIL

还原到旧版访问权限范围

如果要继续在运行 Kubernetes 1.10 及更高版本的集群中使用旧版访问权限范围,则必须手动添加范围。

控制台

如需使用 Cloud Console 创建集群,请执行以下操作:

  1. 访问 Cloud Console 中的 Google Kubernetes Engine 菜单。

    访问 Google Kubernetes Engine 菜单

  2. 点击创建集群按钮。

  3. 主版本下,选择 Kubernetes 版本。

  4. 根据需要配置集群。先不要点击创建

  5. 在导航窗格的默认池 (default-pool) 下,点击安全

  6. 访问权限范围部分中,选择针对每个 API 设置访问权限

  7. 对于 Compute Engine,请选择读写。对于 Storage,默认情况下,访问权限应为只读

  8. 点击创建

gcloud

如需创建集群,请运行以下命令:

gcloud container clusters create example-cluster --scopes compute-rw,gke-default

如需在现有集群中创建节点池,请运行以下命令:

gcloud container node-pools create example-pool --scopes compute-rw,gke-default