GDC 上的 VM Runtime 角色型存取權控管 (RBAC)

GDC 上的 VM Runtime 可管理與 VM 相關的各種資源。這些資源包括 GKE 定義的資源、KubeVirt 定義的資源,以及 Kubernetes 資源。GDC 上的 VM 執行階段會使用角色型存取權控管 (RBAC),設定及強制執行受管理資源的權限。為協助您使用這些資源及管理 VM,我們提供了四個預先設定的 ClusterRole:

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

這些內建角色提供與 GDC VM Runtime 相關自訂資源的一般存取模型。每個角色都具有預先建立的權限,可對資源執行作業。本文提供 VM Runtime on GDC 管理的資源相關資訊,方便叢集管理員自訂存取模式。

預先定義的 ClusterRole

本節將說明每個預先定義的 ClusterRole。只有在啟用 VM Runtime on GDC 時,才能使用這些 ClusterRole:

  • 啟用 GDC 上的 VM 執行階段時,系統會自動建立四個預先定義的 ClusterRole。
  • 停用 GDC 上的 VM Runtime 時,系統會刪除四個預先定義的 ClusterRole。

下表列出叢集角色及其相關權限:

叢集角色 說明 存取動詞
kubevm.admin 具備所有 GKE 資源的完整存取權。
  • get
  • list
  • watch
  • delete
  • create
  • update
  • patch
  • deletecollection
kubevm.edit 可讀取/寫入所有 GKE 資源。
  • get
  • list
  • watch
  • delete
  • create
  • update
  • patch
kubevm.view 可讀取所有 GKE 資源。
  • get
  • list
  • watch
kubevm.cluster.view 可讀取叢集資源。如果編輯/檢視角色繫結至命名空間,但需要存取叢集資源,則必須使用這個叢集角色。
  • get
  • list
  • watch

匯總 ClusterRole

kubevm.adminkubevm.viewkubevm.edit ClusterRole 不會直接使用,這三種角色會分別匯總至 Kubernetes 預設的 adminviewedit ClusterRole。這項彙整作業會擴充預設 Kubernetes 角色,以便管理 GKE 資源。透過匯總的 ClusterRole,您可以使用 Kubernetes 預設角色管理 GKE 資源的存取權,或根據預先定義的 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。由於部分資源 (例如 virtualmachinetypesstorageclasses) 不屬於命名空間,因此需要這個 ClusterRoleBinding。

角色繫結範例 (命名空間編輯器)

下列 RoleBinding 和 ClusterRoleBinding 範例會授予使用者 charlie default 命名空間中資源的編輯者權限:

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 GDC 使用的資源

以下各節包含 GDC 上 VM Runtime 使用的資源表。這些章節僅供參考。 如果您打算在上述章節所述的典型使用者情境中使用預先定義的角色,這項資訊就沒有特定用途。

不過,如果您不想使用預先定義的角色,可以利用這項資源資訊建立自訂角色。

Google Kubernetes Engine 定義的資源

預先定義的 ClusterRole 主要著重於存取 GKE 定義的資源。下表列出 GKE 資源,以及各預先定義 ClusterRole 授予的存取權。

資源 已產生 叢集層級 kubevm.admin kubevm.view kubevm.edit kubevm.cluster.view
virtualmachineaccessrequests 完整 讀取 讀取/寫入
virtualmachinedisks 完整 讀取 讀取/寫入
virtualmachines 完整 讀取 讀取/寫入
gpuallocations 完整 讀取 讀取/寫入
guestenvironmentdata 完整 讀取 讀取/寫入
vmruntimes 完整 讀取 讀取/寫入 讀取
virtualmachinetypes 完整 讀取 讀取/寫入 讀取
vmhighavailabilitypolicies 完整 讀取 讀取/寫入 讀取
networkinterfaces 完整 讀取 讀取/寫入
networks 完整 讀取 讀取/寫入 讀取

KubeVirt 資源

GDC 上的 VM Runtime 是以 KubeVirt 開放原始碼專案為基礎。根據預設,系統會自動將 KubeVirt 資源的權限彙整至預設 Kubernetes 角色,與 GKE 管理的資源類似。如要建立自訂角色,請使用下表中的資源資訊:

資源 已產生 叢集層級
virtualmachineinstances/console
virtualmachineinstances/vnc
virtualmachineinstances/portforward
virtualmachineinstances/start
virtualmachineinstances/站
virtualmachineinstances/restart
virtualmachines
virtualmachineinstances
datavolumes
storageprofiles
cdiconfigs

Kubernetes 資源

在 GDC 和 VM 上使用 VM 執行階段時,您可能需要管理下列 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 的指令輸出範例:

  • 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