VM Runtime on Google Distributed Cloud 的基于角色的访问控制 (RBAC)

VM Runtime on Google Distributed Cloud 管理着与您的虚拟机相关的各种资源。这些资源包括 GKE Enterprise 定义的资源、KubeVirt 定义的资源和 Kubernetes 资源。VM Runtime on Google Distributed Cloud 使用基于角色的访问权限控制 (RBAC) 设置和强制执行代管式资源的权限。为了帮助您处理这些资源并管理虚拟机,我们提供了四个预先配置的 ClusterRole:

  • kubevm.admin
  • kubevm.edit
  • kubevm.view
  • kubevm.cluster.view

这些内置角色提供了与 VM Runtime on Google Distributed Cloud 相关的自定义资源的通用访问模型。每个角色都有预先确定的资源操作权限。本文档提供有关 VM Runtime on Google Distributed Cloud 管理的资源的信息,以便集群管理员可以自定义自己的访问模型。

预定义的 ClusterRole

本部分介绍每个预定义的 ClusterRole。只有在启用 VM Runtime on Google Distributed Cloud 后,这些 ClusterRole 才可用:

  • 启用 VM Runtime on Google Distributed Cloud 后,系统会自动创建四个预定义的 ClusterRole。
  • 停用 VM Runtime on Google Distributed Cloud 后,系统会删除四个预定义的 ClusterRole。

下表列出了集群角色及其相关权限:

集群角色 说明 访问动词
kubevm.admin 授予对所有 GKE Enterprise 资源的完整访问权限。
  • get
  • list
  • watch
  • delete
  • create
  • update
  • patch
  • deletecollection
kubevm.edit 授予对所有 GKE Enterprise 资源的读写权限。
  • get
  • list
  • watch
  • delete
  • create
  • update
  • patch
kubevm.view 授予对所有 GKE Enterprise 资源的读取权限。
  • get
  • list
  • watch
kubevm.cluster.view 授予对集群级资源的读取权限。如果修改/查看角色绑定到命名空间,但需要访问集群级资源,则需要此集群角色。
  • get
  • list
  • watch

聚合的 ClusterRole

kubevm.adminkubevm.viewkubevm.edit 集群角色不直接使用。这三个角色会分别聚合到 Kubernetes 默认的 adminviewedit 集群角色。此聚合扩展了默认 Kubernetes 角色,以便用于管理 GKE Enterprise 资源。借助聚合 ClusterRole,您可以使用 Kubernetes 默认角色来管理对 GKE Enterprise 资源的访问权限,或根据预定义的 ClusterRole 创建自己的角色。

聚合标签示例

kubevm.edit ClusterRole 具有 rbac.authorization.k8s.io/aggregate-to-edit: "true" 标签,它会将其聚合到 Kubernetes edit ClusterRole。kubevm.edit ClusterRole 中的权限授予 Kubernetes 默认 edit 角色。kubevm.adminkubevm.view ClusterRole 通过 aggregate-to-adminaggregate-to-view 注释进行类似聚合。

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
    name: kubevm.edit
    labels:
      kubevm: kubevm.edit
      rbac.authorization.k8s.io/aggregate-to-edit: "true"
...

典型用户场景

以下部分介绍了如何使用 RoleBinding 和 ClusterRoleBinding 将预定义 ClusterRole 中指定的权限授予一个用户或一组用户。

集群管理员

如需将管理员权限授予一个用户或一组用户,请使用 Kubernetes 默认的 admin ClusterRole 创建 ClusterRoleBinding。

ClusterRoleBinding 示例

以下 admin-charlie 示例 ClusterRoleBinding 为用户提供 charlie 管理员权限。ClusterRoleBinding 使用 Kubernetes 默认的 admin ClusterRole 的权限,其中包括通过聚合来自预定义的 kubevm.admin ClusterRole 的权限。

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: admin-charlie
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: admin
subjects:
- apiGroup: rbac.authorization.k8s.io
  kind: User
  name: charlie

集群查看者

如需将查看者权限授予一个用户或一组用户,请使用 Kubernetes 默认的 view ClusterRole 创建 ClusterRoleBinding。如需查看类似的 ClusterRoleBinding 示例,请参阅示例 ClusterRoleBinding

