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 throughmicrok8s 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
以上です。ドキュメントを読むのは大切なんだということを改めて感じました。。