ЁЯзСтАНЁЯПл рдзрдбрд╛ 03 тАФ Deployments: рдХрдбрдХ рд╡рд░реНрдЧ-рдкреНрд░рдореБрдЦ
ЁЯУН рддреБрдореНрд╣реА рдЗрдереЗ рдЖрд╣рд╛рдд: 13 рдкреИрдХреА рдзрдбрд╛ 03 ┬╖ рдорд╛рдЧрдЪрд╛: lesson-02-pods ┬╖ рдкреБрдврдЪрд╛: lesson-04-services
ЁЯУж рдпрд╛ рдмреНрд░рдБрдЪрдордзреНрдпреЗ рдХрд╛рдп рдЖрд╣реЗ
рдзрдбреЗ 01тАУ02, рдЖрдгрд┐: Deployment тАФ рддреБрдордЪреЗ pods рдпреЛрдЧреНрдп рд╕рдВрдЦреНрдпреЗрдиреЗ, рдпреЛрдЧреНрдп version рдЪрд╛рд▓рд╡рдд рдЬрд┐рд╡рдВрдд рдареЗрд╡рдгрд╛рд░рд╛ object. рдЦрд▒реНрдпрд╛ files:
- k8s/deployment.yaml тАФ Node API рдЪрд╛ Deployment (2 replicas)
- k8s/analytics-deployment.yaml тАФ рддреАрдЪ рдкрджреНрдзрдд, Python service
ЁЯзТ 5 рд╡рд░реНрд╖рд╛рдВрдЪреНрдпрд╛ рдореБрд▓рд╛рд▓рд╛ рд╕рдордЬрд╛рд╡рд▓реНрдпрд╛рд╕рд╛рд░рдЦреЗ
рд╢рд┐рдХреНрд╖рд┐рдХрд╛ рд╡рд░реНрдЧ-рдкреНрд░рдореБрдЦрд╛рд▓рд╛ рд╕рд╛рдВрдЧрддрд╛рдд: "рдЭрд╛рдбрд╛рдВрдирд╛ рдкрд╛рдгреА рдШрд╛рд▓рд╛рдпрд▓рд╛ рдиреЗрд╣рдореА 2 рдореБрд▓реЗ рдЕрд╕рд▓реАрдЪ рдкрд╛рд╣рд┐рдЬреЗрдд. рдиреЗрд╣рдореА. рдХрд╕реЗ рддреЗ рдорд▓рд╛ рдорд╛рд╣реАрдд рдирд╛рд╣реА." ЁЯзСтАНЁЯПлЁЯМ▒
рд╡рд░реНрдЧ-рдкреНрд░рдореБрдЦ рд╣реЗ рдЧрд╛рдВрднреАрд░реНрдпрд╛рдиреЗ рдШреЗрддреЛ:
- рдПрдЦрд╛рджреЗ рдореВрд▓ рдЖрдЬрд╛рд░реА рдкрдбреВрди рдШрд░реА рдЧреЗрд▓реЗ? тЖТ рд╡рд░реНрдЧ-рдкреНрд░рдореБрдЦ рд▓рдЧреЗрдЪ рдирд╡реЗ рдореВрд▓ рдкрд╛рдард╡рддреЛ. рдкреНрд░рд╢реНрди рдирд╛рд╣реАрдд.
- рдХреЛрдгреА рдЪреЛрд░реВрди рддрд┐рд╕рд░реЗ рдореВрд▓ рдЖрдгрд▓реЗ? тЖТ рд╡рд░реНрдЧ-рдкреНрд░рдореБрдЦ рдПрдХрд╛рд▓рд╛ рдкрд░рдд рдкрд╛рдард╡рддреЛ. рдмрд░реЛрдмрд░ 2. рдиреЗрд╣рдореА.
- рд╢рд┐рдХреНрд╖рд┐рдХрд╛рдВрдиреА рдирд┐рдпрдо рдмрджрд▓реВрди "3 рдореБрд▓реЗ" рдХреЗрд▓рд╛? тЖТ рд╡рд░реНрдЧ-рдкреНрд░рдореБрдЦ рдПрдХ рд╡рд╛рдврд╡рддреЛ.
рд╣рд╛рдЪ Deployment. рддреБрдореНрд╣реА Kubernetes рд▓рд╛ рдХрд╛рдп рдХрд░рд╛рдпрдЪреЗ рддреЗ рд╕рд╛рдВрдЧрдд рдирд╛рд╣реА тАФ рддреБрдореНрд╣реА рддреНрдпрд╛рд▓рд╛ рдЬрдЧ рдХрд╕реЗ рджрд┐рд╕рд╛рдпрд▓рд╛ рд╣рд╡реЗ рддреЗ рд╕рд╛рдВрдЧрддрд╛ ("school-api рдЪреНрдпрд╛ 2 рдкреНрд░рддреА, version v5"), рдЖрдгрд┐ рд╡рд░реНрдЧ-рдкреНрд░рдореБрдЦ рд╡рд╛рд╕реНрддрд╡ рддреБрдордЪреНрдпрд╛ рдЗрдЪреНрдЫреЗрд╢реА рдЬреБрд│рддреЗ рдареЗрд╡рдгреНрдпрд╛рд╕рд╛рдареА рдХрд╛рдпрдо рдХрд╛рдо рдХрд░рддреЛ. Kubernetes рдордзрд▓реА рд╣реА рдПрдХрдореЗрд╡ рд╕рд░реНрд╡рд╛рдд рдореЛрдареА рдХрд▓реНрдкрдирд╛: desired state (рдЗрдЪреНрдЫрд┐рдд рд╕реНрдерд┐рддреА). рддреБрдореНрд╣реА рдЬрд╛рд╣реАрд░ рдХрд░рддрд╛; рддреЛ рдЬреБрд│рд╡реВрди рдШреЗрддреЛ.
ЁЯЧ║я╕П рдЖрдХреГрддреА
flowchart TB
Y["ЁЯзСтАНЁЯПл You declare:<br/>replicas: 2, image: v5"]
D["Deployment<br/>school-api"]
RS["ReplicaSet - the monitor<br/>keeps count = 2"]
P1["ЁЯкС Pod school-api-abc12"]
P2["ЁЯкС Pod school-api-def34"]
P3["ЁЯкС Pod school-api-xyz99<br/>auto-created replacement"]
Y --> D --> RS
RS --> P1
RS --> P2
P1 -. "ЁЯТе crashes" .-> P3
RS -- "notices 1 missing,<br/>creates a new one" --> P3
тЭУ рдХрд╛рдп
- Deployment рдЬрд╛рд╣реАрд░ рдХрд░рддреЛ: рдХреЛрдгрддреА image, рдХрд┐рддреА replicas, рддреНрдпрд╛рдВрдирд╛ update рдХрд╕реЗ рдХрд░рд╛рдпрдЪреЗ. рдЖрддреВрди рддреЛ рдПрдХ ReplicaSet (рдЦрд░рд╛ рдореЛрдЬрдгрд╛рд░рд╛/рд╡рд░реНрдЧ-рдкреНрд░рдореБрдЦ) рддрдпрд╛рд░ рдХрд░рддреЛ, рдЖрдгрд┐ рддреЛ Pods рддрдпрд╛рд░ рдХрд░рддреЛ.
- Labels рдЖрдгрд┐ selectors рд╣реЗ рдЬреЛрдбрдгрд╛рд░реЗ рдЧреЛрдВрдж рдЖрд╣реЗрдд: ReplicaSet рджрд╛рд╡рд╛ рдХрд░рддреЛ "
app: school-apilabel рдЕрд╕рд▓реЗрд▓реЗ pods рдорд╛рдЭреЗ" тАФ рд╣рд╛рдЪ рдзрдбрд╛ 02 рдордзрд▓рд╛ sticker. - Deployment тЖТ ReplicaSet тЖТ Pods. рддреБрдореНрд╣реА Deployment edit рдХрд░рддрд╛; рдмрд╛рдХреА рдЖрдкреЛрдЖрдк рдорд╛рдЧреЗ рдпреЗрддреЗ.
ЁЯза Desired state тЖТ reconciliation тЖТ actual state
Desired state replicas: 2 (what you wrote in git)
тЖУ
Kubernetes continuously compares (the controller loop, every few seconds, forever)
тЖУ
Actual state 1 Pod (one just crashed)
тЖУ
creates another Pod
тЖУ
Actual state = Desired state 2 Pods тЬЕ
Kubernetes рд╣реА рдПрдХ reconciliation (рдЬреБрд│рд╡рдгреА) system рдЖрд╣реЗ. рддреБрдореНрд╣реА рддреНрдпрд╛рд▓рд╛ рдХрдзреАрдЪ рдХрд╛рдп рдХрд░рд╛рдпрдЪреЗ рддреЗ рд╕рд╛рдВрдЧрдд рдирд╛рд╣реА тАФ рддреБрдореНрд╣реА рдЧреЛрд╖реНрдЯреА рдХрд╢рд╛ рдЕрд╕рд╛рд╡реНрдпрд╛рдд рддреЗ рд╕рд╛рдВрдЧрддрд╛, рдЖрдгрд┐ controllers рджрд░реА рдмреБрдЬрд╡рддрд╛рдд, рдХрд╛рдпрдо. рд╣рд╛ рдПрдХрдЪ loop Deployments, ReplicaSets, HPA (L09), Jobs (L18), StatefulSets (L22), operators (L25) рдЖрдгрд┐ ArgoCD (L14) рд╕рдордЬрд╛рд╡рддреЛ тАФ рддреЛрдЪ loop, рдлрдХреНрдд рдирд╡реА рдЯреЛрдкреА.
ЁЯдФ рдХрд╛
рдзрдбрд╛ 02 рдореЗрд▓реЗрд▓рд╛ pod рдореЗрд▓реЗрд▓рд╛рдЪ рд░рд╛рд╣рддреЛ рдпрд╛рд╡рд░ рд╕рдВрдкрд▓рд╛. рдЦрд▒реНрдпрд╛ apps рдирд╛ рд░рд╛рддреНрд░реА 3 рд╡рд╛рдЬрддрд╛ рддреБрдордЪреНрдпрд╛рд╢рд┐рд╡рд╛рдп рд╕реНрд╡рддрдГрд╣реВрди рдмрд░реЗ (self-heal) рд╡реНрд╣рд╛рд╡реЗ рд▓рд╛рдЧрддреЗ. Deployment рдореБрд│реЗрдЪ Kubernetes рд╡рд╛рд▓реЗ рд▓реЛрдХ рд╢рд╛рдВрдд рдЭреЛрдкрддрд╛рдд: crash рдЭрд╛рд▓реЗрд▓рд╛ pod, reboot рдЭрд╛рд▓реЗрд▓рд╛ node, рдорд╛рд░рд▓реЗрд▓рд╛ container тАФ рд╡рд░реНрдЧ-рдкреНрд░рдореБрдЦ рдпрд╛ рд╕рдЧрд│реНрдпрд╛рдВрдирд╛ рдмрджрд▓рддреЛ, рдХрд╛рд░рдг рддреБрдордЪреНрдпрд╛ YAML рдиреЗ рд╕рд╛рдВрдЧрд┐рддрд▓реЗ рд╣реЛрддреЗ "2 рдЕрд╕рддреАрд▓". рддреЛ рдПрдХрд╛ рд╡реЗрд│реА рдПрдХ pod рдмрджрд▓реВрди zero-downtime upgrades (рдзрдбрд╛ 11) рд╕реБрджреНрдзрд╛ рд╢рдХреНрдп рдХрд░рддреЛ.
ЁЯФз рдХрд╕реЗ (рдпрд╛ repo рдордзреНрдпреЗ)
k8s/deployment.yaml рдЙрдШрдбрд╛:
spec:
replicas: 2 # тЖР the promise: ALWAYS 2 desks
selector:
matchLabels:
app: school-api # тЖР "my pods wear this sticker"
template: # тЖР lesson 02's pod blueprint
metadata:
labels:
app: school-api # тЖР the sticker itself (must match!)
image: IMAGE_PLACEHOLDER рдХрдбреЗ рд▓рдХреНрд╖ рджреНрдпрд╛ тАФ deploy рдЪреНрдпрд╛ рд╡реЗрд│реА CircleCI рддреНрдпрд╛рдд рдЦрд░рд╛ ECR image
tag рдЯрд╛рдХрддреЛ (.circleci/config.yml рдкрд╛рд╣рд╛).
ЁЯзк рдХрд░реВрди рдкрд╛рд╣рд╛
kubectl apply -f k8s/namespace.yaml # the room first (lesson 05 explains)
kubectl apply -f k8s/configmap.yaml # config (lesson 06 explains)
# For local play, use a public image instead of IMAGE_PLACEHOLDER:
sed 's|IMAGE_PLACEHOLDER|nginxdemos/hello:plain-text|; s|containerPort: 3000|containerPort: 80|' \
k8s/deployment.yaml | kubectl apply -f -
kubectl -n school get pods # 2 pods, names like school-api-xxxxx
# ЁЯШИ Now be the chaos: delete one pod...
kubectl -n school delete pod -l app=school-api --field-selector=status.phase=Running --wait=false
kubectl -n school get pods -w # ...watch the monitor replace it in seconds! Ctrl+C to stop
ЁЯФз рдпрд╛ рдзрдбреНрдпрд╛рд╕рд╛рдареА kubectl
kubectl get deploy ┬╖ kubectl get rs ┬╖ kubectl scale ┬╖ kubectl rollout status
ЁЯФЧ рдпрд╛рд╡рд░ рдЖрдзрд╛рд░рд┐рдд: ЁЯкк AWS L12 (ASG рдореНрд╣рдгрдЬреЗ 'computers рд╕рд╛рдареАрдЪрд╛ Deployment')
тЬЕ рддрдкрд╛рд╕рд╛ тАФ рддреБрдореНрд╣рд╛рд▓рд╛ рдХрд╛рдп рджрд┐рд╕рд╛рдпрд▓рд╛ рд╣рд╡реЗ
рджреЛрдирдкреИрдХреА рдПрдХрд╛рд╡рд░ kubectl delete pod тЖТ рдХрд╛рд╣реА рд╕реЗрдХрдВрджрд╛рдВрдд kubectl get pods рдордзреНрдпреЗ NEW pod рдЪреЗ рдирд╛рд╡ рдЖрдгрд┐ рдкреБрдиреНрд╣рд╛ 2/2 рджрд┐рд╕рддреЗ тАФ reconciliation рдкреНрд░рддреНрдпрдХреНрд╖ рдХрд╛рдо рдХрд░рддрд╛рдирд╛.
ЁЯз╣ рд╕рд╛рдлрд╕рдлрд╛рдИ
local cluster: kubectl delete -f k8s/ (рдХрд┐рдВрд╡рд╛ рддреБрдореНрд╣реА apply рдХреЗрд▓реЗрд▓реА file) тАФ EKS рд╡рд░ рдЪрд╛рд▓реВ рд░рд╛рд╣рд┐рд▓реЗрд▓реНрдпрд╛ рдкреНрд░рддреНрдпреЗрдХ рдЧреЛрд╖реНрдЯреАрдЪреЗ рддрд╛рд╕рд╛рдкреНрд░рдорд╛рдгреЗ рдмрд┐рд▓ рд▓рд╛рдЧрддреЗ
тЪая╕П рдиреЗрд╣рдореАрдЪреНрдпрд╛ рдЪреБрдХрд╛
- ReplicaSet рд╡рд░ replicas edit рдХрд░рдгреЗ тАФ Deployment edit рдХрд░рд╛, RS рдлрдХреНрдд рддреНрдпрд╛рдЪрд╛ рдореЛрдЬрдгрд╛рд░рд╛ рдЖрд╣реЗ
- production рдордзреНрдпреЗ рд╣рд╛рддрд╛рдиреЗ
kubectl scaleрдХрд░рдгреЗ рдЖрдгрд┐ GitOps рддреЗ рдкрд░рдд рдмрджрд▓реЗрд▓ рд╣реЗ рд╡рд┐рд╕рд░рдгреЗ (L14)
тПня╕П рдкреБрдвреЗ
рдЖрддрд╛ pods рд╕реНрд╡рддрдГрд╣реВрди рдмрд░реЗ рд╣реЛрддрд╛рдд тАФ рдкрдг рддреНрдпрд╛рдВрдЪреА рдирд╛рд╡реЗ рдЖрдгрд┐ IPs рдкреНрд░рддреНрдпреЗрдХ рд╡реЗрд│реА рдмрджрд▓рддрд╛рдд. рдордЧ рдХреЛрдгреА рддреНрдпрд╛рдВрдирд╛ рдЦрд╛рддреНрд░реАрдиреЗ рд╢реЛрдзрд╛рдпрдЪреЗ рдХрд╕реЗ? Service тАФ рд╢рд╛рд│реЗрдЪреЗ рд╕реНрд╡рд╛рдЧрдд-рдХрдХреНрд╖ (reception).
git checkout lesson-04-services