はじめに
Kubernetes クラスタでは、ロールベースのアクセス制御(RBAC)がクラスタ内のリソースと操作へのアクセスを制御するために使用されます。RBAC を使うことで、クラスタ管理者はユーザー、グループ、サービスアカウントに対するロールと権限を定義して、クラスタ内のリソースと操作へのアクセスを制御できます。この実験では、Kubernetes クラスタ内のリソースへのアクセスを制御するために RBAC をどのように使うかを学びます。
Minikube クラスタを起動する
リソースを作成する前に、動作中の Kubernetes クラスタが必要です。Minikube は、ローカルマシン上で動作する軽量の Kubernetes 環境です。
作業ディレクトリに移動する:
ターミナルを開き、デフォルトのプロジェクトフォルダに移動します。
cd /home/labex/projectMinikube を起動する:
Minikube を起動して Kubernetes クラスタを初期化します。
minikube start- このコマンドは、ローカルマシン上に単一ノードの Kubernetes クラスタをセットアップします。
- Minikube の起動には、システムの性能に応じて数分かかる場合があります。
Minikube が動作していることを確認する:
Minikube クラスタの状態を確認します。
minikube statuskubeletやapiserverなどのコンポーネントが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 をどのように使用するかを十分に理解しているはずです。


