Aide-mémoire CKAD

exemple YAML RBAC k8s

Créer un ServiceAccount ne donne rien. Binder un Role, puis vérifier avec can-i.

Un officier autorise un trooper à passer un couloir de portes marquées Privilege Locked. Un officier autorise un trooper à passer un couloir de portes marquées Privilege Locked.
Créer
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
Role + RoleBinding
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
ClusterRole + ClusterRoleBinding
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

S’entraîner sur un cluster réel →