ЁЯкС рдзрдбрд╛ 02 тАФ Pods: рд╢рд╛рд│реЗрддрд▓рд╛ рдПрдХ рдмрд╛рдХ
ЁЯУН рддреБрдореНрд╣реА рдЗрдереЗ рдЖрд╣рд╛рдд: 13 рдкреИрдХреА рдзрдбрд╛ 02 ┬╖ рдорд╛рдЧрдЪрд╛: lesson-01-containers ┬╖ рдкреБрдврдЪрд╛: lesson-03-deployments
ЁЯУж рдпрд╛ рдмреНрд░рдБрдЪрдордзреНрдпреЗ рдХрд╛рдп рдЖрд╣реЗ
рдзрдбрд╛ 01 рдордзрд▓реЗ рд╕рдЧрд│реЗ, рдЖрдгрд┐ рд╣рд╛ рдзрдбрд╛: Pod тАФ Kubernetes рдЪрд╛рд▓рд╡рдд рдЕрд╕рд▓реЗрд▓реА рд╕рд░реНрд╡рд╛рдд рд▓рд╣рд╛рди рдЧреЛрд╖реНрдЯ. рдпрд╛ рдзрдбреНрдпрд╛рдд рд╡рд╛рдкрд░рд▓реЗрд▓реНрдпрд╛ рдЦрд▒реНрдпрд╛ files:
- k8s/deployment.yaml тАФ рддреНрдпрд╛рддрд▓рд╛
template:рднрд╛рдЧ рдкрд╛рд╣рд╛ тАФ рддреЛрдЪ pod рдЪрд╛ рдЖрд░рд╛рдЦрдбрд╛ рдЖрд╣реЗ
ЁЯзТ 5 рд╡рд░реНрд╖рд╛рдВрдЪреНрдпрд╛ рдореБрд▓рд╛рд▓рд╛ рд╕рдордЬрд╛рд╡рд▓реНрдпрд╛рд╕рд╛рд░рдЦреЗ
рд╢рд╛рд│реЗрдд рддреБрдореНрд╣реА рдХрдзреАрдЪ рд╣рд╡реЗрдд рддрд░рдВрдЧрдд рдирд╛рд╣реА тАФ рддреБрдореНрд╣реА рдмрд╛рдХрд╛рд╡рд░ ЁЯкС рдмрд╕рддрд╛. рдмрд╛рдХ рддреБрдореНрд╣рд╛рд▓рд╛ рдЬрд╛рдЧрд╛ рджреЗрддреЛ: рддреБрдордЪреА рдЦреБрд░реНрдЪреА, рддреБрдордЪреНрдпрд╛ рдирд╛рд╡рд╛рдЪреА рдкрд╛рдЯреА, рддреБрдордЪреА рдЫреЛрдЯреА рдлрд│реА. рдХрдзреА рдХрдзреА рджреЛрди рдЬрд┐рд╡рд▓рдЧ рдореИрддреНрд░рд┐рдгреА рдПрдХрд╛рдЪ рджреБрд╣реЗрд░реА рдмрд╛рдХрд╛рд╡рд░ рдмрд╕рддрд╛рдд рдЖрдгрд┐ рд▓рдЧреЗрдЪ рдПрдХрдореЗрдХреАрдВрдЪреНрдпрд╛ рдХрд╛рдирд╛рдд рдХреБрдЬрдмреБрдЬреВ рд╢рдХрддрд╛рдд.
Pod рдореНрд╣рдгрдЬреЗ рддреБрдордЪреНрдпрд╛ container рд╕рд╛рдареАрдЪрд╛ рдмрд╛рдХ. Kubernetes рдХрдзреАрдЪ container рдереЗрдЯ рдЪрд╛рд▓рд╡рдд рдирд╛рд╣реА тАФ рддреЛ рдЖрдзреА рддреНрдпрд╛рд▓рд╛ рдиреЗрд╣рдореА рдПрдХ рдмрд╛рдХ рджреЗрддреЛ. рддреНрдпрд╛ рдмрд╛рдХрд╛рдХрдбреЗ рдЕрд╕рддреЗ:
- рдПрдХ рдкрддреНрддрд╛ (рд╕реНрд╡рддрдГрдЪрд╛ IP) тАФ рдмрд╛рдХрд╛рд╡рд░рдЪреНрдпрд╛ рдирд╛рд╡рд╛рдЪреНрдпрд╛ рдкрд╛рдЯреАрд╕рд╛рд░рдЦрд╛,
- рд╕рд╛рдорд╛рдпрд┐рдХ рд╕рд╛рдард╡рдг тАФ рдмрд╛рдХрд╛рдЦрд╛рд▓рдЪреА рдлрд│реА,
- рдХрдзреА рдХрдзреА рдорджрддрдиреАрд╕ container рд╕рд╛рдареА рдЬрд╛рдЧрд╛ тАФ рджреБрд╣реЗрд░реА рдмрд╛рдХ рд╡рд╛рдЯреВрди рдШреЗрдгрд╛рд░реА рдореИрддреНрд░реАрдг (рдпрд╛рд▓рд╛ "sidecar" рдореНрд╣рдгрддрд╛рдд).
рдЖрдгрд┐ рдЖрддрд╛ рдорд╣рддреНрддреНрд╡рд╛рдЪрд╛ рднрд╛рдЧ: рдмрд╛рдХ рдмрджрд▓рддрд╛ рдпреЗрддрд╛рдд. рддреБрдордЪрд╛ рдмрд╛рдХ рддреБрдЯрд▓рд╛ рддрд░ рд╢рд╛рд│рд╛ рддреЛ рджреБрд░реБрд╕реНрдд рдХрд░рдд рдирд╛рд╣реА тАФ рддреЛ рдлреЗрдХреВрди рджреЗрддреЗ рдЖрдгрд┐ рддреБрдореНрд╣рд╛рд▓рд╛ рдирд╡реНрдпрд╛ рдирд╛рд╡рд╛рдЪреНрдпрд╛ рдкрд╛рдЯреАрд╕рд╣ рдирд╡рд╛ рдмрд╛рдХ рджреЗрддреЗ. Pods рдкрдг рддрд╕реЗрдЪ рдЖрд╣реЗрдд: рддреЗ cattle рдЖрд╣реЗрдд, pets рдирд╛рд╣реАрдд. рддреЗ рдпреЗрддрд╛рдд рдЖрдгрд┐ рдЬрд╛рддрд╛рдд; рдХреЛрдгреА рд░рдбрдд рдирд╛рд╣реА.
ЁЯЧ║я╕П рдЖрдХреГрддреА
flowchart TB
subgraph pod["ЁЯкС Pod - one desk, IP 10.0.4.7"]
direction LR
c1["ЁЯУж main container<br/>school-api"]
c2["ЁЯУж optional sidecar<br/>e.g. log collector"]
v["ЁЯЧДя╕П shared shelf<br/>volume"]
c1 --- v
c2 --- v
end
net["ЁЯМР Cluster network"] -->|"talks to the desk,<br/>not the kid"| pod
тЭУ рдХрд╛рдп
- Pod = рдПрдХ рдХрд┐рдВрд╡рд╛ рдЕрдзрд┐рдХ containers рдЬреЗ рдиреЗрд╣рдореА рдПрдХрд╛рдЪ machine рд╡рд░ рдПрдХрддреНрд░ рд░рд╛рд╣рддрд╛рдд, рдПрдХ IP address рдЖрдгрд┐ рдЧрд░рдЬ рдЕрд╕рд▓реНрдпрд╛рд╕ volumes рд╡рд╛рдЯреВрди рдШреЗрддрд╛рдд.
- 99% pods рдордзреНрдпреЗ рдПрдХрдЪ container рдЕрд╕рддреЛ (рдЖрдкрд▓реНрдпрд╛ pods рдордзреНрдпреЗрд╣реА). рдЕрдиреЗрдХ containers рдЕрд╕рд▓реЗрд▓реЗ pods рдЬрд╡рд│рдЪреНрдпрд╛ рдорджрддрдиреАрд╕рд╛рдВрд╕рд╛рдареА (sidecars) рдЕрд╕рддрд╛рдд, рд╕рдВрдкреВрд░реНрдг app рдПрдХрд╛рдЪ pod рдордзреНрдпреЗ рдХреЛрдВрдмрдгреНрдпрд╛рд╕рд╛рдареА рдирд╛рд╣реАрдд.
- Pods рдХреНрд╖рдгрднрдВрдЧреБрд░ (ephemeral) рдЕрд╕рддрд╛рдд: рддреЗ рдмрдирддрд╛рдд, рдорд░рддрд╛рдд, рдЖрдгрд┐ рддреНрдпрд╛рдВрдЪреНрдпрд╛ рдЬрд╛рдЧреА рдпреЗрдгрд╛рд▒реНрдпрд╛рдВрдирд╛ рдирд╡реЗ рдирд╛рд╡ рдЖрдгрд┐ рдирд╡рд╛ IP рдорд┐рд│рддреЛ. рдХрдзреАрдЪ pod рдЪреНрдпрд╛ IP рдХрдбреЗ рдереЗрдЯ рдмреЛрдЯ рджрд╛рдЦрд╡реВ рдирдХрд╛ (рдзрдбрд╛ 04 рд╣реЗ рд╕реЛрдбрд╡рддреЛ).
ЁЯдФ рдХрд╛
Containers рдереЗрдЯ рдХрд╛ рдЪрд╛рд▓рд╡реВ рдирдпреЗрдд? рдХрд╛рд░рдг рдХреЛрдгрддреНрдпрд╛рд╣реА container рд▓рд╛ IP, storage, health-checking рдЖрдгрд┐ machine рд╡рд░ рдЬрд╛рдЧрд╛ рджреЗрдгреНрдпрд╛рд╕рд╛рдареА Kubernetes рд▓рд╛ рдПрдХ рд╕рдорд╛рди рдЖрд╡рд░рдг рд╣рд╡реЗ. Pod рд╣реЗрдЪ рддреЗ рдЖрд╡рд░рдг тАФ рдкреНрд░рддреНрдпреЗрдХ program рдЬреНрдпрд╛рд╡рд░ рдмрд╕рддреЛ рддреЛ рдард░рд▓реЗрд▓рд╛ рдмрд╛рдХ, рдЬреНрдпрд╛рдореБрд│реЗ рд╢рд╛рд│рд╛ Node.js app рдЖрдгрд┐ Python app рдЕрдЧрджреА рдПрдХрд╛рдЪ рдкрджреНрдзрддреАрдиреЗ рд╕рд╛рдВрднрд╛рд│реВ рд╢рдХрддреЗ.
ЁЯФз рдХрд╕реЗ (рдпрд╛ repo рдордзреНрдпреЗ)
рдЖрдкрдг рдХрдзреАрдЪ рд╕реНрд╡рддрдВрддреНрд░ Pod file рд▓рд┐рд╣рд┐рдд рдирд╛рд╣реА тАФ рдЖрдгрд┐ рд╣рд╛рдЪ рдПрдХ рдЦрд░рд╛ рдзрдбрд╛ рдЖрд╣реЗ:
k8s/deployment.yaml рдордзреНрдпреЗ template: рдЦрд╛рд▓рдЪрд╛ рднрд╛рдЧ
рд╣рд╛рдЪ pod рдЪрд╛ рдЖрд░рд╛рдЦрдбрд╛ рдЖрд╣реЗ:
template: # тЖР the pod blueprint ("desk design")
metadata:
labels:
app: school-api # тЖР sticker on the desk (lesson 03 explains why)
spec:
containers:
- name: school-api
image: IMAGE_PLACEHOLDER
ports:
- containerPort: 3000
Deployment (рдзрдбрд╛ 03) рдпрд╛ design рд╡рд░реВрди рдмрд╛рдХ рддрдпрд╛рд░ рдХрд░рддреЛ.
ЁЯзк рдХрд░реВрди рдкрд╛рд╣рд╛
рдХреЛрдгрддреНрдпрд╛рд╣реА local cluster рд╕реЛрдмрдд (Docker Desktop рдордзрд▓реЗ built-in Kubernetes, minikube start,
рдХрд┐рдВрд╡рд╛ kind create cluster):
# Run a single throwaway pod by hand тАФ the ONLY time you'll do this manually:
kubectl run hello --image=nginx --restart=Never
kubectl get pods -o wide # see its IP and which node it sits on
kubectl describe pod hello # the pod's full report card
kubectl delete pod hello # throw the desk away тАФ and notice:
kubectl get pods # ...nothing brings it back. That's lesson 03's job.
ЁЯФз рдпрд╛ рдзрдбреНрдпрд╛рд╕рд╛рдареА kubectl
kubectl get pods ┬╖ kubectl describe pod ┬╖ kubectl logs ┬╖ kubectl exec -it POD -- sh
ЁЯФЧ рдпрд╛рд╡рд░ рдЖрдзрд╛рд░рд┐рдд: ЁЯкк AWS L07 (node рдореНрд╣рдгрдЬреЗ рднрд╛рдбреНрдпрд╛рдиреЗ рдШреЗрддрд▓реЗрд▓рд╛ рдмрд╛рдХ)
тЬЕ рддрдкрд╛рд╕рд╛ тАФ рддреБрдореНрд╣рд╛рд▓рд╛ рдХрд╛рдп рджрд┐рд╕рд╛рдпрд▓рд╛ рд╣рд╡реЗ
kubectl get pods -n school рдордзреНрдпреЗ Running 1/1 рджрд┐рд╕рддреЗ; kubectl get pod POD -o wide рддреНрдпрд╛рдЪрд╛ IP рджрд╛рдЦрд╡рддреЗ.
ЁЯз╣ рд╕рд╛рдлрд╕рдлрд╛рдИ
kubectl delete pod POD тАФ рдПрдХрдЯрд╛ (controller рд╢рд┐рд╡рд╛рдпрдЪрд╛) pod рдкреБрдиреНрд╣рд╛ рддрдпрд╛рд░ рд╣реЛрдд рдирд╛рд╣реА (рддреЗ рдзрдбрд╛ 03 рдЪреЗ рдХрд╛рдо рдЖрд╣реЗ)
тЪая╕П рдиреЗрд╣рдореАрдЪреНрдпрд╛ рдЪреБрдХрд╛
- pod рдЬрд╛рдЧрдЪреНрдпрд╛ рдЬрд╛рдЧреА edit рдХрд░рдгреЗ тАФ рдмрджрд▓рд╛, рдХрдзреАрдЪ рджреБрд░реБрд╕реНрдд рдХрд░реВ рдирдХрд╛
- delete рдХреЗрд▓реНрдпрд╛рдирдВрддрд░ рдПрдХрдЯрд╛ pod рдкрд░рдд рдпреЗрдИрд▓ рдЕрд╢реА рдЕрдкреЗрдХреНрд╖рд╛ рдареЗрд╡рдгреЗ тАФ рдлрдХреНрдд controller рдЪ рддреЛ рдкреБрдиреНрд╣рд╛ рддрдпрд╛рд░ рдХрд░рддреЛ
тПня╕П рдкреБрдвреЗ
рдорд░рдгрд╛рд░рд╛ рдПрдХрдЯрд╛ pod рдореЗрд▓реЗрд▓рд╛рдЪ рд░рд╛рд╣рддреЛ. рдпреЛрдЧреНрдп рд╕рдВрдЦреНрдпреЗрдиреЗ рдмрд╛рдХ рдиреЗрд╣рдореА рдЬрд┐рд╡рдВрдд рдХреЛрдг рдареЗрд╡рддреЛ? Deployment тАФ рдХрдбрдХ рд╡рд░реНрдЧ-рдкреНрд░рдореБрдЦ.
git checkout lesson-03-deployments