集群编辑者

如需将编辑者权限授予一个用户或一组用户,请使用 Kubernetes 默认的 edit ClusterRole 创建 ClusterRoleBinding。如需查看类似的 ClusterRoleBinding 示例,请参阅示例 ClusterRoleBinding

已处理命名空间编辑者

如需将已处理命名空间编辑者权限授予一个用户或一组用户,您需要创建两个单独的绑定:

  • 在命名空间上创建 RoleBinding,并引用 Kubernetes 默认的 edit ClusterRole。

  • 创建一个引用预定义的 kubevm.cluster.view ClusterRole 的 ClusterRoleBinding。需要此 ClusterRoleBinding,因为某些资源(如 virtualmachinetypesstorageclasses)未进行命名空间处理。

角色绑定示例(已处理命名空间编辑者)

以下 RoleBinding 和 ClusterRoleBinding 示例为用户授予 default 命名空间中资源的 charlie 编辑者权限:

apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: edit-charlie
  namespace: default
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: edit
subjects:
- apiGroup: rbac.authorization.k8s.io
  kind: User
  name: charlie
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: kubevm-cluster-view-charlie
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: kubevm.cluster.view
subjects:
- apiGroup: rbac.authorization.k8s.io
  kind: User
  name: charlie

已处理命名空间查看者

如需将已处理命名空间查看者权限授予一个用户或一组用户,您需要创建两个单独的绑定:

  • 在命名空间上创建 RoleBinding,并引用 Kubernetes 默认的 view ClusterRole。

  • 创建一个引用预定义的 kubevm.cluster.view ClusterRole 的 ClusterRoleBinding。

如需了解类似的 RoleBinding 和 ClusterRoleBinding 示例,请参阅角色绑定示例(已处理命名空间编辑者)

VM Runtime on Google Distributed Cloud 使用的资源

以下部分包含 VM Runtime on Google Distributed Cloud 使用的资源表。这些部分仅供参考。如果您打算在前面部分介绍的典型用户场景中使用预定义的角色,则此信息没有特定用途。

但是,如果您不想使用预定义的角色,则可以使用此资源信息创建您自己的自定义角色。

GKE Enterprise 定义的资源

预定义的 ClusterRole 侧重于对 GKE Enterprise 定义的资源的访问权限。下表列出了 GKE Enterprise 资源以及每个预定义 ClusterRole 授予的访问权限。

资源 已生成 集群级 kubevm.admin kubevm.view kubevm.edit kubevm.cluster.view
virtualmachineaccessrequests 完整 读取 读写
virtualmachinedisks 完整 读取 读写
virtualmachines 完整 读取 读写
gpuallocations 完整 读取 读写
guestenvironmentdata 完整 读取 读写
vmruntimes 完整 读取 读写 读取
virtualmachinetypes 完整 读取 读写 读取
vmhighavailabilitypolicies 完整 读取 读写 读取
networkinterfaces 完整 读取 读写
networks 完整 读取 读写 读取

KubeVirt 资源

VM Runtime on Google Distributed Cloud 基于 KubeVirt 开源项目。默认情况下,KubeVirt 资源的权限会自动聚合到默认的 Kubernetes 角色,类似于 GKE Enterprise 管理的资源。如果您想创建自己的自定义角色,请使用下表中的资源信息:

资源 已生成 集群级
virtualmachineinstances/console
virtualmachineinstances/vnc
virtualmachineinstances/portforward
virtualmachineinstances/start
virtualmachineinstances/stop
virtualmachineinstances/restart
virtualmachines
virtualmachineinstances
datavolumes
storageprofiles
cdiconfigs

Kubernetes 资源

使用 VM Runtime on Google Distributed Cloud 和虚拟机时,您可能需要管理对以下 Kubernetes 资源的访问权限。如果您想创建自己的自定义角色,请使用下表中的资源信息:

资源 已生成 集群级
pods
services
persistentvolumeclaims
secrets
nodes
storageclasses
configmaps

ClusterRole YAML 示例

您可以使用以下 kubectl 命令检索 ClusterRole 的 YAML:

kubectl get ClusterRole CLUSTERROLE_NAME -o yaml --kubeconfig KUBECONFIG_PATH

