Kubernetes je open-source nástroj, který je klíčový pro orchestraci kontejnerů. Kubernetes pomáhá s orchestrací a správou clusterů ve velkém měřítku v různých cloudových prostředích nebo dokonce na lokálních serverech (on-premise). Cluster je sada hostitelů určených pro běh kontejnerizovaných aplikací a služeb. Cluster vyžaduje k fungování minimálně dva uzly – jeden řídicí uzel (master node) a jeden pracovní uzel (worker node). Svou infrastrukturu Kubernetes můžete škálovat přidáním dalších pracovních uzlů. Řídicí uzel a jeho pracovní uzly musí být schopny komunikovat přes síť, aby infrastruktura fungovala. Přehled nejdůležitějších funkcí Kubernetes naleznete v našem návodu na téma Seznámení s Kubernetes.
V tomto návodu vám ukážeme několik nástrojů a technik, které vám pomohou s kontrolou a řešením problémů se sítí v Kubernetes.
Požadavky
-
Chcete-li postupovat podle tohoto návodu, měli byste mít cluster Kubernetes. Máme návod vysvětlující Jak nainstalovat a používat Kubernetes na Ubuntu 20.04 , který vás provede nastavením základního clusteru pro účely ukázky.
-
Měli byste mít také kubectl nainstalovaný lokálně. V závislosti na vašem lokálním prostředí postupujte podle oficiální dokumentace k instalaci nástrojů Kubernetes. Nástroj kubectl by měl být nakonfigurován pro připojení k vašemu clusteru. Podrobněji to vysvětlíme v sekci níže.
Spustíme několik příkazů jak lokálně, tak na uzlu Kubernetes. Začněme!
Konfigurace lokálního kubectl pro připojení ke vzdálenému clusteru Kubernetes
Začněme instalací kubectl. Naše lokální prostředí běží na Ubuntu, pokud používáte jiné lokální prostředí, klikněte na tento odkaz, pokud používáte jiné lokální prostředí. Chcete-li nainstalovat nástroje kubectl v lokálním prostředí Ubuntu/Debian pomocí správce balíčků apt, spusťte následující příkazy pro aktualizaci repozitáře apt a instalaci potřebných balíčků:
|
1 2 |
sudo apt-get update sudo apt-get install -y apt-transport-https ca-certificates curl |
Dále spusťte následující příkaz ke stažení veřejného podpisového klíče Google Cloud:
|
1 |
sudo curl -fsSLo /usr/share/keyrings/kubernetes-archive-keyring.gpg https://packages.cloud.google.com/apt/doc/apt-key.gpg |
Poté přidejte repozitář Kubernetes apt :
|
1 |
echo "deb [signed-by=/usr/share/keyrings/kubernetes-archive-keyring.gpg] https://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.list |
Poté aktualizujte index apt a nainstalujte kubectl pomocí následujícího příkazu:
|
1 2 |
sudo apt-get update sudo apt-get install -y kubectl |
Poté ověřte, že je kubectl nainstalován, zkontrolováním verze pomocí následujícího příkazu:
|
1 |
kubectl version |
Zde je výstup, pokud jste právě nainstalovali kubectl lokálně:

Na snímku obrazovky výše se kubectl pokouší připojit k lokálnímu clusteru Kubernetes. To se však nedaří, protože na našem lokálním stroji zatím žádný cluster Kubernetes neběží.
Chcete-li se připojit ke vzdálenému clusteru Kubernetes, nejprve si stáhněte přihlašovací údaje Kubernetes ze vzdáleného clusteru. Zde je příkaz pro zkopírování přihlašovacích údajů z řídicího uzlu (master node):
|
1 |
scp -r hackins@178.22.66.253:/home/hackins/.kube . |
Nahraďte zvýrazněné části svým uživatelským jménem pro ssh a veřejnou IP adresou řídicího uzlu. Po dokončení stahování přihlašovacích údajů je zkopírujte do svého domovského adresáře:
|
1 |
cp -r .kube $HOME/ |
To je vše. Váš lokální kubectl by měl být schopen se připojit k vašemu vzdálenému clusteru Kubernetes a spouštět na něm příkazy. Chcete-li potvrdit, že je váš lokální kubectl připojen ke vzdálenému clusteru, znovu to ověřte pomocí příkazu pro zjištění verze:
|
1 |
kubectl version --output='json' |
Zde je výstup ukazující úspěšné připojení:

Volitelně můžete spustit příkaz get nodes následovně:

Získání Cluster IP adresy podu
Cluster IP adresu podu můžete získat spuštěním příkazu kubectl get pod na vašem lokálním stroji. Chcete-li zobrazit více informací, jako je uzel hostující pod a Cluster IP adresa podu, přidejte k příkazu příznak -o wide k příkazu:
|
1 |
kubectl get pod -o wide |
Zde je výstup z našeho Kubernetes clusteru. V předchozím návodu jsme vytvořili nasazení webového serveru Nginx, jak můžete vidět:

