MicroK8sへのユーザー追加と権限付与でハマった話

MicroK8s上にユーザーを作成して権限を付与するときにハマった内容を共有します。MicroK8sのインストールは、MicroK8sをMacOSにインストールしてみるで紹介していますので、よろしければご参照ください。

  • はじめに
  • ユーザーの作成
  • コンテキストの作成
  • RBAC機能の有効化
  • 権限の付与

はじめに


本記事では、MicroK8sに以下の実装を行う上で発生した事象を紹介します。

  • MicroK8sクラスターに、system:authenticatedとdeveloperグループに所属するdev-user01ユーザーを作成する
  • developerグループにdefaultネームスペースの権限を付与する

ユーザーの作成


「system:authenticated」と「developer」グループに所属する「dev-user01」ユーザーを作成します。

Kubernetesでユーザーを作成する場合は何通りかあり、公式ドキュメントに説明があります。その中で、MicroK8sのデフォルトユーザー(admin)は「Static Password File」を使って作成していますので、今回も同じ方法を使います。

ユーザー情報が記載されているbasic_auth.csvは/var/snap/microk8s/current/credentials/配下にあります。中身を確認すると、[Password], [User], [Uid], "[Group1], [Group2], ..."というフォーマットでadminユーザーの情報が保管されています。同じフォーマットで、以下のようにdev-user01ユーザーを入力します。

$ cat /var/snap/microk8s/current/credentials/basic_auth.csv 
[adminのPassword],admin,admin,"system:masters"
[dev-user01のPassword],dev-user01,dev-user01,"system:authenticated,developer"

ファイル更新後は、以下のコマンドでMicroK8sを再起動します。

$ microk8s.stop
$ microk8s.start

以上で、ユーザーの作成が完了しました。

コンテキストの作成


上記で作成したユーザーがクラスターにログインするためのコンテキストを作成します。~/.kube/configファイルを以下の通り編集し、dev-user01でクラスターにアクセスするmicrok8s-developerコンテキストを作成します。

apiVersion: v1
clusters:
- cluster:
    insecure-skip-tls-verify: true
    server: https://127.0.0.1:16443
  name: microk8s-cluster
contexts:
- context:
    cluster: microk8s-cluster
    user: admin
  name: microk8s
- context:
    cluster: microk8s-cluster
    user: dev-user01
  name: microk8s-developer
current-context: microk8s-developer
kind: Config
preferences: {}
users:
- name: admin
  user:
    password: [adminのPassword]
    username: admin
- name: dev-user01
  user:
    password: [dev-user01のPassword]
    username: dev-user01

~/.kube/configはkubectlコマンドをmultipass-vmにインストールしてる場合のみになります。microk8s.kubectlコマンドを利用したい場合は、/var/snap/microk8s/current/credentials/client.configにコンテキストとユーザーを追加します。

コンテキストを切り替えてコマンドを実行してみると、コマンドが実行できるようになったのですが、なぜか最初から権限が付与されています。まだ権限を付与していないので、本来であればError from server (Forbidden)というエラーが返ってくるはずなのですが。。。

$ kc config use-context microk8s-developer 
Switched to context "microk8s-developer".
$ kc get pods
No resources found in default namespace.
$ kc auth can-i get pods -n default
yes

作成方法が違うのかなと思い、以下のURLで紹介されているX509 Client Certsを使った作成方法を試しましたが、結果は同じでした。。以下のURLはものすごく綺麗にまとまってくださっていて、Error from server (Forbidden)のエラーが出るところまで記載されていたので、やはりこの挙動はおかしいと確信しました。

RBAC機能の有効化


これはMicroK8sの仕様かなと思い、ドキュメントを確認したところ以下の記載がありました。

By default all authenticated requests are authorized as the api-server runs with --authorization-mode=AlwaysAllow. Turning on RBAC is done through microk8s enable rbac.

ああ、本当に自分ってセンスがないなと感じた瞬間でした。。

簡単に翻訳すると、「MicroK8sはデフォルトで全ての権限が付与されることになっているので、RBAC機能を使いたい場合は有効化してください。」とあります。ということで、以下のコマンドを使ってRBAC機能を有効化します。

$ microk8s.status | grep rbac
rbac: disabled
$ microk8s.enable rbac
Enabling RBAC
Reconfiguring apiserver
RBAC is enabled
$ microk8s.status | grep rbac
rbac: enabled

もう一度コマンドを実行すると期待していたError from server (Forbidden)が出ました。

$ kc config use-context microk8s-developer
Switched to context "microk8s-developer".
$ kc get pods
Error from server (Forbidden): pods is forbidden: User "dev-user01" cannot list resource "pods" in API group "" in the namespace "default"

権限の付与


developerグループにdefautネームスペースの権限を付与します。

権限を付与する場合は、RoleとRoleBindingを作成する必要があります。defaultネームスペースでの操作権限(クラスター操作は除く)を持ったdefault-roleと、それをdeveloperグループに紐づけるdefault-role-for-developerを作成します。それぞれのyamlを以下に示します。

kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: default-role
rules:
- apiGroups: ["*"]
  resources: ["*"]
  verbs: ["*"]
---
kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: default-role-for-developer
subjects:
- kind: Group
  name: developer
  apiGroup: rbac.authorization.k8s.io
roleRef:
  kind: Role
  name: default-role
  apiGroup: rbac.authorization.k8s.io

以下のコマンドでdefault-roleとdefault-role-for-developerを作成します。(作成するときはadminユーザーに切り替えています。)

$ kc create -f role.yaml 
role.rbac.authorization.k8s.io/default-role created
rolebinding.rbac.authorization.k8s.io/default-role-for-developer created

再度確認すると、Error from server (Forbidden)が解消されました。

$ kc config use-context microk8s-developer 
Switched to context "microk8s-developer".
$ kc get pods
No resources found in default namespace.
$ kc auth can-i get pods -n default
yes

他のネームスペースには権限を与えていないので、以下のようにエラーが表示されました。期待通りです。

$ kc get pods -n kube-system
Error from server (Forbidden): pods is forbidden: User "dev-user01" cannot list resource "pods" in API group "" in the namespace "kube-system"
$ kc auth can-i get pods -n kube-system
no

以上です。ドキュメントを読むのは大切なんだということを改めて感じました。。