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

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

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

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

事前定義された ClusterRole

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

  • GDC 上の VM ランタイムを有効にすると、4 つの事前定義 ClusterRole が自動的に作成されます。
  • GDC 上の VM ランタイムを無効にすると、この 4 つの事前定義 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 クラスタレベルのリソースに対する読み取りアクセス権を付与します。このクラスタロールが必要となるのは、編集 / 閲覧のロールが Namespace にバインドされた状態でクラスタレベルのリソースへのアクセス権が必要となる場合です。
  • get
  • list
  • watch

集約された ClusterRole

kubevm.admin、kubevm.view、kubevm.edit の ClusterRole は、直接は使用できません。これらの 3 つのロールは、Kubernetes のデフォルトである admin、view、edit の ClusterRole にそれぞれ集約されます。この集計により、デフォルトの Kubernetes ロールが拡張され、GKE リソースの管理に使用できるようになります。集計された ClusterRole を使用すると、Kubernetes のデフォルト ロールを使用して、GKE リソースへのアクセスを管理できます。また、事前定義された ClusterRole に基づいて独自のロールを作成することもできます。

集約ラベルの例

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

Namespace が指定された編集者

Namespace が指定された編集者権限をユーザーまたはユーザーのグループに付与するには、次のように、個別のバインディングを 2 つ作成する必要があります。

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

  • 事前定義 kubevm.cluster.view ClusterRole を参照する ClusterRoleBinding を作成します。virtualmachinetypes や storageclasses などの一部のリソースは Namespace が指定されていないため、この ClusterRoleBinding が必要になります。

ロール バインディングの例(Namespace が指定された編集者)

次の RoleBinding と ClusterRoleBinding の例では、default Namespace 内のリソースに対する編集者権限をユーザー 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 閲覧者

Namespace が指定された閲覧者の権限をユーザーまたはユーザーのグループに付与するには、次のように、個別のバインディングを 2 つを作成する必要があります。

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

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

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

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

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

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

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 ランタイムは、KubeVirt オープンソース プロジェクトに基づいています。デフォルトでは、KubeVirt リソースの権限は、GKE マネージド リソースと同様に、デフォルトの Kubernetes ロールに自動的に集約されます。次の表のリソース情報は、独自のカスタムロールの作成に使用できます。

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

Kubernetes のリソース

GDC 上の 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