Späť na blog

Ako riešiť problémy a kontrolovať sieť v Kubernetes

Ako riešiť problémy a kontrolovať sieť v Kubernetes

Kubernetes je open-source nástroj, ktorý je kľúčový v orchestrácii kontajnerov. Kubernetes pomáha pri orchestrácii a správe klastrov vo veľkom meradle v rôznych cloudových prostrediach alebo dokonca na lokálnych (on-premise) serveroch. Klaster je skupina hostiteľov určených na spúšťanie kontajnerizovaných aplikácií a služieb. Klaster potrebuje na fungovanie minimálne dva uzly – jeden riadiaci uzol (master node) a jeden pracovný uzol (worker node). Svoju infraštruktúru Kubernetes môžete škálovať pridaním ďalších pracovných uzlov. Riadiaci uzol a jeho pracovné uzly musia byť schopné komunikovať cez sieť, aby infraštruktúra fungovala. Pre prehľad najdôležitejších funkcií Kubernetes postupujte podľa nášho návodu na Zoznámenie sa s Kubernetes.

V tomto návode vám ukážeme niekoľko nástrojov a techník, ktoré vám pomôžu pri kontrole a riešení problémov so sieťou v Kubernetes.

Požiadavky

  • Mali by ste mať tiež kubectl nainštalovaný lokálne. V závislosti od vášho lokálneho prostredia postupujte podľa oficiálnej dokumentácie o inštalácii nástrojov Kubernetes. Nástroj kubectl by mal byť nakonfigurovaný na pripojenie k vášmu klastru. Podrobnejšie to vysvetlíme v sekcii nižšie.

Spustíme niekoľko príkazov lokálne aj na uzle Kubernetes. Začnime!

Konfigurácia lokálneho kubectl na pripojenie k vzdialenému klastru Kubernetes

Začnime inštaláciou kubectl. Naše lokálne prostredie beží na Ubuntu, postupujte podľa tohto odkazu, ak používate iné lokálne prostredie. Ak chcete nainštalovať nástroje kubectl v lokálnom prostredí Ubuntu/Debian pomocou správcu balíkov apt, spustite nasledujúce príkazy na aktualizáciu repozitára apt a inštaláciu potrebných balíkov:

Ďalej spustite nasledujúci príkaz na stiahnutie verejného podpisového kľúča Google Cloud:

Potom pridajte repozitár apt Kubernetes:

Potom aktualizujte index apt a nainštalujte kubectl pomocou nasledujúceho príkazu:

Potom overte, že kubectl je nainštalovaný skontrolovaním verzie pomocou nasledujúceho príkazu:

Tu je výstup, ak ste práve nainštalovali kubectl lokálne:

kubectl version

Na snímke obrazovky vyššie sa kubectl pokúša pripojiť k lokálnemu klastru Kubernetes. Zlyháva to však, pretože na našom lokálnom počítači ešte nemáme spustený žiadny klaster Kubernetes.

Ak chcete pripojiť k vzdialenému klastru Kubernetes, najprv si stiahnete prihlasovacie údaje Kubernetes zo vzdialeného klastra. Tu je príkaz na skopírovanie prihlasovacích údajov z riadiaceho uzla (master node):

Nahraďte zvýraznené časti svojím ssh používateľským menom a verejnou IP adresou riadiaceho uzla. Po dokončení sťahovania prihlasovacích údajov ich skopírujte do svojho domovského adresára:

To je všetko. Váš lokálny kubectl by mal byť schopný pripojiť sa k vášmu vzdialenému klastru Kubernetes a spúšťať na ňom príkazy. Ak chcete potvrdiť, že váš lokálny kubectl je pripojený k vzdialenému klastru, znova to skontrolujte pomocou príkazu version:

Tu je výstup, ktorý ukazuje úspešné pripojenie:

kubectl version json

Voliteľne môžete spustiť príkaz get nodes nasledovne:

kubectl get nodes

Získanie Cluster IP adresy Podu

Cluster IP adresu Podu môžete získať spustením príkazu kubectl get pod na vašom lokálnom stroji. Ak chcete zobraziť viac informácií, ako napríklad uzol hosťujúci pod a cluster IP podu, pridajte príznak -o wide k príkazu:

Tu je výstup z nášho Kubernetes clustera. V predchádzajúcom návode sme vytvorili deployment webového servera Nginx, ako môžete vidieť:

kubectl get pod -o wide

Stĺpec IP zobrazuje internú IP adresu jednotlivých podov. Ak sa pod, ktorý hľadáte, v zozname nenachádza, môžete byť v inom namespace. Na zobrazenie podov vo všetkých namespaces:

Získanie IP adresy služby (Service)

Môžete tiež získať IP adresu služby (Service) vo vašom clusteri. Pridaním príznaku --all-namespaces získate všetky služby bežiace v clusteri:

