ЁЯкк рдзрдбрд╛ 17 тАФ RBAC рдЖрдгрд┐ ServiceAccounts: hall passes
ЁЯУН рддреБрдореНрд╣реА рдЗрдереЗ рдЖрд╣рд╛рдд: рдзрдбрд╛ 17 / 26 ┬╖ рдорд╛рдЧреАрд▓: lesson-16-debugging ┬╖ рдкреБрдвреАрд▓: lesson-18-jobs-cronjobs
ЁЯУж рдпрд╛ рдмреНрд░рдБрдЪрдордзреНрдпреЗ рдХрд╛рдп рдЖрд╣реЗ
рдЖрдзреАрдЪреЗ рд╕рдЧрд│реЗ, рдЖрдгрд┐: cluster рдЪреНрдпрд╛ рдЖрдд рдХреЛрдг рдХрд╛рдп рдХрд░реВ рд╢рдХрддреЗ тАФ RBAC тАФ рдЖрдгрд┐ pods рд╕рд╛рдареА рдУрд│рдЦрдкрддреНрд░реЗ: ServiceAccounts.
ЁЯзТ 5 рд╡рд░реНрд╖рд╛рдВрдЪреНрдпрд╛ рдореБрд▓рд╛рд▓рд╛ рд╕рдордЬрд╛рд╡рд▓реНрдпрд╛рд╕рд╛рд░рдЦреЗ
AWS рдХреЛрд░реНрд╕рдиреЗ рд▓реЛрдХрд╛рдВрдирд╛ cloud рд╕рд╛рдареА рдУрд│рдЦрдкрддреНрд░реЗ рджрд┐рд▓реА (IAM). рдкрдг рд╢рд╛рд│реЗрдЪреНрдпрд╛ рдЗрдорд╛рд░рддреАрдЪреНрдпрд╛ рдЖрдд рджреБрд╕рд░реА рд╡реНрдпрд╡рд╕реНрдерд╛ рдЖрд╣реЗ: hall passes ЁЯкк.
- Role рдореНрд╣рдгрдЬреЗ рдПрдХрд╛рдЪ рдЦреЛрд▓реАрдЪрд╛ рдкрд╛рд╕: "
schoolрдордзрд▓реЗ pods рдкрд╛рд╣реВ рд╢рдХрддреЛ". - ClusterRole рдореНрд╣рдгрдЬреЗ рд╕рдВрдкреВрд░реНрдг рдЗрдорд╛рд░рддреАрдЪрд╛ рдкрд╛рд╕: "рд╕рдЧрд│реАрдХрдбрдЪреЗ pods рдкрд╛рд╣реВ рд╢рдХрддреЛ" (рдХрд╛рд╣реА рджрд░рд╡рд╛рдЬреЗ, рдЬрд╕реЗ nodes, рдлрдХреНрдд рдЗрдорд╛рд░рддреАрдЪреНрдпрд╛ рдкрд╛рддрд│реАрд╡рд░рдЪ рдЕрд╕рддрд╛рдд).
- RoleBinding рдкрд╛рд╕ рдХреЛрдгрд╛рд▓рд╛ рддрд░реА рджреЗрддреЗ: рдПрдЦрд╛рджреА рд╡реНрдпрдХреНрддреА, рдЧрдЯ тАФ рдХрд┐рдВрд╡рд╛
ServiceAccount: pod рдШрд╛рд▓рддреЛ рддреЗ рдУрд│рдЦрдкрддреНрд░. рдкреНрд░рддреНрдпреЗрдХ pod рдПрдХ рдШрд╛рд▓рддреЛ
(рд╡реЗрдЧрд│реЗ рд╕рд╛рдВрдЧрд┐рддрд▓реЗ рдирд╛рд╣реА рддрд░
default), рдЖрдгрд┐ ArgoCD рд╕рд╛рд░рдЦреЗ robots рд╕рдЧрд│реЗ рдХрд╛рд╣реА рдЖрдкрд▓реНрдпрд╛ рдУрд│рдЦрдкрддреНрд░рд╛рдиреЗрдЪ рдХрд░рддрд╛рдд.
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
тЭУ рдХрд╛рдп
- рдирд┐рдпрдо = resources (
pods,deployments,secretsтАж) рд╡рд░рдЪреЗ verbs (get list watch create update delete), рд╣рд╡реЗ рддрд░ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдирд╛рд╡рд╛рдВрд╕рд╣. Deny rules рдирд╛рд╣реАрдд тАФ RBAC рдлрдХреНрдд allow рдХрд░рддреЗ (IAM рдЪреНрдпрд╛ рдЙрд▓рдЯ). - рддрдпрд╛рд░ ClusterRoles:
view(рд╡рд╛рдЪрдгреЗ, secrets рдирд╛рд╣реАрдд),edit(рдмрд╣реБрддреЗрдХ writes),admin(рдЦреЛрд▓реАрдЪрд╛ рдорд╛рд▓рдХ),cluster-admin(master key). рд╕реНрд╡рддрдГрдЪреЗ рд▓рд┐рд╣рд┐рдгреНрдпрд╛рдЖрдзреА рд╣реЗрдЪ bind рдХрд░рд╛. - API рд╢реА рдмреЛрд▓рдгрд╛рд▒реНрдпрд╛ рдкреНрд░рддреНрдпреЗрдХ workload рд╕рд╛рдареА рдПрдХ ServiceAccount тАФ рдмрд╣реБрддреЗрдХ app pods
(рдЖрдкрд▓реНрдпрд╛рд╕рд╛рд░рдЦреЗ) рдХрдзреАрдЪ рдмреЛрд▓рдд рдирд╛рд╣реАрдд, рдЖрдгрд┐ рддреНрдпрд╛рдВрдиреА рд╢рдХреНрддрд┐рд╣реАрди default рдЪ рдареЗрд╡рд╛рд╡рд╛. рд╡рд╛рдкрд░
рдирд╕реЗрд▓ рддреЗрд╡реНрд╣рд╛
automountServiceAccountToken: falseрдареЗрд╡рд╛ (рд╕реНрд╡рдЪреНрдЫрддрд╛!). - рдЬрд╛рджреВрдЪрд╛ рдкреНрд░рд╢реНрди:
kubectl auth can-i create deployments -n schoolтАФ рдЖрдгрд┐ рджреБрд╕рд▒реНрдпрд╛рдЪрд╛ рдкрд╛рд╕ рдЙрд╕рдирд╛ рди рдШреЗрддрд╛ рддрдкрд╛рд╕рд╛рдпрд▓рд╛--as=system:serviceaccount:school:ci-bot.
ЁЯдФ рдХрд╛
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 тАж
тЪая╕П рдиреЗрд╣рдореАрдЪреНрдпрд╛ рдЪреБрдХрд╛
- robot рд▓рд╛ 'рддрд╛рддреНрдкреБрд░рддреЗ'
cluster-adminbind рдХрд░рдгреЗ - рдЪреБрдХреАрдЪреНрдпрд╛ namespace рдордзрд▓рд╛ Role тАФ рдкрд╛рд╕ рдкреНрд░рддреНрдпреЗрдХ рдЦреЛрд▓реАрд╕рд╛рдареА рд╡реЗрдЧрд│рд╛ рдЕрд╕рддреЛ
тПня╕П рдкреБрдвреЗ
рдПрдХрджрд╛рдЪ рдЪрд╛рд▓рдгрд╛рд░реЗ рдХрд╛рдо рдЖрдгрд┐ рд╡реЗрд│рд╛рдкрддреНрд░рдХрд╛рдиреБрд╕рд╛рд░ рдЪрд╛рд▓рдгрд╛рд░реЗ рдХрд╛рдо тАФ рдпрд╛рдд рд╣рд╛ repo рддреНрдпрд╛рдЪреНрдпрд╛ README рдкрд╛рд╕реВрди рд╡рдЪрди рджреЗрдд рдЖрд▓реЗрд▓рд╛ backup CronJob рд╕реБрджреНрдзрд╛: Jobs рдЖрдгрд┐ CronJobs.
git checkout lesson-18-jobs-cronjobs