Kubernetes Network Design Principles
Source: https://kubernetes.io/docs/concepts/cluster-administration/networking/#kubernetes-ip-address-ranges
Node Network
The Node Network consists of Kubernetes worker nodes and control plane nodes. All nodes can communicate with each other.
- Every node in the Kubernetes cluster should be able to communicate with every other node without NAT (Network Address Translation).
- Kubernetes assumes a flat network where all nodes can talk freely.
- Nodes usually have a routable IP address within the cluster.
To see Nodes IP we can use command kubectl get nodes -o wide
.
➜ kubectl get nodes -o wide
NAME STATUS ROLES AGE VERSION INTERNAL-IP
minikube Ready control-plane 19h v1.31.0 192.168.49.2
EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME
<none> Ubuntu 22.04.4 LTS 6.10.14-linuxkit docker://27.2.0
Pod Network
The Pod Network is where all Kubernetes pods communicate. Pods within the cluster communicate using direct IP routing.
- Every pod gets a unique IP Address.
- Every pod in a Kubernetes cluster gets a unique IP address.
- Pod-to-pod communication happens directly without NAT.
- The Container Network Interface (CNI) plugin is responsible for managing pod networking.
- Container inside the same pod communicate by
localhost
.
We can test pod to pod communication by ping
from a pod to other pod.
➜ kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE
postgres-f8f589d5b-59rw8 1/1 Running 0 4h37m
simple-go-5dc4557ffc-c24fp 1/1 Running 0 4h8m
simple-go-5dc4557ffc-d6tz6 1/1 Running 0 4h8m
simple-go-5dc4557ffc-gv4fv 1/1 Running 0 4h8m
IP NODE NOMINATED NODE READINESS GATES
10.244.0.11 minikube <none> <none>
10.244.0.17 minikube <none> <none>
10.244.0.15 minikube <none> <none>
10.244.0.16 minikube <none> <none>
➜ kubectl exec -it simple-go-5dc4557ffc-c24fp -- ping 10.244.0.11
PING 10.244.0.11 (10.244.0.11): 56 data bytes
64 bytes from 10.244.0.11: seq=0 ttl=64 time=97.104 ms
64 bytes from 10.244.0.11: seq=1 ttl=64 time=0.219 ms
64 bytes from 10.244.0.11: seq=2 ttl=64 time=0.292 ms
64 bytes from 10.244.0.11: seq=3 ttl=64 time=0.160 ms
64 bytes from 10.244.0.11: seq=4 ttl=64 time=0.395 ms
^C
--- 10.244.0.11 ping statistics ---
5 packets transmitted, 5 packets received, 0% packet loss
round-trip min/avg/max = 0.160/19.634/97.104 ms
Service Network
The Service Network is a virtual network used for Kubernetes Services. Services get a stable ClusterIP that does not change. Kubernetes load-balances traffic across backend pods.
Kubernetes rewrites outbound traffic from a pod if it's destined for a Service.This ensures that the request is routed correctly to a backend pod.
- Services use ClusterIP (virtual IP) to route traffic to pods.
- kube-proxy manages service traffic using iptables or IPVS.
Get service endpoints:
➜ kubectl get endpoints
NAME ENDPOINTS AGE
kubernetes 192.168.49.2:8443 24h
postgres 10.244.0.11:5432 4h35m
simple-go 10.244.0.15:8080,10.244.0.16:8080,10.244.0.17:8080 4h11m