ЁЯПЧя╕П рдзрдбрд╛ 24 тАФ Cluster upgrades: рд╢рд╛рд│рд╛ рдЪрд╛рд▓реВ рдЕрд╕рддрд╛рдирд╛ рдиреВрддрдиреАрдХрд░рдг
ЁЯУН рддреБрдореНрд╣реА рдЗрдереЗ рдЖрд╣рд╛рдд: рдзрдбрд╛ 24 / 26 ┬╖ рдорд╛рдЧреАрд▓: lesson-23-qos-evictions ┬╖ рдкреБрдвреАрд▓: lesson-25-crds-operators
ЁЯУж рдпрд╛ рдмреНрд░рдБрдЪрдордзреНрдпреЗ рдХрд╛рдп рдЖрд╣реЗ
рдЖрдзреАрдЪреЗ рд╕рдЧрд│реЗ, рдЖрдгрд┐ рдкреНрд░рддреНрдпреЗрдХ cluster рдорд╛рд▓рдХрд╛рд▓рд╛ рд╡рд░реНрд╖рд╛рддреВрди ~3 рд╡реЗрд│рд╛ рдХрд░рд╛рд╡реЗ рд▓рд╛рдЧрдгрд╛рд░реЗ рдХрд╛рдо: рд╢рд╛рд│рд╛ рдмрдВрдж рди рдХрд░рддрд╛ Kubernetes рд╕реНрд╡рддрдГрдЪ upgrade рдХрд░рдгреЗ.
ЁЯзТ 5 рд╡рд░реНрд╖рд╛рдВрдЪреНрдпрд╛ рдореБрд▓рд╛рд▓рд╛ рд╕рдордЬрд╛рд╡рд▓реНрдпрд╛рд╕рд╛рд░рдЦреЗ
Kubernetes рд╡рд░реНрд╖рд╛рддреВрди рддреАрди рд╡реЗрд│рд╛ рдирд╡реА version рдЖрдгрддреЗ, рдЖрдгрд┐ рдЬреБрдиреНрдпрд╛ versions рдирд╛ patches рдорд┐рд│рдгреЗ рдмрдВрдж рд╣реЛрддреЗ тАФ рдореНрд╣рдгреВрди upgrade рдХрд░рдгреЗ рдРрдЪреНрдЫрд┐рдХ рдирд╛рд╣реА, рддреЗ рдард░рд▓реЗрд▓реЗ рдиреВрддрдиреАрдХрд░рдг рдЖрд╣реЗ ЁЯПЧя╕П. рдиреВрддрдиреАрдХрд░рдгрд╛рдЪреЗ рдирд┐рдпрдо:
- рдЖрдзреА office, рдордЧ рд╡рд░реНрдЧрдЦреЛрд▓реНрдпрд╛. ЁЯПв control plane upgrade рдХрд░рд╛ (EKS: рдПрдХ API call/Terraform рдмрджрд▓ тАФ AWS рд╕реНрд╡рддрдГрдЪреНрдпрд╛ office рдЪреЗ рдиреВрддрдиреАрдХрд░рдг рди рджрд┐рд╕рддрд╛ рдХрд░рддреЗ), рдордЧ рдмрд╛рдХ. рдХрдзреАрдЪ рдЙрд▓рдЯреЗ рдирд╛рд╣реА: kubelets office рдкреЗрдХреНрд╖рд╛ рдереЛрдбреЗ рдЬреБрдиреЗ рдЕрд╕реВ рд╢рдХрддрд╛рдд, рдХрдзреАрдЪ рдирд╡реЗ рдирд╛рд╣реАрдд ("version skew" рдирд┐рдпрдо).
- рдПрдХрд╛ рд╡реЗрд│реА рдПрдХ рд╡рд░реНрдЧрдЦреЛрд▓реА, рдореБрд▓рд╛рдВрдирд╛ рд╕рднреНрдпрдкрдгреЗ рд╣рд▓рд╡рд╛. рдкреНрд░рддреНрдпреЗрдХ рдмрд╛рдХрд╛рд╕рд╛рдареА:
- cordon ЁЯЪз тАФ рджрд╛рд░рд╛рд╡рд░ рдкрдЯреНрдЯреА: "рдЗрдереЗ рдирд╡реА рдореБрд▓реЗ рдмрд╕рд╡рд╛рдпрдЪреА рдирд╛рд╣реАрдд"
(
kubectl cordonтАФ рдмрд╕рд▓реЗрд▓реА рдореБрд▓реЗ рдЬрд╛рдЧреАрдЪ рд░рд╛рд╣рддрд╛рдд); - drain ЁЯЪЪ тАФ рдореБрд▓рд╛рдВрдирд╛ рджреБрд╕рд▒реНрдпрд╛ рдмрд╛рдХрд╛рдВрдХрдбреЗ рдШреЗрдКрди рдЬрд╛
(
kubectl drainтАФ pods reschedule рд╣реЛрддрд╛рдд; рдзрдбрд╛ 03 рдЪрд╛ monitor рддреНрдпрд╛рдВрдирд╛ рджреБрд╕рд░реАрдХрдбреЗ рдкреБрдиреНрд╣рд╛ рдмрдирд╡рддреЛ); - рдмрд╛рдХ рдмрджрд▓рд╛ (managed node groups: рдирд╡реНрдпрд╛ kubelet рд╕рд╣ рдирд╡рд╛ EC2 рдмрд╛рдХ тАФ рдЧреБрд░реЗ, рдиреВрддрдиреАрдХрд░рдг рдХреЗрд▓реЗрд▓реЗ рд▓рд╛рдбрдХреЗ рдкреНрд░рд╛рдгреА рдирд╛рд╣реАрдд! AWS рдХреЛрд░реНрд╕ L12);
- uncordon тАФ рдкрдЯреНрдЯреА рдХрд╛рдврд╛, рдкреБрдврдЪреА рд╡рд░реНрдЧрдЦреЛрд▓реА.
- cordon ЁЯЪз тАФ рджрд╛рд░рд╛рд╡рд░ рдкрдЯреНрдЯреА: "рдЗрдереЗ рдирд╡реА рдореБрд▓реЗ рдмрд╕рд╡рд╛рдпрдЪреА рдирд╛рд╣реАрдд"
(
- PDBs рдЕрдЦреЗрд░ рдХрд╛рдорд╛рд▓рд╛ рдпреЗрддрд╛рдд. ЁЯН╜я╕П рдзрдбрд╛ 15 рдЪрд╛ PodDisruptionBudget рд╣рд╛рдЪ drain рд╕реБрд░рдХреНрд╖рд┐рдд рдмрдирд╡рддреЛ: "school-api рдЪреА рджреЛрдиреНрд╣реА рдореБрд▓реЗ рдХрдзреАрдЪ рдПрдХрджрдо рдмрд╛рд╣реЗрд░ рдирд╛рд╣реАрдд" тАФ рд╡рд░реНрдЧ рд╕рд╛рдВрднрд╛рд│рд▓рд╛ рдЬрд╛рдИрдкрд░реНрдпрдВрдд drain рдкреНрд░рддреНрдпреЗрдХ рдкрд╛рдпрд░реАрд╡рд░ рдерд╛рдВрдмрддреЛ. PDB рдирд╛рд╣реА = drain рдХреНрд╖рдгрднрд░рд╛рд╕рд╛рдареА рддреБрдордЪреЗ app рд░рд┐рдХрд╛рдореЗ рдХрд░реВ рд╢рдХрддреЛ. рдЖрддрд╛ рдХрд│рд▓реЗ рдЖрдкрдг рддреЛ рдХрд╛ рдареЗрд╡рд▓рд╛.
- рдлрдХреНрдд рдЫреЛрдЯреА рдкрд╛рд╡рд▓реЗ: рдПрдХрд╛ рд╡реЗрд│реА рдПрдХрдЪ minor version (1.31тЖТ1.32тЖТ1.33), рдЖрдзреА staging cluster, рдХрд╛рдвреВрди рдЯрд╛рдХрд▓реЗрд▓реНрдпрд╛ APIs рд╕рд╛рдареА release notes рд╡рд╛рдЪрд╛ (рдХреНрд▓рд╛рд╕рд┐рдХ рдмрд┐рдШрд╛рдб: рдирд╛рд╣реАрд╢реА рдЭрд╛рд▓реЗрд▓реА apiVersion рд╡рд╛рдкрд░рдгрд╛рд░рд╛ manifest).
ЁЯЧ║я╕П рдЖрдХреГрддреА
flowchart LR
plan["ЁЯУЛ read release notes<br/>check deprecated APIs"]
office["ЁЯПв 1 upgrade the office<br/>EKS control plane - one call"]
subgraph desks["2 then desk by desk"]
c["ЁЯЪз cordon<br/>no new kids"]
d["ЁЯЪЪ drain<br/>kids walk out politely<br/>PDB guards the minimum ЁЯН╜я╕П"]
r["ЁЯЦея╕П replace desk<br/>fresh EC2, new kubelet"]
u["тЬЕ uncordon<br/>next classroom"]
c --> d --> r --> u
end
plan --> office --> desks
u -.->|"repeat per node,<br/>school never closes"| c
тЭУ рдХрд╛рдп
- Skew рдирд┐рдпрдо: kubelet API server рдЪреНрдпрд╛ 3 minor versions рдкрд░реНрдпрдВрдд рдорд╛рдЧреЗ рдЕрд╕реВ рд╢рдХрддреЛ, рдкрдг рдХрдзреАрдЪ рдкреБрдвреЗ рдирд╛рд╣реА. Upgrade рдХреНрд░рдо: control plane тЖТ nodes тЖТ (рдордЧ add-ons: CNI, CoreDNS, kube-proxy тАФ EKS рдкреНрд░рддреНрдпреЗрдХ release рд╕рд╛рдареА рд╕реБрд╕рдВрдЧрдд versions рдЪреА рдпрд╛рджреА рджреЗрддреЗ).
- EKS flow: Terraform рдордзреНрдпреЗ
cluster_versionрд╡рд╛рдврд╡рд╛ тЖТ control plane рдЬрд╛рдЧреАрдЪ upgrade рд╣реЛрддреЛ (рддрд░реАрд╣реА multi-AZ, downtime рдирд╛рд╣реА) тЖТ node group рдЪреА AMI/version update рдХрд░рд╛ тЖТ EKS рдиреЗрдордХреЗ cordon-drain-replace рд╡рд╛рдкрд░реВрди, рддреБрдордЪреНрдпрд╛ PDBs рдЪрд╛ рдорд╛рди рд░рд╛рдЦрдд рдмрд╛рдХ рдмрджрд▓рдд рдЬрд╛рддреЗ. - рддреБрдореНрд╣рд╛рд▓рд╛ рдЦрд░реЛрдЦрд░ рд▓рд╛рдЧрддреАрд▓ рдЕрд╕реЗ
kubectl drainflags:--ignore-daemonsets(рдЕрдЧреНрдирд┐рд╢рд╛рдордХ рдордЬрд▓реНрдпрд╛рд▓рд╛ рдмреЛрд▓реНрдЯрдиреЗ рдкрдХреНрдХреЗ рд░рд╛рд╣рддрд╛рдд тАФ L21) рдЖрдгрд┐--delete-emptydir-data(рдХрдЪреНрдЪреНрдпрд╛ рдХрд╛рдорд╛рдЪреНрдпрд╛ рдлрд│реНрдпрд╛ рддрд╕реЗрд╣реА рдЯрд┐рдХрдд рдирд╛рд╣реАрдд). - рд╕рд╛рд╡рдзрд╛рди: single-replica apps (рд╣рд▓рд╡рд╛рдпрд▓рд╛ рджреБрд╕рд░реА рдЬрд╛рдЧрд╛рдЪ рдирд╛рд╣реА тАФ рдереЛрдбрд╛ downtime), drawer рдореБрд│реЗ рдПрдХрд╛ zone рд▓рд╛ рдмрд╛рдВрдзрд▓реЗрд▓реЗ StatefulSets (L22), рдЖрдгрд┐ рдЗрддрдХреЗ рдХрдбрдХ PDBs рдХреА drain рдХрдзреАрдЪ рдкреБрдвреЗ рдЬрд╛рдК рд╢рдХрдд рдирд╛рд╣реА (minAvailable = replicas тЖТ deadlock ЁЯШЕ).
ЁЯдФ рдХрд╛
upgrades рдЯрд╛рд│рдгрд╛рд░реЗ clusters patch рди рдХрд░рддрд╛ рдпреЗрдгрд╛рд░реА рд╕рдВрдЧреНрд░рд╣рд╛рд▓рдпреЗ рдмрдирддрд╛рдд, рдЖрдгрд┐ рд╢реЗрд╡рдЯреА рднрд╛рдЧ рдкрд╛рдбрдгрд╛рд░рд╛ рддрд┐рд╣реЗрд░реА-рдЙрдбреАрдЪрд╛ upgrade рдореНрд╣рдгрдЬреЗ рджрд╣рд╢рддреАрдЪрд╛ weekend. рд╡рд╛рд░рдВрд╡рд╛рд░ upgrade рдХрд░рдгрд╛рд▒реНрдпрд╛ teams рд╕рд╛рдареА рддреЗ рдХрдВрдЯрд╛рд│рд╡рд╛рдгреЗ рд╣реЛрддреЗ тАФ рдХрд╛рд░рдг рдпрд╛ рдХреЛрд░реНрд╕рдордзрд▓реА рдкреНрд░рддреНрдпреЗрдХ рдпрдВрддреНрд░рдгрд╛ (monitor, probes, PDB, multi-AZ, рдЧреБрд░рд╛рдВрд╕рд╛рд░рдЦреЗ рдмрд╛рдХ) рдиреЗрдордХреА рдпрд╛рд╕рд╛рдареАрдЪ рдЖрд╣реЗ рдХреА рдПрдЦрд╛рджрд╛ рдмрд╛рдХ рдХреЛрдгрддреНрдпрд╛рд╣реА рдХреНрд╖рдгреА рдореБрджреНрджрд╛рдо рдирд╛рд╣реАрд╕рд╛ рд╣реЛрдК рд╢рдХрд╛рд╡рд╛. Upgrade рдореНрд╣рдгрдЬреЗ рдлрдХреНрдд рдард░рд╡реВрди рдХреЗрд▓реЗрд▓рд╛ рдЧреЛрдВрдзрд│.
ЁЯзк рдХрд░реВрди рдкрд╛рд╣рд╛ (рдХреЛрдгрддреНрдпрд╛рд╣реА local cluster рд╡рд░ рд╕реБрд░рдХреНрд╖рд┐рдд)
kubectl version | head -2 # office vs desk versions
NODE=$(kubectl get nodes -o jsonpath='{.items[0].metadata.name}')
kubectl cordon $NODE # ЁЯЪз tape on the door
kubectl get nodes # SchedulingDisabled
kubectl -n school run newkid --image=busybox -- sleep 300
kubectl -n school get pod newkid # Pending тАФ no desk accepts new kids!
kubectl uncordon $NODE # tape off
kubectl -n school get pod newkid -w # seated ЁЯОЙ (Ctrl+C)
kubectl -n school delete pod newkid
# multi-node clusters only тАФ feel a real drain (watch the PDB hold the line):
# kubectl drain $NODE --ignore-daemonsets --delete-emptydir-data
# kubectl uncordon $NODE
ЁЯФз рдпрд╛ рдзрдбреНрдпрд╛рд╕рд╛рдареА kubectl
kubectl cordon/drain/uncordon ┬╖ kubectl get nodes
ЁЯФЧ рдпрд╛рд╡рд░ рдЖрдзрд╛рд░рд┐рдд: ЁЯкк AWS L12 (EKS node groups = рдмрд╛рдХрд╛рдВрдЪреЗ ASGs)
тЬЕ рддрдкрд╛рд╕рд╛ тАФ рддреБрдореНрд╣рд╛рд▓рд╛ рдХрд╛рдп рджрд┐рд╕рд▓реЗ рдкрд╛рд╣рд┐рдЬреЗ
kubectl cordon NODE тЖТ SchedulingDisabled; kubectl drain PDB рд╕рд╛рдареА рдерд╛рдВрдмрддреЛ, рдордЧ pods рд╣рд▓рддрд╛рдд; uncordon рддреЛ рдкреБрдиреНрд╣рд╛ рдЙрдШрдбрддреЛ.
ЁЯз╣ рд╕рд╛рдлрд╕рдлрд╛рдИ
kubectl uncordon NODE тАФ рд╡рд░реНрдЧрдЦреЛрд▓реА рдкрдЯреНрдЯреА рд▓рд╛рд╡реВрди рдмрдВрдж рдареЗрд╡реВ рдирдХрд╛
тЪая╕П рдиреЗрд╣рдореАрдЪреНрдпрд╛ рдЪреБрдХрд╛
- minor versions рд╡рдЧрд│рдгреЗ тАФ рдПрдХрд╛ рд╡реЗрд│реА рдПрдХрдЪ
- PDB рд╢рд┐рд╡рд╛рдп drain рдХрд░реВрди рд╕рдЧрд│реНрдпрд╛ replicas рдПрдХрджрдо рдмрдВрдж рдкрд╛рдбрдгреЗ
тПня╕П рдкреБрдвреЗ
Kubernetes рдкреВрд░реНрдгрдкрдгреЗ рдирд╡реЗ рд╢рдмреНрдж рдХрд╕реЗ рд╢рд┐рдХрддреЛ тАФ ArgoCD рдЪреНрдпрд╛ Application рдорд╛рдЧрдЪреА рдЖрдгрд┐
рдЕрд░реНрдзреНрдпрд╛ cloud-native рдЬрдЧрд╛рдорд╛рдЧрдЪреА рдпрдВрддреНрд░рдгрд╛: CRDs рдЖрдгрд┐ operators.
git checkout lesson-25-crds-operators