ЁЯПл The SchoolтА║тШ╕я╕П KubernetesтА║ЁЯкк рдзрдбрд╛ 17 тАФ RBAC рдЖрдгрд┐ ServiceAccounts: hall passes
ЁЯЦ╝я╕П See the drawing + lab ЁЯПа Course home ЁЯМ┐ Branch on GitHub тЬПя╕П View source
ЁЯЦ╝я╕П рдЖрдХреГрддреА рдЖрдгрд┐ labThe drawing + lab рдкреВрд░реНрдг рдкрд╛рдирд╛рд╡рд░ рдЙрдШрдбрд╛ тЖЧOpen full page тЖЧ

ЁЯкк рдзрдбрд╛ 17 тАФ RBAC рдЖрдгрд┐ ServiceAccounts: hall passes

ЁЯУН рддреБрдореНрд╣реА рдЗрдереЗ рдЖрд╣рд╛рдд: рдзрдбрд╛ 17 / 26 ┬╖ рдорд╛рдЧреАрд▓: lesson-16-debugging ┬╖ рдкреБрдвреАрд▓: lesson-18-jobs-cronjobs


ЁЯУж рдпрд╛ рдмреНрд░рдБрдЪрдордзреНрдпреЗ рдХрд╛рдп рдЖрд╣реЗ

рдЖрдзреАрдЪреЗ рд╕рдЧрд│реЗ, рдЖрдгрд┐: cluster рдЪреНрдпрд╛ рдЖрдд рдХреЛрдг рдХрд╛рдп рдХрд░реВ рд╢рдХрддреЗ тАФ RBAC тАФ рдЖрдгрд┐ pods рд╕рд╛рдареА рдУрд│рдЦрдкрддреНрд░реЗ: ServiceAccounts.

ЁЯзТ 5 рд╡рд░реНрд╖рд╛рдВрдЪреНрдпрд╛ рдореБрд▓рд╛рд▓рд╛ рд╕рдордЬрд╛рд╡рд▓реНрдпрд╛рд╕рд╛рд░рдЦреЗ

AWS рдХреЛрд░реНрд╕рдиреЗ рд▓реЛрдХрд╛рдВрдирд╛ cloud рд╕рд╛рдареА рдУрд│рдЦрдкрддреНрд░реЗ рджрд┐рд▓реА (IAM). рдкрдг рд╢рд╛рд│реЗрдЪреНрдпрд╛ рдЗрдорд╛рд░рддреАрдЪреНрдпрд╛ рдЖрдд рджреБрд╕рд░реА рд╡реНрдпрд╡рд╕реНрдерд╛ рдЖрд╣реЗ: hall passes ЁЯкк.

IAM рд╕рд╛рд░рдЦреЗрдЪ рдХрдбрдХ рдирд┐рдпрдо: рдкрд╛рд╕ рдкрд░рд╡рд╛рдирдЧреА рджреЗрдд рдирд╛рд╣реА рддреЛрдкрд░реНрдпрдВрдд рдХрд╛рд╣реАрдЪ allowed рдирд╛рд╣реА, рдЖрдгрд┐ рдкрд╛рд╕рдиреЗ рдХрд╛рдорд╛рд▓рд╛ рд▓рд╛рдЧрддреАрд▓ рддреЗрд╡рдвреЗрдЪ рджрд░рд╡рд╛рдЬреЗ рдЙрдШрдбрд▓реЗ рдкрд╛рд╣рд┐рдЬреЗрдд. рддреБрдордЪреНрдпрд╛ CI robot рд▓рд╛ "school рдордзреНрдпреЗ manifests apply рдХрд░рдгреЗ" рд▓рд╛рдЧрддреЗ тАФ cluster-admin рдирд╛рд╣реА. Cluster-admin рдЕрд╕рд▓реЗрд▓рд╛ CI рдореНрд╣рдгрдЬреЗ рдкреБрдиреНрд╣рд╛ рддреАрдЪ photocopy рдХреЗрд▓реЗрд▓реА master key. ЁЯЧЭя╕ПЁЯШ▒

(рдЖрдгрд┐ рджреЛрдиреНрд╣реА рдЬрдЧрд╛рдВрдордзрд▓рд╛ рдкреВрд▓: EKS рд╡рд░, ServiceAccount рд▓рд╛ IAM role рд╢реА рдЬреЛрдбрддрд╛ рдпреЗрддреЗ тАФ IRSA тАФ рдореНрд╣рдгрдЬреЗ pod рд▓рд╛ AWS рдЯреЛрдкреА рдШрд╛рд▓рддрд╛ рдпреЗрддреЗ. рдЖрдд hall pass, рдмрд╛рд╣реЗрд░ bank badge, рдХреБрдареЗрдЪ keys рдирд╛рд╣реАрдд.)