Sloupec IP zobrazuje interní IP adresu jednotlivých podů. Pokud se hledaný pod v seznamu neobjeví, můžete se nacházet v jiném jmenném prostoru. Chcete-li vypsat pody ve všech jmenných prostorech:
|
1 |
kubectl get pod -o wide --all-namespaces |
Získání IP adresy Služby (Service)
Můžete také získat IP adresu Služby (Service) ve vašem clusteru. Přidáním příznaku --all-namespaces získáte všechny služby běžící v clusteru:
|
1 |
kubectl get service --all-namespaces |
Výstup z výše uvedeného příkazu je následující. IP adresa Služby je ve sloupci cluster-ip :

Získání a přístup k síťovým jmenným prostorům Podu
Každému podu v Kubernetes je přiřazen síťový jmenný prostor. Síťové jmenné prostory, označované také jako netns, jsou nativní síťové knihovny v Linuxu, které zajišťují izolaci mezi síťovými zařízeními.
Chcete-li zkontrolovat překlad DNS nebo obecné síťové připojení, můžete spustit příkazy v rámci síťového jmenného prostoru podu. Chcete-li toho dosáhnout, začněte vyhledáním ID procesu jednoho z kontejnerů v podu. To můžete snadno provést v Dockeru pomocí příkazů specifických pro Docker. První příkaz vypíše kontejnery běžící na uzlu. Přihlaste se k jednomu ze svých pracovních uzlů a spusťte následující příkaz:
|
1 |
docker ps |

Ve výstupu nás zajímá sloupec s ID kontejneru (container ID) nebo názvy (Names). Všimněte si kontejneru Nginx, který jsme nasadili v předchozím návodu Jak nainstalovat a používat Kubernetes na Ubuntu 20.04.
Dále zkopírujte ID nebo název kontejneru, protože jej použijeme v dalším příkazu k nalezení ID procesu:
|
1 |
docker inspect --format '{{ .State.Pid }}' container-id-nebo-name |
Nahraďte zvýrazněnou část vaší hodnotou zkopírovanou z předchozího příkazu. Níže je výstup, který jsme získali, což je ID procesu:

Nyní, když máme ID procesu, můžeme jej použít ke spuštění příkazu nsenter uvnitř síťového jmenného prostoru daného procesu:
|
1 |
sudo nsenter -t container-pid -n ip addr |
Nahraďte zvýrazněnou část ID procesu, které jste získali v předchozím příkazu. Poté na místo ip addr, můžete zadat jakýkoli příkaz, který chcete spustit uvnitř síťového jmenného prostoru podu. V případě, že se zobrazí chyba odepření přístupu (permission denied), jej můžete spustit také pomocí sudo.
Příkaz nsenter umožňuje spustit širší škálu příkazů dostupných na uzlu, na rozdíl od použití docker exec který vás omezuje pouze na příkazy nainstalované uvnitř kontejneru.
Získání virtuálního ethernetového rozhraní podu
Síťový jmenný prostor v podu komunikuje s kořenovým netns uzlu prostřednictvím virtuálního ethernetového kanálu (pipe). Na straně uzlu se tento kanál jeví jako zařízení, jehož název začíná na veth a končí jedinečným identifikátorem, jako je například veth742f721 nebo veth90. Zatímco uvnitř podu se tento kanál identifikuje jako eth0.
Možná budete chtít vědět, které zařízení veth je spárováno s kterým podem. Můžete začít vypsáním všech síťových zařízení na uzlu a poté vypsat všechna zařízení v síti podu. Chcete-li zjistit, které zařízení veth je spárováno s konkrétním podem, můžete porovnat čísla zařízení mezi těmito dvěma výpisy.
Použijte příkaz nsenter ke spuštění příkazu ip addr v síťovém jmenném prostoru podu. Budete potřebovat znát ID procesu jednoho z kontejnerů. K tomu se podívejte na předchozí část o Získání a přístup k síťovým jmenným prostorům Podu.
Dále spusťte následující příkaz v terminálu vašeho worker uzlu a nahraďte zvýrazněnou část odpovídajícím způsobem:
|
1 |
sudo nsenter -t container-pid -n ip addr |
Příkaz vypíše seznam rozhraní podu:

Všimněte si if7 znaků za eth0@ ve výše uvedeném výstupu. To znamená, že eth0 podu je spárováno se 7. rozhraním uzlu. Dále vypište rozhraní uvnitř výchozího jmenného prostoru uzlu spuštěním příkazu ip addr :
|
1 |
ip addr |
Příkaz vypíše rozhraní, jak je znázorněno níže:

Ve výstupu je 7. rozhraní veth254b50e6@if3 – virtuální ethernetové propojení spárované s podem, proti kterému testujeme.
Kontrola pravidel Iptables
Můžete spustit příkaz iptables-save pro výpis všech iptables na uzlu:
|
1 |
iptables-save |
Výstup příkazu může být dlouhý, takže jej můžete uložit do souboru pro pozdější kontrolu:
|
1 |
iptables-save > iptables.txt |
Můžete také použít less pro stránkování výstupu:
|
1 |
iptables-save | less |
Vzhledem k tomu, že nás zajímají pouze pravidla Kubernetes NAT, přidejte příznak -L pro určení správného cíle:
|
1 |
sudo iptables -t nat -L KUBE-SERVICES |
Zde je výstup:

