ЁЯУЪ рдзрдбрд╛ 12 тАФ Storage рдЖрдгрд┐ state: рджрдкреНрддрд░ рд╡рд┐рд░реБрджреНрдз рдЧреНрд░рдВрдерд╛рд▓рдпрд╛рдЪреЗ рдХрдкрд╛рдЯ
ЁЯУН рддреБрдореНрд╣реА рдЗрдереЗ рдЖрд╣рд╛рдд: 13 рдкреИрдХреА рдзрдбрд╛ 12 ┬╖ рдорд╛рдЧрдЪрд╛: lesson-11-rollouts ┬╖ рдкреБрдврдЪрд╛: lesson-13-under-the-hood
ЁЯУж рдпрд╛ рдмреНрд░рдБрдЪрдордзреНрдпреЗ рдХрд╛рдп рдЖрд╣реЗ
рдзрдбреЗ 01тАУ11, рдЖрдгрд┐: storage тАФ pod рдореЗрд▓реНрдпрд╛рд╡рд░ рдХрд╛рдп рдЯрд┐рдХрддреЗ рдЖрдгрд┐ рдХрд╛рдп рдирд╛рд╣реА, рдЖрдгрд┐ "рдорд╛рдЭрд╛ database рдХреБрдареЗ рд░рд╛рд╣рд╛рд╡рд╛?" рдпрд╛рдЪреЗ рдкреНрд░рд╛рдорд╛рдгрд┐рдХ рдЙрддреНрддрд░. рдЦрд▒реНрдпрд╛ files:
- k8s/secret.example.yaml тАФ cluster рдЪреНрдпрд╛ рдмрд╛рд╣реЗрд░ рдмреЛрдЯ рджрд╛рдЦрд╡рдгрд╛рд░рд╛
DATABASE_URL - terraform/rds.tf тАФ рд╣рд╛ repo рдкреНрд░рддреНрдпрдХреНрд╖рд╛рдд рд╡рд╛рдкрд░рддреЛ рддреЛ managed Postgres
- docker-compose.yml тАФ local Postgres рдЪрд╛ data рдареЗрд╡рдгрд╛рд░реА
volumes:рдУрд│ рдкрд╛рд╣рд╛
ЁЯзТ 5 рд╡рд░реНрд╖рд╛рдВрдЪреНрдпрд╛ рдореБрд▓рд╛рд▓рд╛ рд╕рдордЬрд╛рд╡рд▓реНрдпрд╛рд╕рд╛рд░рдЦреЗ
рдПрдЦрд╛рджреЗ рдореВрд▓ рдХрд╛рдпрдордЪреЗ рд╢рд╛рд│рд╛ рд╕реЛрдбреВрди рдЬрд╛рддреЗ, рддреЗрд╡реНрд╣рд╛ рджреЛрди рдкреНрд░рдХрд╛рд░рдЪреНрдпрд╛ рд╡рд╕реНрддреВ рдЕрд╕рддрд╛рдд:
- рддреНрдпрд╛рдЪреЗ рджрдкреНрддрд░ ЁЯОТ тАФ рддреНрдпрд╛рдЪреНрдпрд╛рд╕реЛрдмрдд рдШрд░реА рдЬрд╛рддреЗ. рдЧреЗрд▓реЗ. рд╣реАрдЪ pod рдЪреА рд╕реНрд╡рддрдГрдЪреА filesystem: container рдиреЗ рд▓рд┐рд╣рд┐рд▓реЗрд▓реА рдкреНрд░рддреНрдпреЗрдХ file pod рдореЗрд▓реНрдпрд╛рд╡рд░ рдирд╛рд╣реАрд╢реА рд╣реЛрддреЗ. (рдЖрдгрд┐ pods рд╕рддрдд рдорд░рддрд╛рдд тАФ рдзрдбреЗ 03, 09, 11 рддреНрдпрд╛рдВрдирд╛ рдореБрджреНрджрд╛рдо рдорд╛рд░рддрд╛рдд!)
- рдЧреНрд░рдВрдерд╛рд▓рдпрд╛рдЪреЗ рдХрдкрд╛рдЯ ЁЯУЪ тАФ рдХреЛрдгрддреА рдореБрд▓реЗ рдпреЗрддрд╛рдд рдЖрдгрд┐ рдЬрд╛рддрд╛рдд рдпрд╛рдЪреА рдкрд░реНрд╡рд╛ рди рдХрд░рддрд╛ рдкреБрд╕реНрддрдХреЗ рдЧреНрд░рдВрдерд╛рд▓рдпрд╛рддрдЪ рд░рд╛рд╣рддрд╛рдд. рдкреБрдврдЪреЗ рдореВрд▓ рдорд╛рдЧрдЪреЗ рдЬрд┐рдереЗ рдерд╛рдВрдмрд▓реЗ рд╣реЛрддреЗ рддрд┐рдереВрдирдЪ рд╕реБрд░реВ рдХрд░рддреЗ. рд╣рд╛рдЪ PersistentVolume: рд╕реНрд╡рддрдГрдЪреЗ рд╡реЗрдЧрд│реЗ рдЖрдпреБрд╖реНрдп рдЕрд╕рд▓реЗрд▓реА storage.
Pod рд▓рд╛ рдХрдкрд╛рдЯрд╛рдд рдЬрд╛рдЧрд╛ рдХрд╢реА рдорд┐рд│рддреЗ? рддреЛ рдПрдХ рдорд╛рдЧрдгреА-рдкрд╛рд╡рддреА рднрд░рддреЛ: "рдорд▓рд╛ 10Gi рдХрдкрд╛рдЯ рд╣рд╡реЗ рдЖрд╣реЗ, рдХреГрдкрдпрд╛" тАФ рд╣рд╛рдЪ PersistentVolumeClaim (PVC). рдЧреНрд░рдВрдердкрд╛рд▓ (рдПрдХ StorageClass + CSI driver тАФ AWS рд╡рд░, рдПрдХ EBS disk) рдЦрд░реЗ рдХрдкрд╛рдЯ рд╢реЛрдзрддреЗ рдХрд┐рдВрд╡рд╛ рдмрдирд╡рддреЗ рдЖрдгрд┐ рддреЗ pod рд▓рд╛ рдЬреЛрдбрддреЗ. рдирдВрддрд░ рдирд╡рд╛ pod? рддреАрдЪ рдкрд╛рд╡рддреА тЖТ рддреЗрдЪ рдХрдкрд╛рдЯ, рддреАрдЪ рдкреБрд╕реНрддрдХреЗ.
рдЖрдгрд┐ рдореБрд▓рд╛рдВрдЪреЗ рд╕рд░реНрд╡рд╛рдд рдореЛрдареЗ рдЧреБрдкрд┐рдд ЁЯдл: рдХрдзреА рдХрдзреА рд╕рд░реНрд╡рд╛рдд рдЪрд╛рдВрдЧрд▓реЗ рдЧреНрд░рдВрдерд╛рд▓рдп рд░рд╕реНрддреНрдпрд╛рдЪреНрдпрд╛ рдкрд▓реАрдХрдбреЗ рдЕрд╕рддреЗ. рд╣рд╛ repo cluster рдЪреНрдпрд╛ рдЖрдд Postgres рдЪрд╛рд▓рд╡рдгреНрдпрд╛рдРрд╡рдЬреА рддреНрдпрд╛рдЪрд╛ database RDS рдордзреНрдпреЗ рдареЗрд╡рддреЛ тАФ AWS рдЪреЗ рд╡реНрдпрд╛рд╡рд╕рд╛рдпрд┐рдХрдкрдгреЗ рдЪрд╛рд▓рд╡рд▓реЗрд▓реЗ рдЧреНрд░рдВрдерд╛рд▓рдп. рджреЛрдиреНрд╣реА рдпреЛрдЧреНрдп рдЖрд╣реЗрдд; рдХрдзреА рдХреЛрдгрддреЗ рдирд┐рд╡рдбрд╛рдпрдЪреЗ рд╣реЗ рдЬрд╛рдгрдгреЗ рд╣рд╛рдЪ рдЦрд░рд╛ рдзрдбрд╛.
ЁЯЧ║я╕П рдЖрдХреГрддреА
flowchart TB
subgraph cluster["ЁЯПл Kubernetes cluster"]
pod1["ЁЯкС postgres pod v1<br/>ЁЯТе dies"]
pod2["ЁЯкС postgres pod v2<br/>new desk, same books"]
pvc["ЁЯУЭ PVC: 'I claim 10Gi'"]
pod1 -.-> pvc
pod2 --> pvc
end
pv["ЁЯУЪ PersistentVolume<br/>= real EBS disk on AWS<br/>outlives every pod"]
pvc --> pv
subgraph outside["ЁЯПЫя╕П across the street - what THIS repo does"]
rds["AWS RDS Postgres<br/>backups, patching, failover<br/>managed by AWS"]
end
api["ЁЯкС school-api pods"] -->|"DATABASE_URL from the Secret<br/>lesson 06"| rds
тЭУ рдХрд╛рдп
- Volume тАФ pod рд▓рд╛ рдЬреЛрдбрд▓реЗрд▓реА storage.
emptyDirрдлрдХреНрдд pod рдЬрд┐рд╡рдВрдд рдЕрд╕реЗрдкрд░реНрдпрдВрдд рд░рд╛рд╣рддреЗ (рджрдкреНрддрд░); PVC рд╡рд░ рдЖрдзрд╛рд░рд┐рдд volume рддреНрдпрд╛рдЪреНрдпрд╛рдирдВрддрд░рд╣реА рдЯрд┐рдХрддреЗ (рдХрдкрд╛рдЯ). - PersistentVolume (PV) тАФ рдЦрд░реА storage (EKS рд╡рд░ рдПрдХ EBS disk). PersistentVolumeClaim (PVC) тАФ рдПрдЦрд╛рджреНрдпрд╛рд╕рд╛рдареА pod рдЪреА рдорд╛рдЧрдгреА-рдкрд╛рд╡рддреА. StorageClass тАФ рдорд╛рдЧрдгреАрдиреБрд╕рд╛рд░ PVs рдмрдирд╡рдгрд╛рд░реА рдЧреНрд░рдВрдердкрд╛рд▓.
- StatefulSet тАФ stateful apps (databases) рд╕рд╛рдареАрдЪрд╛ рдЦрд╛рд╕ Deployment: pods рдирд╛ рд╕реНрдерд┐рд░ рдирд╛рд╡реЗ
(
postgres-0) рдорд┐рд│рддрд╛рдд рдЖрдгрд┐ рдкреНрд░рддреНрдпреЗрдХ рдЬрдг рд╕реНрд╡рддрдГрдЪрд╛ PVC рдареЗрд╡рддреЛ. - рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░рдордзрд▓реА рдирд┐рд╡рдб: cluster-рдордзреНрдпреЗ-stateful (StatefulSet + PVC) рд╡рд┐рд░реБрджреНрдз рдмрд╛рд╣реЗрд░рдЪреА managed service (RDS). рдпрд╛ repo рдиреЗ RDS рдирд┐рд╡рдбрд▓реЗ тАФ terraform/rds.tf рдкрд╛рд╣рд╛.
ЁЯдФ рдХрд╛
рдзрдбреЗ 01тАУ11 рдордзрд▓реЗ рд╕рдЧрд│реЗ рдЪрд╛рд▓рд▓реЗ рдХрд╛рд░рдг pods рдЯрд╛рдХрд╛рдК рд╣реЛрддреЗ тАФ рддреНрдпрд╛рдВрдирд╛ рдорд╛рд░рд╛, рд╣рд▓рд╡рд╛, рд╡рд╛рдврд╡рд╛. Databases рд╣реА рдЬрд╛рджреВ рдореЛрдбрддрд╛рдд: data рдЯрд╛рдХрд╛рдК рдЕрд╕рддрд╛ рдХрд╛рдорд╛ рдирдпреЗ. PV/PVC рдЬреАрд╡рдирдЪрдХреНрд░ рд╡рд┐рднрд╛рдЧреВрди рд╣реА рдЬрд╛рджреВ рдкрд░рдд рдЖрдгрддрд╛рдд: pods cattle рд░рд╛рд╣рддрд╛рдд, storage pet рдмрдирддреЗ. рдкрдг production database рдиреАрдЯ рдЪрд╛рд▓рд╡рдгреЗ (backups, upgrades, failover, tuning) рд╣реЗ рдкреВрд░реНрдгрд╡реЗрд│рдЪреЗ рдХрд╛рдо рдЖрд╣реЗ тАФ рдореНрд╣рдгреВрдирдЪ рд▓рд╣рд╛рди teams рд╕рд╣рд╕рд╛ рдЧреНрд░рдВрдердкрд╛рд▓рдЪ рднрд╛рдбреНрдпрд╛рдиреЗ рдШреЗрддрд╛рдд (RDS) рдЖрдгрд┐ cluster stateless рдареЗрд╡рддрд╛рдд. рдЕрдиреБрднрд╡рд╛рдЪрд╛ рдирд┐рдпрдо: cluster рдордзреНрдпреЗ stateless, state managed services рдордзреНрдпреЗ тАФ рдЕрдЧрджреА рдпрд╛ repo рдЪрд╛ рдЖрдХрд╛рд░.
ЁЯФз рдХрд╕реЗ (рдпрд╛ repo рдордзреНрдпреЗ)
- App pods рдореБрджреНрджрд╛рдо stateless рдЖрд╣реЗрдд тАФ
k8s/deployment.yaml рдордзреНрдпреЗ рдПрдХрд╣реА volume рдирд╛рд╣реА. рд╕рдЧрд│реА state
Postgres рдордзреНрдпреЗ рд░рд╛рд╣рддреЗ, рдЬрд┐рдереЗ рдзрдбрд╛ 06 рдЪреНрдпрд╛ Secret рдордзрд▓реНрдпрд╛
DATABASE_URLрдиреЗ рдкреЛрд╣реЛрдЪрд▓реЗ рдЬрд╛рддреЗ:postgres://school:...@your-rds-endpoint:5432/school. - terraform/rds.tf рддреЛ Postgres automated backups рдЖрдгрд┐ encryption рд╕рд╣ рдмрдирд╡рддреЗ тАФ рдЬреНрдпрд╛ рдЧреЛрд╖реНрдЯреА StatefulSet рдордзреНрдпреЗ рддреБрдореНрд╣рд╛рд▓рд╛ рдХрд░рд╛рд╡реНрдпрд╛ рд▓рд╛рдЧрд▓реНрдпрд╛ рдЕрд╕рддреНрдпрд╛.
- Local рд▓рд╛, docker-compose.yml рддреАрдЪ рдХрд▓реНрдкрдирд╛ рд▓рд╣рд╛рди рд╕реНрд╡рд░реВрдкрд╛рдд рджрд╛рдЦрд╡рддреЗ: рдирд╛рд╡ рджрд┐рд▓реЗрд▓рд╛ Docker volume restarts рдирдВрддрд░рд╣реА Postgres рдЪрд╛ data рдареЗрд╡рддреЛ.
ЁЯзк рдХрд░реВрди рдкрд╛рд╣рд╛
# Feel the difference between backpack and shelf (local cluster):
kubectl -n school apply -f - <<'EOF'
apiVersion: v1
kind: PersistentVolumeClaim
metadata: { name: shelf }
spec:
accessModes: [ReadWriteOnce]
resources: { requests: { storage: 1Gi } }
EOF
kubectl -n school run scribe --restart=Never --image=busybox \
--overrides='{"spec":{"containers":[{"name":"scribe","image":"busybox",
"command":["sh","-c","echo my homework > /shelf/notes.txt; sleep 3600"],
"volumeMounts":[{"name":"s","mountPath":"/shelf"}]}],
"volumes":[{"name":"s","persistentVolumeClaim":{"claimName":"shelf"}}]}}'
kubectl -n school delete pod scribe # kid leaves school ЁЯТе
# New kid, same claim тАФ the homework is still there:
kubectl -n school run scribe2 --restart=Never --image=busybox \
--overrides='{"spec":{"containers":[{"name":"scribe2","image":"busybox",
"command":["sh","-c","cat /shelf/notes.txt; sleep 60"],
"volumeMounts":[{"name":"s","mountPath":"/shelf"}]}],
"volumes":[{"name":"s","persistentVolumeClaim":{"claimName":"shelf"}}]}}'
kubectl -n school logs scribe2 # тЖТ "my homework" ЁЯОЙ
kubectl -n school delete pod scribe2 && kubectl -n school delete pvc shelf
ЁЯФз рдпрд╛ рдзрдбреНрдпрд╛рд╕рд╛рдареА kubectl
kubectl get pv,pvc ┬╖ kubectl describe pvc
ЁЯФЧ рдпрд╛рд╡рд░ рдЖрдзрд╛рд░рд┐рдд: ЁЯкк AWS L11 (EBS) ┬╖ L14 (S3) ┬╖ L17 (RDS)
тЬЕ рддрдкрд╛рд╕рд╛ тАФ рддреБрдореНрд╣рд╛рд▓рд╛ рдХрд╛рдп рджрд┐рд╕рд╛рдпрд▓рд╛ рд╣рд╡реЗ
postgres pod рдорд╛рд░рд╛ тЖТ рдирд╡реНрдпрд╛ pod рд▓рд╛ рддреНрдпрд╛рдЪ PVC рд╡рд░ рддреНрдпрд╛рдЪ rows рд╕рд╛рдкрдбрддрд╛рдд.
ЁЯз╣ рд╕рд╛рдлрд╕рдлрд╛рдИ
data рдирд╛рд╣реАрд╕рд╛ рдХрд░рд╛рдпрдЪрд╛ рдЕрд╕реЗрд▓ рддрд░ kubectl delete pvc (PVC рдореБрджреНрджрд╛рдо pod рдкреЗрдХреНрд╖рд╛ рдЬрд╛рд╕реНрдд рдЯрд┐рдХрддреЛ)
тЪая╕П рдиреЗрд╣рдореАрдЪреНрдпрд╛ рдЪреБрдХрд╛
- state container рдЪреНрдпрд╛ filesystem рдордзреНрдпреЗ (рджрдкреНрддрд░рд╛рдд) рдареЗрд╡рдгреЗ
- operator рд╢рд┐рд╡рд╛рдп production databases cluster рдЪреНрдпрд╛ рдЖрдд рдЪрд╛рд▓рд╡рдгреЗ тАФ RDS рднрд╛рдбреНрдпрд╛рдиреЗ рдШреНрдпрд╛ (AWS L17)
тПня╕П рдкреБрдвреЗ
рд╢реЗрд╡рдЯрдЪрд╛ рдзрдбрд╛: рд╢рд╛рд│реЗрдЪреНрдпрд╛ рдХрд╛рд░реНрдпрд╛рд▓рдпрд╛рдЪреЗ рджрд╛рд░ рдЙрдШрдбрд╛ рдЖрдгрд┐ рд╣реЗ рд╕рдЧрд│реЗ рдШрдбрд╡реВрди рдЖрдгрдгрд╛рд▒реНрдпрд╛ рдпрдВрддреНрд░рдгреЗрд▓рд╛ рднреЗрдЯрд╛ тАФ control plane.
git checkout lesson-13-under-the-hood