Kubernetes is een open-source tool die cruciaal is bij containerorkestratie. Kubernetes helpt bij het orkestreren en beheren van clusters op schaal over verschillende cloudomgevingen of zelfs on-premise servers. Een cluster is een verzameling hosts die bedoeld is voor het draaien van gecontaineriseerde applicaties en services. Een cluster heeft minimaal twee nodes nodig om te werken – één master-node en een worker-node. Je kunt je Kubernetes-infrastructuur schalen door meer worker-nodes toe te voegen. Een master-node en zijn worker-nodes moeten via een netwerk met elkaar kunnen communiceren om de infrastructuur te laten werken. Volg onze tutorial over Kennismaken met Kubernetes.
In deze tutorial laten we je verschillende tools en technieken zien om te helpen bij de inspectie en probleemoplossing van Kubernetes-netwerken.
Vereisten
-
Om deze tutorial te volgen, moet je beschikken over een Kubernetes-cluster. We hebben een tutorial waarin wordt uitgelegd Hoe je Kubernetes installeert en gebruikt op Ubuntu 20.04 die je kan begeleiden bij het opzetten van een basiscluster voor de demonstratie.
-
Je moet ook beschikken over kubectl lokaal geïnstalleerd. Volg, afhankelijk van je lokale omgeving, de officiële documentatie over het installeren van Kubernetes-tools. De kubectl moet geconfigureerd zijn om verbinding te maken met je cluster. Dit leggen we verderop in de sectie hieronder uit.
We zullen verschillende commando's zowel lokaal als op de Kubernetes-node uitvoeren. Laten we beginnen!
Lokale kubectl configureren om verbinding te maken met een extern Kubernetes-cluster
Laten we beginnen met het installeren van kubectl. Onze lokale omgeving draait op Ubuntu, volg deze link als je een andere lokale omgeving gebruikt. Om kubectl-tools te installeren op een lokale Ubuntu/Debian-omgeving met de apt-pakketbeheerder, voer je de volgende commando's uit om de apt repository bij te werken en de benodigde pakketten te installeren:
|
1 2 |
sudo apt-get update sudo apt-get install -y apt-transport-https ca-certificates curl |
Voer vervolgens het volgende commando uit om de openbare ondertekeningssleutel van Google Cloud te downloaden:
|
1 |
sudo curl -fsSLo /usr/share/keyrings/kubernetes-archive-keyring.gpg https://packages.cloud.google.com/apt/doc/apt-key.gpg |
Voeg vervolgens de Kubernetes apt repository toe:
|
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 |
Werk daarna de apt-index bij en installeer kubectl met het volgende commando:
|
1 2 |
sudo apt-get update sudo apt-get install -y kubectl |
Controleer vervolgens of kubectl is geïnstalleerd door de versie te controleren met het volgende commando:
|
1 |
kubectl version |
Dit is de uitvoer als je zojuist kubectl lokaal hebt geïnstalleerd:

In de bovenstaande schermafbeelding probeert kubectl verbinding te maken met het lokale Kubernetes-cluster. Dit mislukt echter omdat we nog geen Kubernetes-cluster op onze lokale machine hebben draaien.
Om verbinding te maken met het externe Kubernetes-cluster, download je eerst de Kubernetes-inloggegevens van het externe cluster. Hier is een commando om de inloggegevens van de master-node te kopiëren:
|
1 |
scp -r hackins@178.22.66.253:/home/hackins/.kube . |
Vervang de gemarkeerde delen door je ssh gebruikersnaam en het openbare IP-adres van de master-node. Zodra de inloggegevens zijn gedownload, kopieer je ze naar je thuismap:
|
1 |
cp -r .kube $HOME/ |
Dat is alles. Je lokale kubectl zou verbinding moeten kunnen maken met en commando's moeten kunnen uitvoeren op je externe Kubernetes-cluster. Om te bevestigen dat je lokale kubectl is verbonden met het externe cluster, controleer je dit opnieuw met het versiecommando:
|
1 |
kubectl version --output='json' |
Hier is de uitvoer, die een succesvolle verbinding toont:

Optioneel kun je het get nodes commando als volgt uitvoeren:

Het Cluster-IP van een Pod ophalen
Je kunt het Cluster-IP van een Pod ophalen door het kubectl get pod commando uit te voeren op je lokale machine. Om meer informatie weer te geven, zoals de node die de pod host en het cluster-IP van de pod, voeg je de vlag -o wide toe aan het commando:
|
1 |
kubectl get pod -o wide |
Hier is de uitvoer van ons Kubernetes-cluster. In de voorafgaande handleiding hebben we een Nginx-webserver-deployment gemaakt, zoals je kunt zien:

De IP-kolom toont het interne IP-adres van individuele pods. Als de pod die je zoekt niet in de lijst verschijnt, bevind je je mogelijk in een andere namespace. Je kunt het volgende commando uitvoeren om pods in alle namespaces:
|
1 |
kubectl get pod -o wide --all-namespaces |
Het IP-adres van een Service ophalen
Je kunt ook het IP-adres van een Service op je cluster ophalen. Door de --all-namespaces vlag toe te voegen, krijg je alle services die op het cluster draaien:
|
1 |
kubectl get service --all-namespaces |
De uitvoer van het bovenstaande commando is als volgt. Het Service-IP bevindt zich in de cluster-ip kolom:

