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

KubernetesKubernetesIntermediate
今すぐ練習

💡 このチュートリアルは英語版からAIによって翻訳されています。原文を確認するには、 ここをクリックしてください

はじめに

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


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL kubernetes(("Kubernetes")) -.-> kubernetes/BasicsGroup(["Basics"]) kubernetes(("Kubernetes")) -.-> kubernetes/BasicCommandsGroup(["Basic Commands"]) kubernetes(("Kubernetes")) -.-> kubernetes/AdvancedCommandsGroup(["Advanced Commands"]) kubernetes/BasicsGroup -.-> kubernetes/initialization("Initialization") kubernetes/BasicCommandsGroup -.-> kubernetes/get("Get") kubernetes/BasicCommandsGroup -.-> kubernetes/create("Create") kubernetes/BasicCommandsGroup -.-> kubernetes/delete("Delete") kubernetes/AdvancedCommandsGroup -.-> kubernetes/apply("Apply") subgraph Lab Skills kubernetes/initialization -.-> lab-9203{{"Kubernetes でのロールベースのアクセス制御"}} kubernetes/get -.-> lab-9203{{"Kubernetes でのロールベースのアクセス制御"}} kubernetes/create -.-> lab-9203{{"Kubernetes でのロールベースのアクセス制御"}} kubernetes/delete -.-> lab-9203{{"Kubernetes でのロールベースのアクセス制御"}} kubernetes/apply -.-> lab-9203{{"Kubernetes でのロールベースのアクセス制御"}} end

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をどのように使用するかを十分に理解しているはずです。