Výstup z vyššie uvedeného príkazu je nasledujúci. IP adresa služby (Service IP) sa nachádza v stĺpci cluster-ip :

kubectl get svc

Získanie a prístup k sieťovým namespacom podov

Každý pod v Kubernetes má priradený sieťový namespace. Sieťové namespace, označované aj ako netns, sú natívne sieťové knižnice v Linuxe, ktoré poskytujú izoláciu medzi sieťovými zariadeniami.

Ak chcete skontrolovať preklad DNS alebo všeobecnú sieťovú konektivitu, môžete spustiť príkazy v rámci sieťového namespace podu. Aby ste to dosiahli, začnite vyhľadaním ID procesu (PID) jedného z kontajnerov v pode. To môžete jednoducho urobiť v Docker pomocou príkazov špecifických pre Docker. Prvý príkaz zobrazí zoznam kontajnerov bežiacich na uzle. Prihláste sa do jedného zo svojich worker uzlov a spustite nasledujúci príkaz:

docker ps

Vo výstupe nás zaujíma stĺpec s ID kontajnera (container ID) alebo názvami (Names). Všimnite si kontajner Nginx, ktorý sme nasadili v predchádzajúcom návode How to Install and Use Kubernetes on Ubuntu 20.04.

Potom skopírujte ID alebo názov kontajnera, pretože ho použijeme v nasledujúcom príkaze na zistenie ID procesu:

Nahraďte zvýraznenú časť vašou hodnotou skopírovanou z predchádzajúceho príkazu. Nižšie je uvedený výstup, ktorý sme dostali, čo je ID procesu:

docker inspect

Teraz, keď máme ID procesu, môžeme ho použiť na spustenie príkazu nsenter vo vnútri sieťového namespace daného procesu:

Nahraďte zvýraznenú časť ID procesu, ktoré ste získali v predchádzajúcom príkaze. Potom namiesto ip addr, môžete zadať akýkoľvek príkaz, ktorý chcete spustiť v sieťovom namespace podu. V prípade, že dostanete chybu odmietnutia prístupu (permission denied), môžete ho spustiť aj pomocou sudo.

Príkaz nsenter vám umožňuje spustiť širšiu škálu príkazov dostupných na uzle v porovnaní s použitím docker exec ktorý vás obmedzuje iba na príkazy nainštalované vo vnútri kontajnera.

Získanie virtuálneho ethernetového rozhrania podu

Sieťový namespace v pode komunikuje s koreňovým netns uzla prostredníctvom virtuálneho ethernetového prepojenia (pipe). Na strane uzla sa toto prepojenie javí ako zariadenie, ktorého názov začína na veth a končí jedinečným identifikátorom, ako napríklad veth742f721 alebo veth90. Zatiaľ čo vo vnútri podu sa toto prepojenie identifikuje ako eth0.

Možno budete chcieť vedieť, ktoré veth zariadenie je spárované s ktorým podom. Môžete začať vypísaním všetkých sieťových zariadení na uzle a potom vypísať všetky zariadenia v sieti podu. Ak chcete zistiť, ktoré veth zariadenie je spárované s konkrétnym podom, môžete porovnať čísla zariadení medzi týmito dvoma výpismi.

Použite príkaz nsenter na spustenie príkazu ip addr v sieťovom namespace podu. Budete musieť poznať ID procesu jedného z kontajnerov. Informácie o tom nájdete v predchádzajúcej časti o Získaní a prístupe k sieťovým namespacom podov.

Ďalej spustite nasledujúci príkaz v termináli vášho worker uzla a príslušným spôsobom nahraďte zvýraznenú časť:

Príkaz vypíše zoznam rozhraní podu:

nsenter ip addr

Všimnite si if7 znaky za eth0@ vo výstupe vyššie. To znamená, že eth0 je spárované so 7. rozhraním uzla. Ďalej vypíšte rozhrania v predvolenom mennom priestore uzla spustením príkazu ip addr :

Príkaz vypíše rozhrania, ako je znázornené nižšie:

Kubernetes Networking ip addr

Vo výstupe je 7. rozhranie veth254b50e6@if3  – virtuálne ethernetové prepojenie spárované s podom, voči ktorému testujeme.

Kontrola pravidiel iptables

Môžete spustiť príkaz iptables-save na vypísanie všetkých iptables na uzle:

Výstup príkazu môže byť dlhý, takže ho môžete uložiť do súboru pre neskoršiu kontrolu:

Môžete tiež použiť less na stránkovanie výstupu:

Keďže nás zaujímajú iba pravidlá NAT pre Kubernetes, pridajte príznak -L na špecifikovanie správneho cieľa:

Tu je výstup:

Kubernetes Networking iptables