替换以下内容:

  • CLUSTERROLE_NAME:ClusterRole 的名称,例如 kubevm.cluster.view
  • KUBECONFIG_PATH:集群的 kubeconfig 文件的路径。

以下是针对四个预定义的 ClusterRole 中每一个 ClusterRole 的命令输出的示例:

  • kubevm.admin

    apiVersion: rbac.authorization.k8s.io/v1
    kind: ClusterRole
    metadata:
      creationTimestamp: "2022-10-11T21:10:31Z"
      labels:
        kubevm: kubevm.admin
        rbac.authorization.k8s.io/aggregate-to-admin: "true"
      name: kubevm.admin
      resourceVersion: "16654950"
      uid: 3296c279-6e85-4ea6-b250-548bf0c3e935
    rules:
    - apiGroups:
      - vm.cluster.gke.io
      resources:
      - virtualmachineaccessrequests
      - virtualmachinedisks
      - virtualmachines
      - gpuallocations
      - guestenvironmentdata
      - vmruntimes
      - virtualmachinetypes
      - vmhighavailabilitypolicies
      verbs:
      - get
      - delete
      - create
      - update
      - patch
      - list
      - watch
      - deletecollection
    - apiGroups:
      - networking.gke.io
      resources:
      - networkinterfaces
      - networks
      verbs:
      - get
      - delete
      - create
      - update
      - patch
      - list
      - watch
      - deletecollection
    
  • kubevm.edit

    apiVersion: rbac.authorization.k8s.io/v1
    kind: ClusterRole
    metadata:
      creationTimestamp: "2022-10-11T21:10:31Z"
      labels:
        kubevm: kubevm.edit
        rbac.authorization.k8s.io/aggregate-to-edit: "true"
      name: kubevm.edit
      resourceVersion: "16654951"
      uid: 237bf9ae-b2c8-4303-94dc-e6425a2df331
    rules:
    - apiGroups:
      - vm.cluster.gke.io
      resources:
      - virtualmachineaccessrequests
      - virtualmachinedisks
      - virtualmachines
      - gpuallocations
      - guestenvironmentdata
      - vmruntimes
      - virtualmachinetypes
      - vmhighavailabilitypolicies
      verbs:
      - get
      - delete
      - create
      - update
      - patch
      - list
      - watch
    - apiGroups:
      - networking.gke.io
      resources:
      - networkinterfaces
      - networks
      verbs:
      - get
      - delete
      - create
      - update
      - patch
      - list
      - watch
    
  • kubevm.view

    apiVersion: rbac.authorization.k8s.io/v1
    kind: ClusterRole
    metadata:
      creationTimestamp: "2022-10-11T21:10:31Z"
      labels:
        kubevm: kubevm.view
        rbac.authorization.k8s.io/aggregate-to-view: "true"
      name: kubevm.view
      resourceVersion: "16654953"
      uid: b5b54e2d-0097-4698-abbd-aeac212d0a34
    rules:
    - apiGroups:
      - vm.cluster.gke.io
      resources:
      - virtualmachineaccessrequests
      - virtualmachinedisks
      - virtualmachines
      - gpuallocations
      - guestenvironmentdata
      - vmruntimes
      - virtualmachinetypes
      - vmhighavailabilitypolicies
      verbs:
      - get
      - list
      - watch
    - apiGroups:
      - networking.gke.io
      resources:
      - networkinterfaces
      - networks
      verbs:
      - get
      - list
      - watch
    
  • kubevm.cluster.view

    apiVersion: rbac.authorization.k8s.io/v1
    kind: ClusterRole
    metadata:
      creationTimestamp: "2022-10-11T21:10:31Z"
      labels:
        kubevm: kubevm.cluster.view
      name: kubevm.cluster.view
      resourceVersion: "16654956"
      uid: b25dde64-67da-488b-81d2-1a08f9a4a7c1
    rules:
    - apiGroups:
      - vm.cluster.gke.io
      resources:
      - vmruntimes
      - virtualmachinetypes
      - vmhighavailabilitypolicies
      verbs:
      - get
      - list
      - watch
    - apiGroups:
      - networking.gke.io
      resources:
      - networks
      verbs:
      - get
      - list
      - watch