Christoph Raab

All about DevOps...

CheatSheet
cheatsheet/kubernetes/networking

Networking in Kubernetes

CNI Container Networking Interface

Networking Konfiguration wird in Linux und in Docker ähnlich vorgenommen.

CNI standardisiert, wie Netzwerk in einer Container Runtime erzeugt und konfiguriert wird und wie ein Netzwerk Plugin geschrieben werden muss.

–> Docker implementiert aber Container Network Model (CNM), darum jetzt auch nicht mehr Standard in Kubernetes, sondern containerd.

Einziger Link in der Kubernetes Dokumentation, in der beschrieben wird, wie Netzwerk Plugin installiert wird: Install Kubernetes Netzwerk Plugin - Step 2

Cluster Networking Configuration

Für Kommunikation müssen bestimmte Ports auf Master und den Worker Nodes offen sein: kubernetes docs

Befehle zum Konfigurieren in der Übersicht

Pod Networking

Anforderungen

CNI gibt kubelet eine Art Blaupause, mit der neue Pods zum Netzwerk hinzugefügt und alte entfernt werden können. Außerdem werden zwei Plugins zur Verfügung gestellt, die von den CNI Plugins genutzt werden können, um Pods IPs zuzuweisen.

Kubelet Argumente:

–> Einsehen über static pod file oder über ps -aux -> grep kubelet

CNI Plugins

Übersicht über (Netzwerk) Plugins: Kubernetes Addons

Kubernetes Netzwerk Plugins

Anforderungen

Beispiel weaveworks

Agents werden auf jedem Node installiert. Agents fungieren als eine Art Middlerware für Kommunikation zwischen den Nodes. Agent auf dem Sendernode wrappt die Packages einer Nachricht und leitet sie an den Agent auf dem Zielnode weiter. Agent auf dem Zielnode unwrappt sie und leitet sie an den Pod weiter.

Installieren in laufendem Cluster als Pods in einem Daemonset mit kubectl apply -f <link-zu-weave-yaml>

Nimmt im Standard die CIDR 10.32.0.0/12 und teilt diese auf die Nodes auf. Jeder Pod hat dann eine IP aus dem Subnet seines Nodes.

Service Networking

Service Arten:

Services sind Cluster-wide und nur virtuell.

kube-proxy erzeugt auf jedem Node Forwarding Rules, sodass jede Anfrage an einen Pod über dessen Service geht. Im Default wird ip tables genutzt, es gibt aber weitere Möglichkeiten.

Service CIDR wird im kube-api-server über --service-cluster-ip-range= gesetzt und ist im Default 10.0.0.0/24. Sollte sich nicht mit dem POD Network CIDR überschneiden!

Befehle:

DNS in Kubernetes

Immer wenn service erzeugt wird, wird von Kubernetes ein DNS Name erzeugt. Der Name des Service wird dabei auf dessen IP gemappt. -> curl http://my-service

Äquivalente Namen:

Für Pods werden standardmäßig keine DNS Records erzeugt. Kann aber aktiviert werden. zB für Pod mit ip 10.244.2.5:

CoreDNS in Kubernetes

Jeder Pod hat einen Eintrag in /etc/resolv.conf der auf einen DNS nameserver zeigt. Neue Pod mit Service wird Service IP im namespace hinzugefügt.

CoreDNS server läuft als Deployment mit zwei Replicas im kube-system Namespace deployt. Im Corefile in /etc/coredns/Corefile wird das kubernetes plugin konfiguriert. Hier steht auch die Toplevel-Domain, standardmäßig cluster.local. Mit pods insecure kann ein DNS Record für Pods erzeugt werden. Wird als ConfigMap in den Pod gemountet, kann also einfach konfiguriert werden.

kubelet kennt die IP und den Toplevel-Domain Name des Clusters: cat /var/lib/kubelet/config.yaml -> clusterDNS, clusterDomain

Ingress

Zugriff ins Cluster mit Services only:

OnPremise Setup Browser -> Proxy (Port 80) -> Service Type NodePort (> 3000) -> Pod

Cloud Provider

–> Problem: Für jeden Service Type LoadBalancer entsteht ein LB, der Kosten verursacht. Außerdem kein Routing, zB example.com/videos nicht möglich, Proxy muss aufwändig konfiguriert werden.

Ingress als einzelner Ort zur Konfiguration inklusive SSL. Wird dann über einen Service (NodePort oder LoadBalancer) zugänglich gemacht.

Kann manuell gemacht werden (zB mit NGINX Server + manueller Konfiguration). Besser allerdings mit Ingress Controller mit Ingress Resources.

zB mit NGINX Ingress Controller:

Ingress Resources: