Aide-mémoire CKAD
exemple YAML RBAC k8s
Créer un ServiceAccount ne donne rien. Binder un Role, puis vérifier avec can-i.
kubectl create role pod-read -n app --verb=get,list,watch --resource=pods
kubectl create rolebinding pod-read -n app --role=pod-read --serviceaccount=app:api
kubectl auth can-i list pods -n app --as=system:serviceaccount:app:api
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
name: pod-read
namespace: app
rules:
- apiGroups: [""]
resources: ["pods"]
verbs: ["get", "list", "watch"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: pod-read
namespace: app
subjects:
- kind: ServiceAccount
name: api
namespace: app
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: Role
name: pod-read
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: pod-read
rules:
- apiGroups: [""]
resources: ["pods"]
verbs: ["get", "list", "watch"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: pod-read
subjects:
- kind: ServiceAccount
name: api
namespace: app
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: pod-read
Champs
- verbs
- get, list, watch, create, update, patch, delete. list n’est pas get.
- resources
- pods, pas Pod. pods/log et pods/status sont des sous-ressources.
- roleRef
- kind : Role ou ClusterRole. name doit exister. apiGroup : rbac.authorization.k8s.io.
- subjects
- kind ServiceAccount veut name et namespace. User et Group non.
- kubectl create role
- --verb et --resource. Puis binder. Le Role seul ne fait rien.
- kubectl auth can-i
- --as=system:serviceaccount:ns:sa. C’est le check que l’examen veut.
Pièges
- Un Role est namespacé. Un ClusterRole est cluster. Le kind du Binding doit matcher l’objet créé.
- resources : ["pods"] — minuscule, pluriel. apiGroups : [""] pour le core. apps pour les Deployments.
- can-i sans --as vous teste vous, pas le SA. Utiliser --as=system:serviceaccount:<ns>:<sa>.
Doc officielle RBAC