Kontrola podrobností IPVS

Kube-proxy je sieťová proxy bežiaca na každom uzle vo vašom Kubernetes klastri. Môže sa použiť na konfiguráciu IPVS na spracovanie prekladu virtuálnych IP adries služieb (Service IPs) na IP adresy podov. Na vypísanie prekladovej tabuľky IP adries môžete použiť príkaz ipvsadm . Najprv ho musíte nainštalovať na svoj uzol:

Teraz môžete spustiť nasledujúci príkaz:

Ak chcete zobraziť jednu IP adresu služby, pridajte príznak -t a špecifikujte požadovanú IP adresu:

Dopytovanie DNS klastra

Existuje niekoľko spôsobov, ako môžete ladiť preklad DNS vášho klastra. Oficiálna dokumentácia popisuje jeden spôsob ako nasadenie ladiaceho kontajnera so všetkými potrebnými nástrojmi a následné použitie kubectl na exec nslookup.

Voliteľne môžete dopytovať DNS pomocou príkazov dig and nsenter priamo z uzla. Najprv budete musieť nainštalovať dig na vašom master uzle. V prípade Ubuntu ho nainštalujte pomocou príkazu apt :

Kubernetes Networking install dnsutils

Vráťte sa do terminálu na vašom lokálnom počítači a spustením nižšie uvedeného príkazu nájdite IP adresu klastra pre službu kube-dns :

Príkaz vypíše:

get kube dns service

Stĺpec cluster-ip obsahuje hodnotu, ktorú potrebujeme. Teraz môžeme použiť nsenter na spustenie dig v mennom priestore kontajnera. Na prístup k jeho mennému priestoru však budete potrebovať ID procesu kontajnera. Pozrite si časť Získanie a prístup k sieťovým menným priestorom podov vyššie pre návod.

Keď máte container-id, spustite nasledujúci príkaz na vašom master uzle:

Príkaz dig prevezme IP adresu DNS služby klastra ( @10.96.0.10) a vyhľadá úplný názov domény služby service-name.namespace.svc.cluster.local:

Kubernetes Networking nsenter dig

Informácie o hľadaní názvov služieb a menných priestorov nájdete v časti Získanie IP adresy služby.

Kontrola sledovania pripojení Conntrack

Môžete použiť príkaz conntrack na zobrazenie všetkých aktuálne sledovaných pripojení:

Vypíše niečo podobné ako na snímke obrazovky:

Kubernetes Networking conntrac -l

Pridajte príznak -E na nepretržité sledovanie prichádzajúcich pripojení:

Ak chcete zobraziť pripojenia sledované na konkrétnu cieľovú adresu, pridajte príznak -d a špecifikujte cieľovú adresu:

Niekedy sa tabuľka sledovania spojení zaplní, čo vedie k zahadzovaniu nových spojení. To spôsobuje problémy, ktoré bránia vašim uzlom nadviazať spoľahlivé spojenia. Ak k tomu dôjde, v systémových logoch na mieste uvidíte správy ako napríklad:/var/log/syslog:

Existuje systémové nastavenie pre maximálny počet sledovaných spojení. Na zobrazenie aktuálnej hodnoty použite nasledujúci príkaz:

Výstupom je:

conntrack max

Hodnotu môžete upraviť pomocou -w príznaku:

Možno budete chcieť upraviť svoj /etc/sysctl.conf súbor, aby bola hodnota trvalá a zabezpečilo sa jej zachovanie aj po reštarte. Otvorte súbor pomocou nano:

Ďalej upravte hodnotu, ak riadok existuje, alebo pridajte riadok na koniec súboru s uvedením novej hodnoty:

Záver

Pri nasadzovaní viacerých kontajnerizovaných služieb budete mať z Kubernetes veľký úžitok, pretože vám poskytuje centrálny bod správy. Aby sme zabezpečili konektivitu medzi rôznymi podmi Kubernetes, ukázali sme vám niekoľko príkazov na kontrolu siete, ktoré môžete použiť na riešenie akýchkoľvek problémov s infraštruktúrou Kubernetes.

Ak sa chcete dozvedieť viac o Kubernetes, jeho výhodách, nastavovaní a nasadzovaní aplikácií v Kubernetes, pozrite si naše rôzne Kubernetes tutoriály.

Príjemnú prácu!

author

Pranay Kapgate

Autor · CloudSigma

Preslav Dobrev je kreatívny dizajnér v spoločnosti CloudSigma, ktorý sa zameriava na konzistentnú firemnú identitu prostredníctvom tradičných a inovatívnych marketingových kanálov. Dokáže brilantne spájať umeleckú víziu so strategickým marketingom, čím vytvára pôsobivé príbehy značky.

Komentáre

Zatiaľ žiadne komentáre. Buďte prvý.