ЁЯЧ║я╕П рдЖрдХреГрддреА

flowchart LR
    who["ЁЯСе who<br/>person ┬╖ group ┬╖<br/>ЁЯдЦ ServiceAccount (pod's card)"]
    rb["ЁЯФЧ RoleBinding<br/>hands the pass over"]
    role["ЁЯкк Role<br/>verbs on resources in ONE room:<br/>get/list pods, create deployments"]
    cr["ЁЯПл ClusterRole<br/>same, building-wide"]
    api["ЁЯзСтАНЁЯТ╝ API server checks the pass<br/>on EVERY request"]
    who --> rb --> role --> api
    rb -.-> cr

тЭУ рдХрд╛рдп

ЁЯдФ рдХрд╛

Cluster рдЪрд╛ API рддреНрдпрд╛рд╡рд░ рдЪрд╛рд▓рдгрд╛рд▒реНрдпрд╛ рд╕рдЧрд│реНрдпрд╛рд╡рд░ root рдЖрд╣реЗ. RBAC рдореНрд╣рдгрдЬреЗ "intern рдЪреА leak рдЭрд╛рд▓реЗрд▓реА kubeconfig рдПрдХ namespace рд╡рд╛рдЪреВ рд╢рдХрддреЗ" рдЖрдгрд┐ "intern рдЪреА leak рдЭрд╛рд▓реЗрд▓реА kubeconfig рдореНрд╣рдгрдЬреЗрдЪ cluster" рдпрд╛рдВрддрд▓рд╛ рдлрд░рдХ. Teams рди рдШрд╛рдмрд░рддрд╛ рдПрдХ cluster рд╡рд╛рдЯреВрди рдШреЗрддрд╛рдд рддреЗ рдпрд╛рдореБрд│реЗрдЪ (L05 рдЪреЗ namespaces + RBAC = рдЦрд░реА multi-tenancy).

ЁЯзк рдХрд░реВрди рдкрд╛рд╣рд╛

# what can YOU do? (local clusters: everything тАФ you're cluster-admin)
kubectl auth can-i delete namespaces && kubectl auth can-i list pods -n school

# make a robot card + a one-room pass + hand it over:
kubectl -n school create serviceaccount report-bot
kubectl -n school create role pod-reader --verb=get,list --resource=pods
kubectl -n school create rolebinding report-bot-reads \
  --role=pod-reader --serviceaccount=school:report-bot

# test the pass WITHOUT wearing it:
kubectl auth can-i list pods -n school --as=system:serviceaccount:school:report-bot   # yes
kubectl auth can-i delete pods -n school --as=system:serviceaccount:school:report-bot # no ЁЯОЙ
kubectl auth can-i list secrets -n school --as=system:serviceaccount:school:report-bot # no!

# cleanup:
kubectl -n school delete rolebinding report-bot-reads
kubectl -n school delete role pod-reader && kubectl -n school delete sa report-bot

ЁЯФз рдпрд╛ рдзрдбреНрдпрд╛рд╕рд╛рдареА kubectl

kubectl auth can-i ┬╖ kubectl get role,rolebinding,sa

ЁЯФЧ рдпрд╛рд╡рд░ рдЖрдзрд╛рд░рд┐рдд: ЁЯкк AWS L03тАУL04 (policies рдЖрдгрд┐ roles тАФ рддреАрдЪ рдХрд▓реНрдкрдирд╛)

тЬЕ рддрдкрд╛рд╕рд╛ тАФ рддреБрдореНрд╣рд╛рд▓рд╛ рдХрд╛рдп рджрд┐рд╕рд▓реЗ рдкрд╛рд╣рд┐рдЬреЗ

kubectl auth can-i get pods --as=system:serviceaccount:school:reader рд╣реЛ рдореНрд╣рдгрддреЗ; --as=тАж delete рдирд╛рд╣реА рдореНрд╣рдгрддреЗ.

ЁЯз╣ рд╕рд╛рдлрд╕рдлрд╛рдИ

рддреБрдореНрд╣реА рдмрдирд╡рд▓реЗрд▓реЗ kubectl delete rolebinding,role тАж

тЪая╕П рдиреЗрд╣рдореАрдЪреНрдпрд╛ рдЪреБрдХрд╛

тПня╕П рдкреБрдвреЗ