Kontrola podrobností IPVS
Kube-proxy je síťová proxy běžící na každém uzlu ve vašem Kubernetes clusteru. Lze ji použít ke konfiguraci IPVS pro překlad virtuálních IP adres služeb (Service IPs) na IP adresy podů. Chcete-li vypsat překladovou tabulku IP adres, můžete použít příkaz ipvsadm . Nejprve jej musíte nainstalovat na svůj uzel:
|
1 |
sudo apt install ipvsadm |
Nyní můžete spustit následující příkaz:
|
1 |
sudo ipvsadm -Ln |
Chcete-li zobrazit jednu IP adresu služby, přidejte příznak -t a specifikujte požadovanou IP adresu:
|
1 |
ipvsadm -Ln -t 10.244.1.255 |
Dotazování DNS clusteru
Existuje několik způsobů, jak můžete ladit překlad DNS ve vašem clusteru. Oficiální dokumentace popisuje jeden ze způsobů jako nasazení ladicího kontejneru se všemi potřebnými nástroji a následné použití kubectl ke spuštění nslookup.
Volitelně se můžete dotázat DNS pomocí příkazů dig a nsenter přímo z uzlu. Nejprve budete muset nainstalovat dig na váš master uzel. V systému Ubuntu jej nainstalujte pomocí příkazu apt :
|
1 |
sudo apt install dnsutils |

Vraťte se do terminálu na svém lokálním počítači a spusťte níže uvedený příkaz, abyste zjistili cluster IP adresu služby kube-dns :
|
1 |
kubectl get service -n kube-system kube-dns |
Příkaz vypíše:

Sloupec cluster-ip obsahuje hodnotu, kterou potřebujeme. Nyní můžeme použít nsenter ke spuštění dig v jmenném prostoru kontejneru. K přístupu do jeho jmenného prostoru však budete potřebovat ID procesu kontejneru. Návod naleznete v sekci Získání a přístup k síťovým jmenným prostorům podů výše.
Jakmile budete mít container-id, spusťte na svém master uzlu následující příkaz:
|
1 |
sudo nsenter -t 27168 -n dig kubernetes.default.svc.cluster.local @10.96.0.10 |
Příkaz dig přebírá IP adresu DNS služby clusteru ( @10.96.0.10) a vyhledá plný doménový název služby service-name.namespace.svc.cluster.local:

Informace o vyhledávání názvů služeb a jmenných prostorů naleznete v sekci Získání IP adresy služby.
Kontrola sledování připojení Conntrack
Můžete použít příkaz conntrack k zobrazení všech aktuálně sledovaných připojení:
|
1 |
sudo conntrack -L |
Vypíše se něco podobného jako na snímku obrazovky:

Přidejte příznak -E pro nepřetržité sledování příchozích připojení:
|
1 |
sudo conntrack -E |
Chcete-li zobrazit připojení sledovaná k určité cílové adrese, přidejte příznak -d a specifikujte cílovou adresu:
|
1 |
sudo conntrack -L -d 80.45.6.4 |
Někdy se tabulka sledování připojení zaplní, což vede k zahazování nových připojení. To způsobuje problémy, které vašim uzlům brání v navazování spolehlivých připojení. Pokud k tomu dojde, uvidíte v systémových protokolech v umístění zprávy jako například:/var/log/syslog:
|
1 |
Mar 07 19:12:11 worker-105 kernel: nf_conntrack: tabulka plná, zahazování paket. |
Existuje systémové nastavení pro maximální počet sledovaných připojení. Pomocí následujícího příkazu zobrazíte aktuální hodnotu:
|
1 |
sysctl net.netfilter.nf_conntrack_max |
Výstup:

Hodnotu můžete upravit pomocí -w příznaku:
|
1 |
sudo sysctl -w net.netfilter.nf_conntrack_max=231074 |
Možná budete chtít upravit svůj /etc/sysctl.conf soubor, aby byla hodnota trvalá a zajistilo se její zachování i po restartu. Otevřete soubor pomocí nano:
|
1 |
sudo nano /etc/sysctl.conf |
Dále upravte hodnotu, pokud řádek existuje, nebo přidejte řádek na konec souboru s uvedením nové hodnoty:
|
1 |
net.netfilter.nf_conntrack_max=231074 |
Závěr
Při nasazování více kontejnerizovaných služeb budete mít z Kubernetes velký užitek, protože vám poskytuje centrální bod správy. Abychom zajistili konektivitu mezi různými pody Kubernetes, ukázali jsme vám několik příkazů pro kontrolu sítě, které můžete použít k řešení případných problémů s vaší infrastrukturou Kubernetes.
Chcete-li se dozvědět více o Kubernetes, jeho výhodách, nastavení a nasazování aplikací na Kubernetes, podívejte se na naše různé návody na Kubernetes.
Příjemnou práci!
Komentáře
Zatím žádné komentáře. Buďte první.