ServiceAccount を作成し、Pod から kubectl get pods
をやってみた時のメモ。
検証のため、マニュフェスト作成はせず、コマンドでベースで確認した。
やってみる
環境
$kubectl version
Client Version: version.Info{Major:"1", Minor:"16+", GitVersion:"v1.16.6-beta.0", GitCommit:"e7f962ba86f4ce7033828210ca3556393c377bcc", GitTreeState:"clean", BuildDate:"2020-01-15T08:26:26Z", GoVersion:"go1.13.5", Compiler:"gc", Platform:"darwin/amd64"}
Server Version: version.Info{Major:"1", Minor:"15+", GitVersion:"v1.15.11-eks-af3caf", GitCommit:"af3caf6136cd355f467083651cc1010a499f59b1", GitTreeState:"clean", BuildDate:"2020-03-27T21:51:36Z", GoVersion:"go1.12.17", Compiler:"gc", Platform:"linux/amd64"}
サービスアカウントの作成
kubectl create serviceaccount
コマンドで実行
$kubectl create serviceaccount sample-service-account
Role の作成
ただ、この状態では何も権限がないので Pod を確認するための Role を作る。
今回は検証なので以下を参考に kubectl create
コマンドで作る
$kubectl create role pod-reader --verb=get --verb=list --verb=watch --resource=pods
RoleBinding の作成
次に上記ロールと作成したサービスアカウントを紐付けるために RoleBinding を作成する。
以下と kubectl create rolebinding --help
を参考に実行。
$kubectl create rolebinding default-view \
--role=pod-reader \
--serviceaccount=default:sample-service-account
確認
Pod を作って検証する
kubectl run
で --serviceaccount
も指定できるのでこれでやってみる。
イメージは kubectl
が既にインストールされいる以下のイメージを使う
$kubectl run -i kubectl --image=lachlanevenson/k8s-kubectl --serviceaccount=sample-service-account --generator=run-pod/v1 --rm --restart=Never --command -- kubectl get pods
NAME READY STATUS RESTARTS AGE
kubectl 0/1 ContainerCreating 0 4s
(以下略)
無事 Pod の情報が取得できる事を確認。
念の為、--serviceaccount
を指定しない場合、失敗することも確認する。
$kubectl run -i kubectl --image=lachlanevenson/k8s-kubectl --generator=run-pod/v1 --rm --restart=Never --command -- kubectl get pods
If you don't see a command prompt, try pressing enter.
Error attaching, falling back to logs: unable to upgrade connection: container kubectl not found in pod kubectl_default
Error from server (Forbidden): pods is forbidden: User "system:serviceaccount:default:default" cannot list resource "pods" in API group "" in the namespace "default"
pod "kubectl" deleted
pod default/kubectl terminated (Error)
サービスアカウントを指定しない場合でも default
というサービスアカウントが設定されているようだが、この場合、権限がないのでエラーになる。