Note: kubectl auth can-i
command has an edge case / gotcha / mistake to avoid worth being aware of.
Basically a user can be named with a similar syntax to a service account, and it can trick it.
It had me tripped up for quite a while so I wanted to share it.
alias k=kubectl
k create ns dev
k create role devr --resource=pods --verb=get -n=dev
k create rolebinding devrb --role=devr --user=system:serviceaccount:dev:default -n=dev # wrong syntax
k auth can-i get pods -n=dev --as=system:serviceaccount:dev:default # right syntax
# yes
(The fact that k auth can-i said yes made me think my rolebinding was correct syntax, but it's wrong)
This is correct:
k delete ns dev
k create ns dev
k create role devr --resource=pods --verb=get -n=dev
k create rolebinding devrb --role=devr --serviceaccount=dev:default -n=dev # right syntax
k auth can-i get pods -n=dev --as=system:serviceaccount:dev:default # right syntax
# yes
Here is visual proof of how it's wrong:
k create rolebinding devrb1 --role=devr --user=system:serviceaccount:dev:default -n=dev --dry-run=client -o yaml | grep subjects -A 4
# subjects:
# - apiGroup: rbac.authorization.k8s.io
# kind: User
# name: system:serviceaccount:dev:default
k create rolebinding devrb2 --role=devr --serviceaccount=dev:default -n=dev --dry-run=client -o yaml | grep subjects -A 4
# subjects:
# - kind: ServiceAccount
# name: default
# namespace: dev
If ever in doubt about syntax for imperative rbac commands, here's a fast way to look it up:
- kubernetes.io/docs
- search "rbac"
- control+f "kubectl create rolebinding" on the page to get example of correct syntax.