Google Distributed Cloud 上の VM ランタイムのロールベースのアクセス制御(RBAC)

Google Distributed Cloud 上の VM ランタイムは、VM に関連する幅広いリソースを管理します。これらのリソースには、GKE Enterprise 定義のリソース、KubeVirt 定義リソース、Kubernetes リソースが含まれます。Google Distributed Cloud 上の VM ランタイムは、ロールベースのアクセス制御(RBAC)を使用して、マネージド リソースに対する権限を設定および適用します。これらのリソースを使用して VM を管理するために、事前構成済みの 4 つの ClusterRole が用意されています。

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

これらの組み込みロールは、Google Distributed Cloud 上の VM ランタイムに関連するカスタム リソースに対して一般化されたアクセスモデルを提供します。各ロールには、リソースを操作するための事前設定済みの権限があります。このドキュメントでは、Google Distributed Cloud 上の VM ランタイムが管理し、クラスタ管理者が独自のアクセスモデルをカスタマイズできるようにする方法について説明します。

事前定義された ClusterRole

このセクションでは、事前に定義された各 ClusterRole について説明します。これらの ClusterRole は、Google Distributed Cloud 上の VM ランタイムが有効な場合にのみ使用できます。

  • Google Distributed Cloud で VM ランタイムを有効にすると、事前定義された 4 つの ClusterRole が自動的に作成されます。
  • Google Distributed Cloud 上の VM ランタイムを無効にすると、事前定義された 4 つの 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 の ClusterRole は直接使用できません。代わりに、これらの 3 つのロールは、それぞれ Kubernetes のデフォルトである adminviewedit の ClusterRole に集約されます。この集計により、デフォルトの Kubernetes ロールが拡張され、GKE Enterprise リソースの管理に使用できるようになります。集計された ClusterRole を使用すると、Kubernetes のデフォルト ロールを使用して、GKE Enterprise リソースへのアクセスを管理できます。または、事前定義された ClusterRole に基づいて独自のロールを作成することもできます。

集約ラベルの例

kubevm.edit ClusterRole には、それを Kubernetes edit ClusterRole に集約する rbac.authorization.k8s.io/aggregate-to-edit: "true" ラベルがあります。kubevm.edit ClusterRole の権限は、Kubernetes のデフォルトの edit ロールに付与されます。kubevm.adminkubevm.view の ClusterRole は、同様に aggregate-to-admin アノテーションまたは aggregate-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 の例をご覧ください。

名前空間が指定された編集者

名前空間が指定された編集者権限をユーザーまたはユーザーセットに付与するには、2 つの別個のバインディングを作成する必要があります。

  • 名前空間に RoleBinding を作成し、デフォルトの Kubernetes edit ClusterRole を参照します。

  • 事前定義済みの kubevm.cluster.view ClusterRole を参照する ClusterRoleBinding を作成します。virtualmachinetypesstorageclasses などの一部のリソースが名前空間ではないため、この ClusterRoleBinding が必要になります。

ロール バインディングの例(名前空間編集者)

次の 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

Namespace 閲覧者

名前空間に属する閲覧者権限を 1 人のユーザーまたは複数のユーザーに付与するには、2 つの別個のバインディングを作成する必要があります。

  • 名前空間に RoleBinding を作成し、デフォルトの Kubernetes view ClusterRole を参照します。

  • 事前定義済みの kubevm.cluster.view ClusterRole を参照する ClusterRoleBinding を作成します。

同様の RoleBinding と ClusterRoleBinding の例については、ロール バインディングの例(名前空間編集者)をご覧ください。

Google Distributed Cloud 上の VM ランタイムで使用されるリソース

以下のセクションでは、Google Distributed Cloud 上の VM ランタイムで使用されるリソースの表を示します。以下のセクションは情報提供のみを目的としています。前のセクションで説明した一般的なユーザー シナリオで事前定義ロールを使用する場合は、特にこの情報を使用する必要はありません。

ただし、事前定義済みロールを使用しない場合は、このリソース情報を使用して独自のカスタムロールを作成できます。

GKE Enterprise 定義リソース

事前定義された ClusterRole は、GKE Enterprise 定義のリソースへのアクセスに重点を置いています。次の表に、GKE Enterprise リソースと、事前定義された各 ClusterRole によって付与されるアクセス権を示します。

リソース 生成済み クラスタレベル kubevm.admin kubevm.view kubevm.edit kubevm.cluster.view
virtualmachineaccessrequests フル Read 読み取りと書き込み
virtualmachinedisks フル Read 読み取りと書き込み
virtualmachines フル Read 読み取りと書き込み
gpuallocations フル Read 読み取りと書き込み
guestenvironmentdata あり フル Read 読み取りと書き込み
vmruntimes あり フル Read 読み取りと書き込み Read
virtualmachinetypes あり フル Read 読み取りと書き込み Read
vmhighavailabilitypolicies あり フル Read 読み取りと書き込み Read
networkinterfaces あり フル Read 読み取りと書き込み
networks あり フル Read 読み取りと書き込み Read

KubeVirt リソース

Google Distributed Cloud 上の VM ランタイムは、KubeVirt オープンソース プロジェクトに基づいています。デフォルトでは、KubeVirt リソースの権限は、GKE Enterprise マネージド リソースと同様に、デフォルトの Kubernetes ロールに自動的に集約されます。次の表のリソース情報は、独自のカスタムロールを作成するときに使用してください。

リソース 生成済み クラスタレベル
virtualmachineinstances/console
virtualmachineinstances/vnc
virtualmachineinstances/portforward
virtualmachineinstances/start
virtualmachineinstances/stop
virtualmachineinstances/restart
virtualmachines あり
virtualmachineinstances あり
datavolumes
storageprofiles あり
cdiconfigs あり

Kubernetes のリソース

Google Distributed Cloud と VM で VM ランタイムを使用する場合、次の Kubernetes リソースへのアクセスを管理することが必要な場合があります。次の表のリソース情報は、独自のカスタムロールを作成するときに使用してください。

リソース 生成済み クラスタレベル
pods あり
services
persistentvolumeclaims
secrets
nodes あり
storageclasses あり
configmaps

ClusterRole YAML の例

ClusterRole の YAML は、次の kubectl コマンドを使用して取得できます。

kubectl get ClusterRole CLUSTERROLE_NAME -o yaml --kubeconfig KUBECONFIG_PATH

以下を置き換えます。

  • CLUSTERROLE_NAME: ClusterRole の名前(kubevm.cluster.view など)。
  • KUBECONFIG_PATH: クラスタの kubeconfig ファイルのパス。

事前定義された 4 つの 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