Zpět na blog

Jak řešit problémy a kontrolovat síť v Kubernetes

Jak řešit problémy a kontrolovat síť v Kubernetes

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

  • 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ů:

Dále spusťte následující příkaz ke stažení veřejného podpisového klíče Google Cloud:

Poté přidejte repozitář Kubernetes apt :

Poté aktualizujte index apt a nainstalujte kubectl pomocí následujícího příkazu:

Poté ověřte, že je kubectl nainstalován, zkontrolováním verze pomocí následujícího příkazu:

Zde je výstup, pokud jste právě nainstalovali kubectl lokálně:

kubectl version

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):

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:

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:

Zde je výstup ukazující úspěšné připojení:

kubectl version json

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

kubectl get nodes

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:

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:

kubectl get pod -o wide

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:

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:

Výstup z výše uvedeného příkazu je následující. IP adresa Služby je ve sloupci cluster-ip :

kubectl get svc

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:

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:

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:

docker inspect

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:

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:

Příkaz vypíše seznam rozhraní podu:

nsenter ip addr

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 :

Příkaz vypíše rozhraní, jak je znázorněno níže:

Kubernetes Networking ip addr

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:

Výstup příkazu může být dlouhý, takže jej můžete uložit do souboru pro pozdější kontrolu:

Můžete také použít less pro stránkování výstupu:

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:

Zde je výstup:

Kubernetes Networking iptables

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:

Nyní můžete spustit následující příkaz:

Chcete-li zobrazit jednu IP adresu služby, přidejte příznak -t a specifikujte požadovanou IP adresu:

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 :

Kubernetes Networking 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 :

Příkaz vypíše:

get kube dns service

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:

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:

Kubernetes Networking nsenter dig

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í:

Vypíše se něco podobného jako na snímku obrazovky:

Kubernetes Networking conntrac -l

Přidejte příznak -E pro nepřetržité sledování příchozích připojení:

Chcete-li zobrazit připojení sledovaná k určité cílové adrese, přidejte příznak -d a specifikujte cílovou adresu:

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:

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:

Výstup:

conntrack max

Hodnotu můžete upravit pomocí -w příznaku:

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:

Dále upravte hodnotu, pokud řádek existuje, nebo přidejte řádek na konec souboru s uvedením nové hodnoty:

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!

author

Pranay Kapgate

Autor · CloudSigma

Preslav Dobrev je kreativní designér ve společnosti CloudSigma, který se zaměřuje na konzistentní firemní identitu prostřednictvím tradičních i inovativních marketingových kanálů. Je zdatný v propojování umělecké vize se strategickým marketingem za účelem vytváření působivých příběhů značky.

Komentáře

Zatím žádné komentáře. Buďte první.