ЁЯП╖я╕П рдзрдбрд╛ 22 тАФ StatefulSets: рдирд╛рд╡рд╛рдЪреНрдпрд╛ рдкрд╛рдЯреНрдпрд╛ рдЕрд╕рд▓реЗрд▓реЗ рдмрд╛рдХ
ЁЯУН рддреБрдореНрд╣реА рдЗрдереЗ рдЖрд╣рд╛рдд: рдзрдбрд╛ 22 / 26 ┬╖ рдорд╛рдЧреАрд▓: lesson-21-daemonsets ┬╖ рдкреБрдвреАрд▓: lesson-23-qos-evictions
ЁЯУж рдпрд╛ рдмреНрд░рдБрдЪрдордзреНрдпреЗ рдХрд╛рдп рдЖрд╣реЗ
рдЖрдзреАрдЪреЗ рд╕рдЧрд│реЗ, рдЖрдгрд┐ рдзрдбрд╛ 12 рдиреЗ рдлрдХреНрдд рджреБрд░реВрдирдЪ рджрд╛рдЦрд╡рд▓реЗрд▓рд╛ workload рдЖрдХрд╛рд░ тАФ рдЖрддрд╛ рдкреНрд░рддреНрдпрдХреНрд╖ рд╣рд╛рддрд╛рдиреЗ. рдЦрд░реА file:
- k8s/postgres-statefulset.yaml тАФ рд╕реНрд╡рддрдГрдЪрд╛ drawer рдЕрд╕рд▓реЗрд▓рд╛ рдЦрд░рд╛ Postgres (рд╢рд┐рдХрдгреНрдпрд╛рд╕рд╛рдареА; prod рдЪреА рднреВрдорд┐рдХрд╛ рддрд╢реАрдЪ: RDS)
ЁЯзТ 5 рд╡рд░реНрд╖рд╛рдВрдЪреНрдпрд╛ рдореБрд▓рд╛рд▓рд╛ рд╕рдордЬрд╛рд╡рд▓реНрдпрд╛рд╕рд╛рд░рдЦреЗ
Deployment рдЪреА рдореБрд▓реЗ рдПрдХрдореЗрдХрд╛рдВрдЪреНрдпрд╛ рдЬрд╛рдЧреА рдЪрд╛рд▓рдгрд╛рд░реА рдЕрд╕рддрд╛рдд тАФ рдирд╡реЗ рдореВрд▓, рдирд╡реЗ random рдирд╛рд╡
(school-api-7d9f8-xk2lp), рдХреЛрдгрддрд╛рд╣реА рдмрд╛рдХ, рд╕рд╛рдорд╛рдпрд┐рдХ reception рдирдВрдмрд░. Stateless
рдХрд╛рдорд╛рд╕рд╛рдареА рдЙрддреНрддрдо; database рд╕рд╛рдареА рдирд┐рд░реБрдкрдпреЛрдЧреА. Database рдореБрд▓рд╛рд▓рд╛ рд╣рд╡реЗ:
- рдирд╛рд╡рд╛рдЪреА рдкрд╛рдЯреА ЁЯП╖я╕П:
postgres-0. рдореЗрд▓реЗ? рддреНрдпрд╛рдЪреНрдпрд╛ рдЬрд╛рдЧреА рдпреЗрдгрд╛рд░реЗрд╣реАpostgres-0тАФ рддреЗрдЪ рдирд╛рд╡, рддреАрдЪ рдУрд│рдЦ, рдереЗрдЯpostgres-0.postgresрдпрд╛ рдкрддреНрддреНрдпрд╛рд╡рд░ рдкреЛрд╣реЛрдЪрддрд╛ рдпреЗрддреЗ (headless Service рдордзреВрди тАФ "рдЬреЛ рдореЛрдХрд│рд╛ рдЕрд╕реЗрд▓ рддреЛ" рдРрд╡рдЬреА рддреБрдореНрд╣рд╛рд▓рд╛ рдард░рд╛рд╡реАрдХ рдореБрд▓рд╛рдХрдбреЗ рдЬреЛрдбреВрди рджреЗрдгрд╛рд░реЗ reception). - рд╕реНрд╡рддрдГрдЪрд╛ drawer ЁЯЧДя╕П:
volumeClaimTemplatesрдкреНрд░рддреНрдпреЗрдХ pod рд╕рд╛рдареА рд╡реИрдпрдХреНрддрд┐рдХ PVC рдмрдирд╡рддреЗ тАФpostgres-0рдиреЗрд╣рдореА рд╕реНрд╡рддрдГрдЪрд╛рдЪ drawer рдЙрдШрдбрддреЛ (рдзрдбрд╛ 12 рдЪреА рдЧреНрд░рдВрдерд╛рд▓рдпрд╛рддрд▓реА рдлрд│реА, рдЖрддрд╛ рдореБрд▓рд╛рдЪреЗ рдирд╛рд╡ рдХреЛрд░рд▓реЗрд▓реА). Pod delete рдХреЗрд▓реНрдпрд╛рдиреЗ drawer рдХрдзреАрдЪ delete рд╣реЛрдд рдирд╛рд╣реА. - рдХреНрд░рдо ЁЯУ╢: рдореБрд▓реЗ рдПрдХреЗрдХ рдХрд░реВрди рдпреЗрддрд╛рдд (
-0, рдордЧ-1, рдордЧ-2) рдЖрдгрд┐ рдЙрд▓рдЯреНрдпрд╛ рдХреНрд░рдорд╛рдиреЗ рдЬрд╛рддрд╛рдд тАФ replicated databases рдирд╛ followers рддреНрдпрд╛рдЪреНрдпрд╛рдХрдбреВрди copy рдХрд░рдгреНрдпрд╛рдЖрдзреА рдкрд╣рд┐рд▓реЗ рдореВрд▓ рддрдпрд╛рд░ рдЕрд╕рд╛рдпрд▓рд╛ рд▓рд╛рдЧрддреЗ.
рд╣реА рддрд┐рдХрдбреА тАФ рдЪрд┐рдХрдЯрд▓реЗрд▓реЗ рдирд╛рд╡, рдЪрд┐рдХрдЯрд▓реЗрд▓рд╛ drawer, рдХреНрд░рдорд╛рдиреЗ рдпреЗрдгреЗ тАФ рд╣рд╛рдЪ StatefulSet рдЖрдгрд┐ Deployment рдпрд╛рдВрдордзрд▓рд╛ рд╕рдВрдкреВрд░реНрдг рдлрд░рдХ.
ЁЯЧ║я╕П рдЖрдХреГрддреА
flowchart LR
ss["ЁЯП╖я╕П StatefulSet: postgres<br/>replicas: 1"]
hs["тШОя╕П headless Service<br/>'connect me to postgres-0<br/>SPECIFICALLY'"]
subgraph pod0["ЁЯкС postgres-0 - named desk"]
pg["postgres:16"]
end
pvc["ЁЯЧДя╕П PVC: data-postgres-0<br/>ITS OWN drawer -<br/>survives the pod, reattaches"]
ss -->|"1 ordered, named"| pod0
hs -->|"2 by-name address"| pod0
pod0 ---|"3 always reopens"| pvc
тЭУ рдХрд╛рдп
serviceName:рдПрдХрд╛ headless Service рдХрдбреЗ (clusterIP: None) рдирд┐рд░реНрджреЗрд╢ рдХрд░рддреЗ тАФ load-balancing рдРрд╡рдЬреА DNS рдкреНрд░рддреНрдпреЗрдХ pod рд▓рд╛ рдирд╛рд╡рд╛рдиреБрд╕рд╛рд░ рд╕реНрдерд┐рд░ рдкрддреНрддрд╛ рджреЗрддреЛ.volumeClaimTemplates:тАФ рд╡реИрдпрдХреНрддрд┐рдХ drawers рдмрдирд╡рдгрд╛рд░рд╛ рдХрд╛рд░рдЦрд╛рдирд╛. EKS рд╡рд░ рд╣реЗ EBS volumes рд╣реЛрддрд╛рдд, рдЖрдгрд┐ рдзрдбрд╛ 15 рдЪрд╛ рдЗрд╢рд╛рд░рд╛ рд▓рд╛рдЧреВ рд╣реЛрддреЛ: drawer рдПрдХрд╛рдЪ рдЗрдорд╛рд░рддреАрдд (AZ) рд░рд╛рд╣рддреЛ тАФpostgres-0рдлрдХреНрдд рддреНрдпрд╛рдЪрд╛ drawer рдЬрд┐рдереЗ рдЖрд╣реЗ рддрд┐рдереЗрдЪ reschedule рд╣реЛрддреЛ.- Updates рдЙрд▓рдЯреНрдпрд╛ рдХреНрд░рдорд╛рдиреЗ, рдПрдХреЗрдХ рдХрд░реВрди рд╣реЛрддрд╛рдд; scale down рдХреЗрд▓реНрдпрд╛рд╡рд░ drawers рд╡реЗрдЧрд│реЗ рд╣реЛрддрд╛рдд рдкрдг рдареЗрд╡рд▓реЗ рдЬрд╛рддрд╛рдд (рдкрд░рдд рдпреЗрдгрд╛рд▒реНрдпрд╛ рдореБрд▓рд╛рдВрдирд╛ рддреНрдпрд╛рдВрдЪреЗ рд╕рд╛рдорд╛рди рдорд┐рд│рддреЗ).
- рдкреНрд░рд╛рдорд╛рдгрд┐рдХ рдорд░реНрдпрд╛рджрд╛: рдПрдХ StatefulSet тЙа high availability. рдЦрд▒реНрдпрд╛ replication/ failover рд╕рд╛рдареА operator рд▓рд╛рдЧрддреЛ (CloudNativePG рд╡рдЧреИрд░реЗ тАФ operators рдореНрд╣рдгрдЬреЗ рдХрд╛рдп рддреЗ рдзрдбрд╛ 25 рд╕рдордЬрд╛рд╡рддреЛ). рдпрд╛ repo рдЪреА production рднреВрдорд┐рдХрд╛ рдХрд╛рдпрдо рдЖрд╣реЗ: рдЧреНрд░рдВрдерд╛рд▓рдп рднрд╛рдбреНрдпрд╛рдиреЗ рдШреНрдпрд╛ (RDS); StatefulSets рддреЗ рд╕рдордЬреВрди рдШреЗрдгреНрдпрд╛рд╕рд╛рдареА рдЪрд╛рд▓рд╡рд╛, рдХрд┐рдВрд╡рд╛ dev/test рд╕рд╛рдареА.
ЁЯдФ рдХрд╛
рдХрд╛рд░рдг "database cluster рдордзреНрдпреЗ рдЪрд╛рд▓рд╡реВ рд╢рдХрддреЛ рдХрд╛?" рд╣рд╛ рдкреНрд░рд╢реНрди рдкреНрд░рддреНрдпреЗрдХ team рдордзреНрдпреЗ рд╡рд┐рдЪрд╛рд░рд▓рд╛ рдЬрд╛рддреЛ, рдЖрдгрд┐ рдЖрддрд╛ рддреБрдореНрд╣реА рдиреЗрдордХреЗ рдЙрддреНрддрд░ рджреЗрдК рд╢рдХрддрд╛: k8s рддреБрдореНрд╣рд╛рд▓рд╛ рд╣реЗ рджреЗрддреЛ (рдУрд│рдЦ, storage, рдХреНрд░рдо), рд╣реЗ рджреЗрдд рдирд╛рд╣реА (replication, failover, backups тАФ operator рдЪреЗ рдХрд┐рдВрд╡рд╛ RDS рдЪреЗ рдХрд╛рдо), рдЖрдгрд┐ рдзрдбрд╛ 12 рдиреЗ RDS рдХрд╛ рдирд┐рд╡рдбрд▓рд╛ рддреЗ рд╣реЗ. рдпрдВрддреНрд░рдгрд╛ рдорд╛рд╣реАрдд рдЕрд╕рд▓реНрдпрд╛рдореБрд│реЗрдЪ "рднрд╛рдбреНрдпрд╛рдиреЗ рдШреНрдпрд╛" рд╣рд╛ рд╕рд▓реНрд▓рд╛ рд╡рд┐рд╢реНрд╡рд╛рд╕рд╛рд░реНрд╣ рдард░рддреЛ.
ЁЯзк рдХрд░реВрди рдкрд╛рд╣рд╛
kubectl apply -f k8s/postgres-statefulset.yaml
kubectl -n school get pods -w # postgres-0 тАФ THE name; Ctrl+C
kubectl -n school get pvc # data-postgres-0 тАФ THE drawer
# write something, then kill the kid:
kubectl -n school exec postgres-0 -- psql -U school -c "CREATE TABLE proof(id int); INSERT INTO proof VALUES (42);"
kubectl -n school delete pod postgres-0 # ЁЯТе
kubectl -n school get pods -w # postgres-0 returns (same name!); Ctrl+C
# same drawer, data intact:
kubectl -n school exec postgres-0 -- psql -U school -c "SELECT * FROM proof;" # 42 ЁЯОЙ
# cleanup (drawer is kept on purpose тАФ delete it explicitly):
kubectl delete -f k8s/postgres-statefulset.yaml
kubectl -n school delete pvc data-postgres-0
ЁЯФз рдпрд╛ рдзрдбреНрдпрд╛рд╕рд╛рдареА kubectl
kubectl get sts,pvc ┬╖ kubectl get pods -l app=postgres
ЁЯФЧ рдпрд╛рд╡рд░ рдЖрдзрд╛рд░рд┐рдд: ЁЯкк AWS L17 (RDS тАФ рддреНрдпрд╛рдРрд╡рдЬреА рдиреЛрдВрджреАрдВрдЪреЗ рдХрд╛рд░реНрдпрд╛рд▓рдп рднрд╛рдбреНрдпрд╛рдиреЗ рдШреНрдпрд╛)
тЬЕ рддрдкрд╛рд╕рд╛ тАФ рддреБрдореНрд╣рд╛рд▓рд╛ рдХрд╛рдп рджрд┐рд╕рд▓реЗ рдкрд╛рд╣рд┐рдЬреЗ
postgres-0 delete рдХрд░рд╛ тЖТ рддреНрдпрд╛рдЪреНрдпрд╛ рдЬрд╛рдЧреА рдпреЗрдгрд╛рд▒реНрдпрд╛рдЪреЗ рдирд╛рд╡ рдкреБрдиреНрд╣рд╛ postgres-0 рдЕрд╕рддреЗ рдЖрдгрд┐ рддреЛ rows рд╢рд╛рдмреВрдд рдЕрд╕рд▓реЗрд▓рд╛ data-postgres-0 рдкреБрдиреНрд╣рд╛ рдЬреЛрдбрддреЛ.
ЁЯз╣ рд╕рд╛рдлрд╕рдлрд╛рдИ
kubectl delete sts postgres PVCs рдареЗрд╡рддреЛ тАФ data рдХрд╛рдвреВрди рдЯрд╛рдХрд╛рдпрдЪрд╛ рдЕрд╕реЗрд▓ рддрд░ рддреЗ рд╕реНрдкрд╖реНрдЯрдкрдгреЗ delete рдХрд░рд╛
тЪая╕П рдиреЗрд╣рдореАрдЪреНрдпрд╛ рдЪреБрдХрд╛
- stateless app рд╕рд╛рдареА StatefulSet тАФ рддреБрдореНрд╣реА рдлрдХреНрдд rollouts рд╣рд│реВ рдХреЗрд▓реЗ
- single-replica StatefulSet рдХрдбреВрди HA рдЪреА рдЕрдкреЗрдХреНрд╖рд╛ тАФ рддреНрдпрд╛рд╕рд╛рдареА operator рдХрд┐рдВрд╡рд╛ RDS рд▓рд╛рдЧрддреЛ
тПня╕П рдкреБрдвреЗ
рдмрд╛рдХрд╛рд╡рд░рдЪреЗ рдЬреЗрд╡рдг рд╕рдВрдкрд▓реЗ рддрд░ рдЖрдзреА рдХреЛрдгрд╛рд▓рд╛ рдмрд╛рд╣реЗрд░ рдЬрд╛рдпрд▓рд╛ рд╕рд╛рдВрдЧрд┐рддрд▓реЗ рдЬрд╛рддреЗ? QoS classes рдЖрдгрд┐ evictions тАФ рдирдХрд│рдд рддреБрдореНрд╣реА рдЖрдзреАрдЪ рдЬреНрдпрд╛ рдЙрддрд░рдВрдбреАрдд рдЖрд╣рд╛рдд рддреА.
git checkout lesson-23-qos-evictions