рдПрдХрджрд╛рдЪ рдЪрд╛рд▓рдгрд╛рд░реЗ рдХрд╛рдо рдЖрдгрд┐ рд╡реЗрд│рд╛рдкрддреНрд░рдХрд╛рдиреБрд╕рд╛рд░ рдЪрд╛рд▓рдгрд╛рд░реЗ рдХрд╛рдо тАФ рдпрд╛рдд рд╣рд╛ repo рддреНрдпрд╛рдЪреНрдпрд╛ README рдкрд╛рд╕реВрди рд╡рдЪрди рджреЗрдд рдЖрд▓реЗрд▓рд╛ backup CronJob рд╕реБрджреНрдзрд╛: Jobs рдЖрдгрд┐ CronJobs.

git checkout lesson-18-jobs-cronjobs

ЁЯкк Lesson 17 тАФ RBAC & ServiceAccounts: hall passes

ЁЯУН You are here: Lesson 17 of 26 ┬╖ Previous: lesson-16-debugging ┬╖ Next: lesson-18-jobs-cronjobs


ЁЯУж What's in this branch

Everything before, plus: who may do what inside the cluster тАФ RBAC тАФ and identity cards for pods: ServiceAccounts.

ЁЯзТ Explain like I'm 5

The AWS course gave people ID cards for the cloud (IAM). But inside the school building there's a second system: hall passes ЁЯкк.

Same iron rules as IAM: nothing is allowed until a pass says so, and the pass should open exactly the doors the job needs. Your CI robot needs "apply manifests in school" тАФ not cluster-admin. Cluster-admin CI is the photocopied master key all over again. ЁЯЧЭя╕ПЁЯШ▒

(And the bridge between worlds: on EKS, a ServiceAccount can be linked to an IAM role тАФ IRSA тАФ so a pod can wear an AWS hat. Hall pass inside, bank badge outside, zero keys anywhere.)

ЁЯЧ║я╕П Diagram

flowchart LR
    who["ЁЯСе who<br/>person ┬╖ group ┬╖<br/>ЁЯдЦ ServiceAccount (pod's card)"]
    rb["ЁЯФЧ RoleBinding<br/>hands the pass over"]
    role["ЁЯкк Role<br/>verbs on resources in ONE room:<br/>get/list pods, create deployments"]
    cr["ЁЯПл ClusterRole<br/>same, building-wide"]
    api["ЁЯзСтАНЁЯТ╝ API server checks the pass<br/>on EVERY request"]
    who --> rb --> role --> api
    rb -.-> cr

тЭУ What

ЁЯдФ Why

The cluster's API is root over everything it runs. RBAC is the difference between "the intern's leaked kubeconfig can read one namespace" and "the intern's leaked kubeconfig IS the cluster". It's also how teams share a cluster without fear (namespaces from L05 + RBAC = real multi-tenancy).

ЁЯзк Try it

# what can YOU do? (local clusters: everything тАФ you're cluster-admin)
kubectl auth can-i delete namespaces && kubectl auth can-i list pods -n school

# make a robot card + a one-room pass + hand it over:
kubectl -n school create serviceaccount report-bot
kubectl -n school create role pod-reader --verb=get,list --resource=pods
kubectl -n school create rolebinding report-bot-reads \
  --role=pod-reader --serviceaccount=school:report-bot

# test the pass WITHOUT wearing it:
kubectl auth can-i list pods -n school --as=system:serviceaccount:school:report-bot   # yes
kubectl auth can-i delete pods -n school --as=system:serviceaccount:school:report-bot # no ЁЯОЙ
kubectl auth can-i list secrets -n school --as=system:serviceaccount:school:report-bot # no!

# cleanup:
kubectl -n school delete rolebinding report-bot-reads
kubectl -n school delete role pod-reader && kubectl -n school delete sa report-bot

ЁЯФз kubectl for this lesson

kubectl auth can-i ┬╖ kubectl get role,rolebinding,sa

ЁЯФЧ Builds on: ЁЯкк AWS L03тАУL04 (policies & roles тАФ the same idea)

тЬЕ Verify тАФ what you should see

kubectl auth can-i get pods --as=system:serviceaccount:school:reader says yes; --as=тАж delete says no.

ЁЯз╣ Clean up

kubectl delete rolebinding,role тАж you created

тЪая╕П Common mistakes

тПня╕П Next

Work that runs once and work that runs on a schedule тАФ including the backup CronJob this repo has been promising since its README: Jobs & CronJobs.

git checkout lesson-18-jobs-cronjobs
тЖР PreviousdebuggingNext тЖТjobs cronjobs

This page is the lesson's README from the lesson-17-rbac branch, shown here so the whole School stays on one site. Code files open on GitHub at the same branch.