V tomto tutoriálu Kubernetes se naučíte odvodnit uzel pomocí příkazu kubectl drain k přípravě na údržbu.
Je to stejně jednoduché jako zadání tohoto příkazu:
kubectl drain node_name
Podrobnosti o uzlech můžete získat pomocí kubectl get nodes
příkaz.
Vyčerpávání uzlů v Kubernetes však obsahuje více, takže se na to pojďme podrobně podívat.
Proč potřebujete odvodnit uzly?
Kubernetes je navržen tak, aby byl odolný vůči selháním pracovních uzlů.
Mohou existovat různé důvody, proč se pracovní uzel stane nepoužitelným, například kvůli problémům s hardwarem, problémům s poskytovatelem cloudu nebo pokud dojde k problémům se sítí mezi pracovním a hlavním uzlem, hlavní uzel Kubernetes to efektivně zvládne.
Ale to neznamená, že to tak bude vždy. A to je, když potřebujete odvodnit uzly a odstranit všechny lusky.
Vypouštění je proces pro bezpečné vyjmutí všech lusků z uzlu. Tímto způsobem kontejnery běžící na podu ladně končí.
Jak správně vyprázdnit uzly v Kubernetes
Začněme praktickou ukázkou.
Krok 1:Označte uzel jako neplánovatelný (kordón)
Chcete-li provést údržbu uzlu, měli byste zrušit plán a poté vypustit uzel.
Nejprve se podívejte na aktuálně spuštěné uzly:
[email protected]:~# kubectl get nodes
NAME STATUS ROLES AGE VERSION
kmaster-rj Ready master 44d v1.18.8
kworker-rj1 Ready <none> 44d v1.18.8
kworker-rj2 Ready <none> 44d v1.18.8
[email protected]:~#
Podívejte se na moduly běžící na různých uzlech:
[email protected]:~# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
my-dep-557548758d-gprnr 1/1 Running 1 4d23h 172.16.213.48 kworker-rj1 <none> <none>
my-dep-557548758d-d2pmd 1/1 Running 1 4d15h 172.16.213.57 kworker-rj2 <none> <none>
pod-delete-demo 1/1 Running 1 2d 172.16.213.56 kworker-rj1 <none> <none>
[email protected]:~#
Nyní označte uzel jako neplánovatelný spuštěním následujícího příkazu:
[email protected]:~# kubectl cordon kworker-rj2
node/kworker-rj2 cordoned
[email protected]:~#
Vypište znovu uzly:
[email protected]:~# kubectl get nodes
NAME STATUS ROLES AGE VERSION
kmaster-rj Ready master 44d v1.18.8
kworker-rj1 Ready <none> 44d v1.18.8
kworker-rj2 Ready,SchedulingDisabled <none> 44d v1.18.8
[email protected]:~#
Můžete si všimnout, že uzel kworker-rj2 je nyní označen jako SchedulingDisabled.
Do tohoto kroku to nevyhodí moduly běžící na tomto uzlu. Ověřte stav pod:
[email protected]:~# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
my-dep-557548758d-gprnr 1/1 Running 1 4d23h 172.16.213.48 kworker-rj1 <none> <none>
my-dep-557548758d-d2pmd 1/1 Running 1 4d15h 172.16.213.57 kworker-rj2 <none> <none>
pod-delete-demo 1/1 Running 1 2d 172.16.213.56 kworker-rj1 <none> <none>
[email protected]:~#
Vidíte, že pod "my-dep-557548758d-d2pmd" stále běží na uzlu kworker-rj2.
Krok 2:Vypusťte uzel a připravte se na údržbu
Nyní vypusťte uzel v rámci přípravy na údržbu, abyste odstranili pody, které na uzlu běží, spuštěním následujícího příkazu:
[email protected]:~# kubectl drain kworker-rj2 --grace-period=300 --ignore-daemonsets=true
node/kworker-rj2 already cordoned
WARNING: ignoring DaemonSet-managed Pods: kube-system/calico-node-fl8dl, kube-system/kube-proxy-95vdf
evicting pod default/my-dep-557548758d-d2pmd
pod/my-dep-557548758d-d2pmd evicted
node/kworker-rj2 evicted
[email protected]:~#
POZNÁMKA: kubectl drain nemůže odstranit moduly, které nejsou spravovány pomocí ReplicationController, ReplicaSet, Job, DaemonSet nebo StatefulSet. K přepsání musíte použít --force a tím budou jednotlivé pody trvale smazány.
Nyní se podívejte na pody:
[email protected]:~# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
my-dep-557548758d-gprnr 1/1 Running 1 4d23h 172.16.213.48 kworker-rj1 <none> <none>
my-dep-557548758d-dsanh 1/1 Running 0 27s 172.16.213.38 kworker-rj1 <none> <none>
pod-delete-demo 1/1 Running 1 2d 172.16.213.56 kworker-rj1 <none> <none>
[email protected]:~#
Pod, který běžel na uzlu kworker-rj2, byl odtud vyřazen a začal jako nový modul na uzlu kworker-rj1.
Stav uzlů zůstává stejný:
[email protected]:~# kubectl get nodes
NAME STATUS ROLES AGE VERSION
kmaster-rj Ready master 44d v1.18.8
kworker-rj1 Ready <none> 44d v1.18.8
kworker-rj2 Ready,SchedulingDisabled <none> 44d v1.18.8
[email protected]:~#
Krok 3:Uvolněte uzel po dokončení údržby
Poté musíte spustit následující příkaz, abyste Kubernetes řekli, že může pokračovat v plánování nových podů do uzlu.
[email protected]:~# kubectl uncordon kworker-rj2
node/kworker-rj2 uncordoned
Ověřte stav uzlu:
[email protected]:~# kubectl get nodes
NAME STATUS ROLES AGE VERSION
kmaster-rj Ready master 44d v1.18.8
kworker-rj1 Ready <none> 44d v1.18.8
kworker-rj2 Ready <none> 44d v1.18.8
Uzel kworker-rj2 bude opět připraven zvládnout nové pracovní zatížení.
Doufám, že se vám tento rychlý tip o vypouštění uzlů v Kubernetes líbí.
Rakesh Jain
DevOps Professional | RHCA | Jenkins | Git | Docker | Kubernetes | Ansible | Prometheus | Grafana | AWS Cloud