まとめ
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分くらい消耗してしまったので一応メモとして残しておく。
かなしい…