Pod-netwerknamespaces ophalen en openen
Aan elke Kubernetes-pod is een netwerknamespace toegewezen. Netwerknamespaces, ook wel netns genoemd, zijn systeemeigen netwerkbibliotheken in Linux die isolatie bieden tussen netwerkapparaten.
Om de DNS-resolutie of algemene netwerkconnectiviteit te controleren, kun je commando's uitvoeren binnen de netwerknamespace van een pod. Om dit te bereiken, begin je met het opzoeken van het proces-ID van een van de containers in een pod. Dit kun je eenvoudig doen in Docker met behulp van Docker-specifieke commando's. Het eerste commando toont de containers die op een node draaien. Log in op een van je worker-nodes en voer het volgende commando uit:
|
1 |
docker ps |

In de uitvoer zijn we geïnteresseerd in de kolom Container-ID of Names. Let op de Nginx-container die we hebben geïmplementeerd in de voorafgaande handleiding How to Install and Use Kubernetes on Ubuntu 20.04.
Kopieer vervolgens de container-ID of -naam, want die gebruiken we in het volgende commando om het proces-ID te vinden:
|
1 |
docker inspect --format '{{ .State.Pid }}' container-id-of-naam |
Vervang het gemarkeerde deel door de waarde die je uit het vorige commando hebt gekopieerd. Hieronder staat de uitvoer die we kregen, namelijk het proces-ID:

Nu we een proces-ID hebben, kunnen we dit gebruiken om het nsenter commando uit te voeren binnen de netwerknamespace van het proces:
|
1 |
sudo nsenter -t container-pid -n ip addr |
Vervang het gemarkeerde deel door het proces-ID dat je in het vorige commando hebt gekregen. In plaats van ip addr, kun je elk commando opgeven dat je wilt uitvoeren binnen de netwerknamespace van de pod. Je kunt het ook met sudo uitvoeren als je een 'permission denied'-foutmelding krijgt.
Het nsenter commando stelt je in staat om een breder scala aan commando's uit te voeren die beschikbaar zijn op een node, in tegenstelling tot het gebruik van docker exec wat je beperkt tot de commando's die binnen de container zijn geïnstalleerd.
De virtuele ethernetinterface van een Pod ophalen
Een netwerknamespace op een pod communiceert met de root-netns van de node via een virtuele ethernetpijp. Aan de kant van de node verschijnt deze pijp als een apparaat waarvan de naam begint met veth en eindigt op een unieke identificatie, zoals veth742f721 of veth90. Terwijl binnen de pod de pijp zich identificeert als eth0.
Je wilt misschien weten welk veth-apparaat is gekoppeld aan welke pod. Je kunt beginnen met het weergeven van alle netwerkapparaten op de node, en vervolgens alle apparaten in het netwerk van de pod weergeven. Om te bepalen welk veth apparaat is gekoppeld aan een specifieke pod, kun je de apparaatnummers tussen de twee lijsten met elkaar correleren.
Gebruik het nsenter commando om het ip addr commando uit te voeren in de netwerknamespace van de pod. Je moet een van de proces-ID's van de container weten. Raadpleeg hiervoor het vorige gedeelte over Pod-netwerknamespaces ophalen en openen.
Voer vervolgens de volgende opdracht uit in de terminal van je worker-node, waarbij je het gemarkeerde deel op de juiste manier vervangt:
|
1 |
sudo nsenter -t container-pid -n ip addr |
De opdracht geeft een lijst met de interfaces van de pod weer:

Let op de if7 tekens na de eth0@ in de bovenstaande uitvoer. Dit betekent dat de van de podeth0 is gekoppeld aan de 7e interface van de node. Lijst vervolgens de interfaces op binnen de standaard namespace van de node door de ip addr opdracht uit te voeren:
|
1 |
ip addr |
De opdracht geeft de interfaces weer zoals hieronder getoond:

In de uitvoer is de 7e interface veth254b50e6@if3 – de virtuele ethernet-pijp die is gekoppeld aan de pod waarmee we testen.
Iptables-regels bekijken
Je kunt de opdracht iptables-save uitvoeren om alle iptables op een node op te lijsten:
|
1 |
iptables-save |
De uitvoer van de opdracht kan lang zijn, dus je kunt deze opslaan in een bestand voor latere inspectie:
|
1 |
iptables-save > iptables.txt |
Je kunt ook less gebruiken om de uitvoer te pagineren:
|
1 |
iptables-save | less |
Omdat we alleen geïnteresseerd zijn in de Kubernetes NAT-regels, voeg je de -L vlag toe om het juiste doel op te geven:
|
1 |
sudo iptables -t nat -L KUBE-SERVICES |
Hier is de uitvoer:

