Sieć w Kubernetes
Domyślnie:
- pod może komunikować się z dowolnym podem na dowolnym nodzie bez użycia NAT (NATlesscomunication) w ramach naszego klastra
- agents (system daemons, kubelet - usługi w ramach klastra) mogą komunikować się z podami w tym samym nodzie
Kubernetes w większości przypadków korzysta z koncepcji sieci Overlay:
- nody wystepują w ramach jednej sieci natomiast pody działają w ramach innej sieci która występuje w ramach klastra
Pod jest zaadresowany takim samym adresem pochodzącym z tej samej sieci w której występują nody - w tej sytuacji komunikacja pod-nod odbywa się bez NAT, jeśli jest użyta koncepcja Overlay to konieczne jest użycie NAT
- Kontenery w ramach jednego poda wykorzystują ten sam namepsace oraz adres IP, więc komunikują się w ramach localhost (komunikacja między procesowa)
Koncepcje sieciowe w Kubernetes nie jest jego domeną - wszystko zależy od użytego pluginu
Przykładowe pluginy sieciowe w k8s:
- Flannel
- Cillium
- Romana
- Calico
- Kube-router
- NSX-T
- OpenVSwitch
Serwisy sieciowe
Kube-proxy
działa w ramach każdego noda i używany jest przez service, wykorzystuje iptables żeby można było wystawić logiczny obiekt service, który pozwala na komunikację z podem
Services
- para lub kilka par (multivalue)
IP:PORT
- każdy service ma swój stały adres IP (w 100% wirtualny - nie jest przypisany do żadnego interfejsu) - nie znajdzie się on w żadnym pakiecie TCP/IP
- pozwala wystawić usługę z wielu podów za zewnątrz pod jednym adresem IP
- tworząc service ApiService powiadamia wszystkich agentów (kube-proxy) na wszystkich nodach, następnie kube-proxy za pomocą iptables tworzy odpowiednie reguły aby możliwe było skomunikowanie się z konkretnym podem który stoim za tym serwisem
DNS
kubectl apply -f busybox.yaml
kubectl exec -it busybox -- cat /etc/resolv.conf
kubectl exec -it busybox -- nslookup kubernetes
DNS names inside the cluster
- kube-dns (Service Name).kube-system (NAMESPACE).svc.cluster.local (BASE DOMAIN NAME)
- 10-244-0-214 (POD IP).default (NAMESPACE).pod.cluster.local (BASE DOMAIN NAME)
kubectl describe pod/busybox
kubectl exec -it busybox -- nslookup 10-1-2-32.default.pod.cluster.local
CoreDNS logs
kubectl get pod -n kube-system
kubectl logs coredns-6dcc67dcbc-8mc6g -n kube-system
kubectl logs coredns-6dcc67dcbc-9p8hz -n kube-system
Pliki