まとめ
kubectl --asでService Accountを使いたいときはsystem:serviceaccount:(NAMESPACE):(SERVICEACCOUNT)を指定すると良い。
# resourceに対するverbが許可されているかチェック
kubectl auth can-i <verb> <resource> -n <namespace> --as system:serviceaccount:<namespace>:<serviceAccountName>
# ServiceAccountに許可されたresource, verbをリストで表示
kubectl auth can-i --list -n <namespace> --as system:serviceaccount:<namespace>:<serviceAccountName>環境
- kind
- v0.11.0 go1.16.4 darwin/amd64
- Kubernetes
- v1.21.1
もくじ
間違えていた
Service Accountにこんな感じの権限を設定していたとする。
# namespace(myhome)のservice account(sotochan)がnamespace: myhomeのpodに対して何でもできる権限を付与
$ kubectl create namespace myhome
$ kubectl create serviceaccount sotochan -n myhome
$ kubectl create role pod-owner --verb="*" --resource="pods" -n myhome
$ kubectl create rolebinding pod-owner-bind --role=pod-owner --serviceaccount=myhome:sotochanこのとき、kubectl auth can-iでService Accountの権限を確認しようとしたらうまくいかなかった。
# どうして...
$ kubectl auth can-i get pod -n myhome --as sotochan
no
$ kubectl auth can-i --list -n myhome --as sotochan | grep -c pod
0正しいやり方
公式ドキュメントをテキトーに探してもよくわからず"わからん!わからん!“って騒いでいたら会社の素晴らしい同期が教えてくれた。
--asでService Accountを指定する場合はsystem:serviceaccount:(NAMESPACE):(SERVICEACCOUNT)と指定すればいいらしい。
# やったぜ。
$ kubectl auth can-i get pod -n myhome --as system:serviceaccount:myhome:sotochan
yes
$ kubectl auth can-i --list -n myhome --as system:serviceaccount:myhome:sotochan | grep pod
pods [] [] [*]落ち着いて探したら公式ドキュメントにも一応関連する情報が書いてあった。Service Accountのユーザー名がそもそもsystem:serviceaccount:(NAMESPACE):(SERVICEACCOUNT)として扱われているらしい。1
知らなかった…😭
おわり
Service Accountについてちゃんと理解してればこんなところで詰まらないとは思うけど、
公式ドキュメントでkubectl --asでService Accountを指定する例が見つけづらかった+自分は30分くらい消耗してしまったので一応メモとして残しておく。
かなしい…
おまけ

