Anthos 运行时的基于角色的访问权限控制 (RBAC)

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

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

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

预定义的 ClusterRole

本部分介绍每个预定义的 ClusterRole。这些 ClusterRole 仅在启用 Anthos VM Runtime 的情况下可用:

  • 启用 Anthos VM Runtime 后,系统会自动创建四个预定义的 ClusterRole。
  • 在停用 Anthos VM Runtime 后,四个预定义的 ClusterRole 会被删除。

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

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

聚合的 ClusterRole

kubevm.adminkubevm.viewkubevm.edit 集群角色不直接使用。这三个角色会分别聚合到 Kubernetes 默认的 adminviewedit 集群角色。此聚合扩展了默认 Kubernetes 角色,因此可用于管理 Anthos 资源。借助聚合 ClusterRole,您可以使用 Kubernetes 默认角色来管理对 Anthos 资源的访问权限,或根据预定义的 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 示例,请参阅角色绑定示例(已处理命名空间编辑者)

Anthos VM Runtime 使用的资源

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

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

Anthos 定义的资源

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

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

KubeVirt 资源

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

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

Kubernetes 资源

使用 Anthos VM Runtime 和虚拟机时,您可能需要管理对以下 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