はじめに
Kubernetesクラスタでは、ロールベースのアクセス制御(RBAC)がクラスタ内のリソースと操作へのアクセスを制御するために使用されます。RBACを使うことで、クラスタ管理者はユーザー、グループ、サービスアカウントに対するロールと権限を定義して、クラスタ内のリソースと操作へのアクセスを制御できます。この実験では、Kubernetesクラスタ内のリソースへのアクセスを制御するためにRBACをどのように使うかを学びます。
💡 このチュートリアルは英語版からAIによって翻訳されています。原文を確認するには、 ここをクリックしてください
Kubernetesクラスタでは、ロールベースのアクセス制御(RBAC)がクラスタ内のリソースと操作へのアクセスを制御するために使用されます。RBACを使うことで、クラスタ管理者はユーザー、グループ、サービスアカウントに対するロールと権限を定義して、クラスタ内のリソースと操作へのアクセスを制御できます。この実験では、Kubernetesクラスタ内のリソースへのアクセスを制御するためにRBACをどのように使うかを学びます。
リソースを作成する前に、動作中のKubernetesクラスタが必要です。Minikubeは、ローカルマシン上で動作する軽量のKubernetes環境です。
作業ディレクトリに移動する:
ターミナルを開き、デフォルトのプロジェクトフォルダに移動します。
cd /home/labex/project
Minikubeを起動する:
Minikubeを起動してKubernetesクラスタを初期化します。
minikube start
Minikubeが動作していることを確認する:
Minikubeクラスタの状態を確認します。
minikube status
kubelet
や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をどのように使用するかを十分に理解しているはずです。