Kubernetes でのロールベースのアクセス制御

KubernetesBeginner
オンラインで実践に進む

はじめに

Kubernetes クラスタでは、ロールベースのアクセス制御(RBAC)がクラスタ内のリソースと操作へのアクセスを制御するために使用されます。RBAC を使うことで、クラスタ管理者はユーザー、グループ、サービスアカウントに対するロールと権限を定義して、クラスタ内のリソースと操作へのアクセスを制御できます。この実験では、Kubernetes クラスタ内のリソースへのアクセスを制御するために RBAC をどのように使うかを学びます。

Minikube クラスタを起動する

リソースを作成する前に、動作中の Kubernetes クラスタが必要です。Minikube は、ローカルマシン上で動作する軽量の Kubernetes 環境です。

  1. 作業ディレクトリに移動する:

    ターミナルを開き、デフォルトのプロジェクトフォルダに移動します。

    cd /home/labex/project
    
  2. Minikube を起動する:

    Minikube を起動して Kubernetes クラスタを初期化します。

    minikube start
    
    • このコマンドは、ローカルマシン上に単一ノードの Kubernetes クラスタをセットアップします。
    • Minikube の起動には、システムの性能に応じて数分かかる場合があります。
  3. Minikube が動作していることを確認する:

    Minikube クラスタの状態を確認します。

    minikube status
    
    • kubeletapiserverなどのコンポーネントがRunningと表示されていることを確認します。
    • クラスタが動作していない場合は、minikube startを再度実行します。

Minikube の起動に問題がある場合は、必要に応じてminikube deleteを使用して環境をリセットします。

ネームスペースを作成する

次のコマンドを使用して、myappという新しいネームスペースを作成します。

kubectl create namespace myapp

ロールを作成する

次の YAML ファイルmyapp-reader-role.yamlを使用して、myappネームスペース内にmyapp-readerという新しいロールを作成します。このロールは、ネームスペース内のポッドとサービスを読み取ることができるユーザーを許可します。

kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  namespace: myapp
  name: myapp-reader
rules:
  - apiGroups: [""]
    resources: ["pods", "services"]
    verbs: ["get", "watch", "list"]

このロールは、myappネームスペース内のポッドとサービスを読み取る(取得、監視、一覧表示)ことができるユーザーを許可します。

次のコマンドを使用してロールを作成します。

kubectl apply -f myapp-reader-role.yaml

ロールバインディングを作成する

myappネームスペース内のユーザーまたはグループにmyapp-readerロールをバインドするロールバインディングを作成します。たとえば、myappネームスペース内のdeveloperユーザーにmyapp-readerロールをバインドするには、次の YAML ファイルmyapp-reader-binding.yamlを作成します。

kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: myapp-reader-binding
  namespace: myapp
subjects:
  - kind: User
    name: developer
    apiGroup: rbac.authorization.k8s.io
roleRef:
  kind: Role
  name: myapp-reader
  apiGroup: rbac.authorization.k8s.io

このロールバインディングは、myappネームスペース内のdeveloperユーザーにmyapp-readerロールをバインドします。

次のコマンドを使用してロールバインディングを作成します。

kubectl apply -f myapp-reader-binding.yaml

アクセスをテストする

次のコマンドを使用して、myappネームスペース内のポッドの一覧を取得して、myappネームスペースへのアクセスをテストします。

kubectl get pods -n myapp --as developer

クラスタ内にポッドがない場合があるため、myappネームスペース内にはリソースがない旨のメッセージが表示されるはずです。実験が終わったら、このコマンドを使用すると、myappネームスペース内のポッドの一覧が表示されます。

次のコマンドを使用して、defaultネームスペースへのアクセスをテストします。

kubectl get pods --as developer

defaultネームスペースへのアクセスがない旨のエラーメッセージが表示されるはずです。

クラスターロールを作成する

次の YAML ファイルmyapp-admin-clusterrole.yamlを使用して、myapp-adminという新しいクラスターロールを作成します。このクラスターロールは、ユーザーにすべてのネームスペース内のポッドとサービスを作成、削除、および更新する許可を与えます。

kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: myapp-admin
rules:
  - apiGroups: [""]
    resources: ["pods", "services"]
    verbs: ["get", "list", "watch", "create", "update", "delete"]

このクラスターロールは、ユーザーにすべてのネームスペース内のポッドとサービスに対してすべての操作(取得、一覧表示、監視、作成、更新、および削除)を実行する許可を与えます。

次のコマンドを使用してクラスターロールを作成します。

kubectl apply -f myapp-admin-clusterrole.yaml

クラスターロールバインディングを作成する

クラスタ内のユーザーまたはグループにmyapp-adminクラスターロールをバインドするクラスターロールバインディングを作成します。たとえば、myapp-adminクラスターロールをcluster-adminユーザーにバインドするには、次の YAML ファイルmyapp-admin-binding.yamlを作成します。

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

このクラスターロールバインディングは、myapp-adminクラスターロールをcluster-adminユーザーにバインドします。

次のコマンドを使用してクラスターロールバインディングを作成します。

kubectl apply -f myapp-admin-binding.yaml

アクセスをテストする

次の YAML ファイルmyapp-pod.yamlを使用してポッドを作成することで、myappネームスペース内でポッドを作成するためのアクセスをテストします。

apiVersion: v1
kind: Pod
metadata:
  name: myapp-pod
  namespace: myapp
spec:
  containers:
    - name: myapp-container
      image: nginx
      ports:
        - containerPort: 80

次のコマンドを使用してポッドを作成します。

kubectl apply -f myapp-pod.yaml --as cluster-admin

ポッドが作成されたことを示すメッセージが表示されるはずです。

次の YAML ファイルmyapp-deployment.yamlを使用してデプロイメントを作成することで、myappネームスペース内でデプロイメントを作成するためのアクセスをテストします。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: myapp-deployment
  namespace: myapp
spec:
  replicas: 1
  selector:
    matchLabels:
      app: myapp-deployment
  template:
    metadata:
      labels:
        app: myapp-deployment
    spec:
      containers:
        - name: nginx
          image: nginx:latest
          ports:
            - containerPort: 80

次のコマンドを使用してポッドを作成します。

kubectl apply -f myapp-deployment.yaml --as cluster-admin

myappネームスペース内でデプロイメントを作成するためのアクセスがないことを示すエラーメッセージが表示されるはずです。

まとめ

この実験では、Kubernetes におけるロールベースのアクセス制御(RBAC)を使用して、クラスタ内のリソースと操作へのアクセスを制御する方法を学びました。特定のネームスペース内のリソースへのアクセスを制御するために、ネームスペース、ロール、およびロールバインディングを作成しました。また、すべてのネームスペースにわたるリソースへのアクセスを制御するために、クラスターロールとクラスターロールバインディングを作成しました。この実験が終了するまでに、Kubernetes クラスタ内のリソースと操作へのアクセスを制御するために RBAC をどのように使用するかを十分に理解しているはずです。