ЁЯзп рдзрдбрд╛ 21 тАФ DaemonSets: рдкреНрд░рддреНрдпреЗрдХ рдордЬрд▓реНрдпрд╛рд╡рд░ рдПрдХ
ЁЯУН рддреБрдореНрд╣реА рдЗрдереЗ рдЖрд╣рд╛рдд: рдзрдбрд╛ 21 / 26 ┬╖ рдорд╛рдЧреАрд▓: lesson-20-taints-affinity ┬╖ рдкреБрдвреАрд▓: lesson-22-statefulsets
ЁЯУж рдпрд╛ рдмреНрд░рдБрдЪрдордзреНрдпреЗ рдХрд╛рдп рдЖрд╣реЗ
рдЖрдзреАрдЪреЗ рд╕рдЧрд│реЗ, рдЖрдгрд┐ workload рдЪрд╛ рддрд┐рд╕рд░рд╛ рдЖрдХрд╛рд░: DaemonSets тАФ рдкреНрд░рддреНрдпреЗрдХ node рд╡рд░ рдиреЗрдордХрд╛ рдПрдХ pod.
ЁЯзТ 5 рд╡рд░реНрд╖рд╛рдВрдЪреНрдпрд╛ рдореБрд▓рд╛рд▓рд╛ рд╕рдордЬрд╛рд╡рд▓реНрдпрд╛рд╕рд╛рд░рдЦреЗ
рдЖрдЧ-рд╕реБрд░рдХреНрд╖реЗрдЪреЗ рдирд┐рдпрдо ЁЯзп: "рдкреНрд░рддреНрдпреЗрдХ рдордЬрд▓реНрдпрд╛рд╡рд░ рдПрдХ рдЕрдЧреНрдирд┐рд╢рд╛рдордХ." "рдЗрдорд╛рд░рддреАрдд рдХреБрдареЗрддрд░реА рджреЛрди рдЕрдЧреНрдирд┐рд╢рд╛рдордХ" рдирд╛рд╣реА тАФ рдкреНрд░рддреНрдпреЗрдХ рдордЬрд▓реНрдпрд╛рд╡рд░, рдиреЗрдордХрд╛ рдПрдХ, рдЕрдкрд╡рд╛рдж рдирд╛рд╣реА. рдирд╡рд╛ рдордЬрд▓рд╛ рдмрд╛рдВрдзрд▓рд╛? рддреНрдпрд╛рд╕реЛрдмрдд рдЕрдЧреНрдирд┐рд╢рд╛рдордХ рдпреЗрддреЛ. рдордЬрд▓рд╛ рдкрд╛рдбрд▓рд╛? рддреНрдпрд╛рдЪрд╛ рдЕрдЧреНрдирд┐рд╢рд╛рдордХрд╣реА рдЬрд╛рддреЛ.
рд╣рд╛рдЪ DaemonSet тАФ рдЖрддрд╛ рддреБрдореНрд╣рд╛рд▓рд╛ рдорд╛рд╣реАрдд рдЕрд╕рд▓реЗрд▓реНрдпрд╛ рддреАрди рдЖрдХрд╛рд░рд╛рдВрдЪреА рддреБрд▓рдирд╛ рдХрд░рд╛:
- Deployment (L03): "N copies, рдХреБрдареЗ рддреЗ рдорд▓рд╛ рдлрд░рдХ рдкрдбрдд рдирд╛рд╣реА" тАФ apps.
- StatefulSet (рдкреБрдврдЪрд╛ рдзрдбрд╛): "рдирд╛рд╡реЗ рдЖрдгрд┐ рд╕реНрд╡рддрдГрдЪреЗ drawers рдЕрд╕рд▓реЗрд▓реНрдпрд╛ N copies."
- DaemonSet: "рдкреНрд░рддреНрдпреЗрдХ рдмрд╛рдХрд╛рд╡рд░ рдПрдХ copy, рдмрд╛рдХрд╛рдВрдЪреНрдпрд╛ рд╕рдВрдЦреНрдпреЗрд╢реА рдХрд╛рдпрдо рдЬреБрд│рдгрд╛рд░реА."
рдкреНрд░рддреНрдпреЗрдХ рдордЬрд▓реНрдпрд╛рд╡рд░ рдХреЛрдг рд╣рд╡реЗ? рдЗрдорд╛рд░рддреАрдЪрд╛ рд╕реНрд╡рддрдГрдЪрд╛ рдХрд░реНрдордЪрд╛рд░реА рд╡рд░реНрдЧ: рдХреЙрд░рд┐рдбреЙрд░рдордзрд▓реНрдпрд╛ рдлреЛрдирдЪреА wiring (kube-proxy тАФ рдзрдбрд╛ 04 рдЪреНрдпрд╛ Services рдкреНрд░рддреНрдпрдХреНрд╖ route рдХрд╕реЗ рдХрд░рддрд╛рдд!), intercom рдмрд╕рд╡рдгрд╛рд░рд╛ (CNI plugin), log collectors (рддреНрдпрд╛ рдмрд╛рдХрд╛рд╡рд░рдЪреНрдпрд╛ рдкреНрд░рддреНрдпреЗрдХ pod рдЪреА рджреИрдирдВрджрд┐рдиреА рд╡рд╛рдЪреВрди рдмрд╛рд╣реЗрд░ рдкрд╛рдард╡рддрд╛рдд тАФ рдзрдбрд╛ 26 рд╣реЗ рд╡рд╛рдкрд░рддреЛ), monitoring agents (node-exporter), рдЖрдгрд┐ security sensors. рддреБрдореНрд╣реА рдзрдбрд╛ 01 рдкрд╛рд╕реВрди рдирдХрд│рдд DaemonSets рдЪрд╛рд▓рд╡рдд рдЖрд╣рд╛рдд. ЁЯдп
рддреНрдпрд╛рдВрдЪреНрдпрд╛рдХрдбреЗ рд╕рд╣рд╕рд╛ рдореВрдарднрд░ tolerations рдЕрд╕рддрд╛рдд (рдзрдбрд╛ 20!) тАФ рдЕрдЧреНрдирд┐рд╢рд╛рдордХ tainted рдордЬрд▓реНрдпрд╛рдВрд╡рд░рд╣реА рдЬрд╛рддреЛ, рдЕрдЧрджреА рд╢рд┐рдХреНрд╖рд┐рдХрд╛рдВрдЪреНрдпрд╛ рд╡рд┐рд╢реНрд░рд╛рдВрддреА-рдЦреЛрд▓реАрддрд╕реБрджреНрдзрд╛.
ЁЯЧ║я╕П рдЖрдХреГрддреА
flowchart TB
ds["ЁЯзп DaemonSet: log-collector<br/>'one per desk, always'"]
subgraph n1["ЁЯЦея╕П desk 1"]
a1["ЁЯкС app podsтАж"]
d1["ЁЯзп collector"]
end
subgraph n2["ЁЯЦея╕П desk 2"]
a2["ЁЯкС app podsтАж"]
d2["ЁЯзп collector"]
end
subgraph n3["ЁЯЦея╕П NEW desk 3<br/>added by autoscaler"]
d3["ЁЯзп collector<br/>appears automatically"]
end
ds --> d1
ds --> d2
ds -.->|"new desk тЖТ new copy,<br/>no human involved"| d3
тЭУ рдХрд╛рдп
- DaemonSet рд▓рд╛ pod template рдЕрд╕рддреЛ (Deployment рд╕рд╛рд░рдЦрд╛) рдкрдг replica count рдирд╕рддреЛ тАФ nodes рдЪреА рдпрд╛рджреА рд╣реАрдЪ рд╕рдВрдЦреНрдпрд╛. Nodes рд╡рд╛рдврд▓реЗ (рдзрдбрд╛ 15 рдЪрд╛ autoscaler!) рдХреА daemons рдЖрдкреЛрдЖрдк рд╡рд╛рдврддрд╛рдд.
nodeSelector/affinity рдиреЗ рдХрд╛рд╣реА рдордЬрд▓реНрдпрд╛рдВрдкреБрд░рддреЗ рдорд░реНрдпрд╛рджрд┐рдд рдХрд░рд╛ ("рдлрдХреНрдд Linux рдмрд╛рдХ", "рдлрдХреНрдд GPU pool") тАФ рдирд┐рд╡рдбрд▓реЗрд▓реНрдпрд╛рдВрдордзреНрдпреЗ рдкреНрд░рддреНрдпреЗрдХ node рд╡рд░ рдПрдХ.- Rolling updates Deployments рд╕рд╛рд░рдЦреЗрдЪ рдЪрд╛рд▓рддрд╛рдд (
updateStrategy), рдкрдг рдЬрд╛рд╕реНрдд рд╡рд┐рдЪрд╛рд░ рдХрд░рд╛: рдмрд┐рдШрдбрд▓реЗрд▓рд╛ log agent рд╕рдЧрд│реАрдХрдбреЗ рдПрдХрджрдо update рдХреЗрд▓рд╛ рддрд░ рд╕рдЧрд│реАрдХрдбреЗ рдПрдХрджрдо рддреНрд░рд╛рд╕ рд╣реЛрддреЛ тАФmaxUnavailable: 1рддреБрдордЪрд╛ рдорд┐рддреНрд░ рдЖрд╣реЗ. - Daemons рдирд╛ рд╕рд╣рд╕рд╛ node-рдкрд╛рддрд│реАрд╡рд░рдЪрд╛ access рд▓рд╛рдЧрддреЛ:
/var/log/containersрд╡рд╛рдЪрд╛рдпрд▓рд╛ hostPath volumes, рдХрдзреАрдХрдзреА host networking тАФ рдореНрд╣рдгреВрдирдЪ рдЗрдереЗ RBAC (L17) рдЖрдгрд┐ рд╕рдВрдпрдо рдорд╣рддреНрддреНрд╡рд╛рдЪрд╛; DaemonSet рдкреНрд░рддреНрдпреЗрдХ рдмрд╛рдХрд╛рд╡рд░ рдЕрд╕рддреЛ.
ЁЯдФ рдХрд╛
рдкреНрд░рддреНрдпреЗрдХ node рдЪреНрдпрд╛ рдЧрд░рдЬрд╛ Deployments рд╡рд░ рдЯрд╛рдХрддрд╛ рдпреЗрдд рдирд╛рд╣реАрдд тАФ "рдХреБрдареЗрд╣реА N copies" рдореБрд│реЗ рдЬреНрдпрд╛ node рдЪреЗ logs рддреБрдореНрд╣рд╛рд▓рд╛ рд╣рд╡реЗ рд╣реЛрддреЗ рддреНрдпрд╛рдЪ node рд╡рд░ рд╢реВрдиреНрдп collectors рдпреЗрдК рд╢рдХрддрд╛рдд. DaemonSets node-рдкрд╛рддрд│реАрд╡рд░рдЪреА infrastructure declarative рдЖрдгрд┐ рд╕реНрд╡рддрдГ рд╕рд╛рдВрднрд╛рд│рдгрд╛рд░реА рдмрдирд╡рддрд╛рдд: platform team рдЪреЗ tools fleet рд╡рд╛рдврддрд╛рдирд╛, рдХрдореА рд╣реЛрддрд╛рдирд╛ рдЖрдгрд┐ рдмрд░рд╛ рд╣реЛрддрд╛рдирд╛ рдЖрдкреЛрдЖрдк рддрд┐рдЪреНрдпрд╛рдорд╛рдЧреЗ рдЬрд╛рддрд╛рдд.
ЁЯзк рдХрд░реВрди рдкрд╛рд╣рд╛
# you already run DaemonSets тАФ meet them:
kubectl -n kube-system get daemonsets
# kube-proxy (lesson 04's routing!) + your CNI тАФ DESIRED == number of nodes
# a toy extinguisher on every floor:
kubectl -n school apply -f - <<'EOF'
apiVersion: apps/v1
kind: DaemonSet
metadata: { name: floor-watch }
spec:
selector: { matchLabels: { app: floor-watch } }
template:
metadata: { labels: { app: floor-watch } }
spec:
containers:
- name: watch
image: busybox
command: ["sh","-c","echo watching floor $(hostname); sleep infinity"]
resources: { requests: { cpu: 10m, memory: 16Mi } }
EOF
kubectl -n school get ds,pods -o wide | grep floor
# multi-node cluster? one pod PER node. minikube: one node, one pod тАФ
# `minikube node add` and watch a second appear by itself ЁЯОЙ
kubectl -n school delete ds floor-watch
ЁЯФз рдпрд╛ рдзрдбреНрдпрд╛рд╕рд╛рдареА kubectl
kubectl get ds -A ┬╖ kubectl rollout status ds/тАж
ЁЯФЧ рдпрд╛рд╡рд░ рдЖрдзрд╛рд░рд┐рдд: ЁЯкк AWS L18 (рдкреНрд░рддреНрдпреЗрдХ рдмрд╛рдХрд╛рд╡рд░рдЪрд╛ CloudWatch agent)
тЬЕ рддрдкрд╛рд╕рд╛ тАФ рддреБрдореНрд╣рд╛рд▓рд╛ рдХрд╛рдп рджрд┐рд╕рд▓реЗ рдкрд╛рд╣рд┐рдЬреЗ
kubectl get ds рдордзреНрдпреЗ DESIRED = nodes рдЪреА рд╕рдВрдЦреНрдпрд╛ рджрд┐рд╕рддреЗ; рдПрдХ node рдЬреЛрдбрд╛ тЖТ рдирд╡рд╛ pod рдЖрдкреЛрдЖрдк рджрд┐рд╕рддреЛ.
ЁЯз╣ рд╕рд╛рдлрд╕рдлрд╛рдИ
local cluster: kubectl delete -f k8s/ (рдХрд┐рдВрд╡рд╛ рддреБрдореНрд╣реА apply рдХреЗрд▓реЗрд▓реА file) тАФ EKS рд╡рд░ рдЪрд╛рд▓реВ рд░рд╛рд╣рд┐рд▓реЗрд▓реНрдпрд╛ рдХрд╢рд╛рдЪреЗрд╣реА рддрд╛рд╕рд╛рдкреНрд░рдорд╛рдгреЗ рдмрд┐рд▓ рдпреЗрддреЗ
тЪая╕П рдиреЗрд╣рдореАрдЪреНрдпрд╛ рдЪреБрдХрд╛
- load рдиреБрд╕рд╛рд░ рд╡рд╛рдврд╛рдпрд▓рд╛ рд╣рд╡реЗ рдЕрд╢рд╛ app рд╕рд╛рдареА DaemonSet тАФ рддреЗ Deployment рдЪреЗ рдХрд╛рдо рдЖрд╣реЗ
- tolerations рд╡рд┐рд╕рд░рдгреЗ тАФ tainted nodes рд╡рд░ рдкреЛрд╣реЛрдЪрд╛рдпрд▓рд╛ DaemonSets рдирд╛ рддреНрдпрд╛ рд▓рд╛рдЧрддрд╛рдд
тПня╕П рдкреБрдвреЗ
рдирд╛рд╡реЗ рдЖрдгрд┐ рд╕реНрд╡рддрдГрдЪреЗ drawers рдЕрд╕рд▓реЗрд▓реЗ pods тАФ cluster рдЪреНрдпрд╛ рдЖрдд database, рдиреАрдЯрдкрдгреЗ рдЪрд╛рд▓рд╡рдгреЗ: StatefulSets.
git checkout lesson-22-statefulsets