IPVS-details inspecteren
Kube-proxy is een netwerkproxy die op elke node in je Kubernetes-cluster draait. Het kan worden gebruikt om IPVS te configureren om de vertaling van virtuele Service-IP's naar pod-IP's af te handelen. Om de vertalingstabel van IP's op te lijsten, kun je de ipvsadm opdracht gebruiken. Eerst moet je deze op je node installeren:
|
1 |
sudo apt install ipvsadm |
Nu kun je de volgende opdracht uitvoeren:
|
1 |
sudo ipvsadm -Ln |
Om een enkel Service-IP te tonen, voeg je de -t vlag toe, waarbij je het gewenste IP-adres opgeeft:
|
1 |
ipvsadm -Ln -t 10.244.1.255 |
Cluster-DNS bevragen
Er zijn een paar manieren die je kunt volgen om de DNS-resolutie van je cluster te debuggen. De officiële documentatie beschrijft één manier als het implementeren van een debug-container met alle benodigde tools, en vervolgens het gebruik van kubectl om nslookup.
Optioneel kun je de DNS bevragen met behulp van de dig en nsenter opdrachten vanaf de node zelf. Eerst moet je dig op je master-node. Voor Ubuntu installeer je dit met de apt opdracht:
|
1 |
sudo apt install dnsutils |

Ga terug naar de terminal op je lokale machine en voer de onderstaande opdracht uit om het cluster-IP te vinden van de kube-dns service:
|
1 |
kubectl get service -n kube-system kube-dns |
De opdracht geeft als uitvoer:

De cluster-ip-kolom bevat de waarde die we nodig hebben. Nu kunnen we nsenter gebruiken om dig in de container-namespace. Je hebt echter een container-proces-ID nodig om toegang te krijgen tot de namespace. Bekijk de sectie Pod-netwerknamespaces verkrijgen en openen hierboven voor instructies.
Zodra je de container-id, voer je de volgende opdracht uit op je master-node:
|
1 |
sudo nsenter -t 27168 -n dig kubernetes.default.svc.cluster.local @10.96.0.10 |
De dig-opdracht neemt het IP-adres van de cluster-DNS-service ( @10.96.0.10) en zoekt de volledige domeinnaam van de Service op service-name.namespace.svc.cluster.local:

Voor informatie over het vinden van servicenamen en namespaces, bekijk de sectie Het IP-adres van een Service verkrijgen.
Conntrack-verbindingstracking bekijken
Je kunt de conntrack opdracht gebruiken om alle verbindingen te bekijken die momenteel worden gevolgd:
|
1 |
sudo conntrack -L |
De uitvoer is vergelijkbaar met de schermafbeelding:

Voeg de -E vlag toe om continu te controleren op inkomende verbindingen:
|
1 |
sudo conntrack -E |
Om verbindingen te bekijken die naar een specifiek bestemmingsadres worden gevolgd, voeg je de -d vlag toe en geef je het bestemmingsadres op:
|
1 |
sudo conntrack -L -d 80.45.6.4 |
Soms raakt de tabel voor het bijhouden van verbindingen vol, wat ertoe leidt dat nieuwe verbindingen worden verbroken. Dit veroorzaakt problemen die voorkomen dat uw nodes betrouwbare verbindingen maken. Als dit gebeurt, ziet u berichten zoals de volgende in uw systeemlogboeken, op de locatie /var/log/syslog:
|
1 |
Mar 07 19:12:11 worker-105 kernel: nf_conntrack: tabel vol, droppen pakket. |
Er bestaat een systeeminstelling voor het maximale aantal te volgen verbindingen. Gebruik de volgende opdracht om uw huidige waarde weer te geven:
|
1 |
sysctl net.netfilter.nf_conntrack_max |
Dit geeft als uitvoer:

U kunt de waarde wijzigen met behulp van de -w vlag:
|
1 |
sudo sysctl -w net.netfilter.nf_conntrack_max=231074 |
Mogelijk wilt u uw /etc/sysctl.conf bestand wijzigen om de waarde permanent te maken en ervoor te zorgen dat deze na een herstart behouden blijft. Open het bestand met nano:
|
1 |
sudo nano /etc/sysctl.conf |
Wijzig vervolgens de waarde als de regel bestaat of voeg de regel toe aan het einde van het bestand, waarbij u de nieuwe waarde opgeeft:
|
1 |
net.netfilter.nf_conntrack_max=231074 |
Conclusie
Bij het implementeren van meerdere gecontaineriseerde services profiteert u enorm van Kubernetes, omdat het u een centraal beheerpunt biedt. Om ervoor te zorgen dat er connectiviteit is tussen de verschillende Kubernetes-pods, hebben we u enkele netwerkinspectie-opdrachten laten zien die u kunt gebruiken om eventuele problemen met uw Kubernetes-infrastructuur op te lossen.
Voor meer informatie over Kubernetes, de voordelen ervan, en het instellen en implementeren van applicaties op Kubernetes, kunt u een blik werpen op onze verschillende Kubernetes-handleidingen.
Happy Computing!
Reacties
Nog geen reacties. Wees de eerste.