Aangezien ik een networkpolicy wilde instellen in één van de namespaces van mijn Kubernetes Cluster, voldeed de CNI Flannel niet meer aangezien deze geen networkpolicy ondersteund. De CNI Weave doet dat wel en dus ga ik deze als CNI gebruiken.
De installatie van flannel is gedaan met het volgende commando:
$ kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
Het verwijderen hiervan gaat dan ook met:
$ kubectl delete -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
Weave communiceerd via een aantal TCP en UDP poorten en die moeten op ELKE node opengezet worden in de iptables:
$ sudo iptables -I INPUT -p tcp -m tcp --dport 6783 -j ACCEPT $ sudo iptables -I INPUT -p udp -m udp --dport 6783 -j ACCEPT $ sudo iptables -I INPUT -p udp -m udp --dport 6784 -j ACCEPT $ sudo iptables-save
Installeren van Weave gaat op dezelfde manier, via het volgende commando:
$ kubectl apply -f "https://cloud.weave.works/k8s/net?k8s-version=$(kubectl version | base64 | tr -d '\n')"
Controle gaat vervolgens met:
$ kubectl get pods -n kube-system -l name=weave-net NAME READY STATUS RESTARTS AGE weave-net-8nh6n 2/2 Running 0 109m weave-net-m2tzv 2/2 Running 0 109m weave-net-wsvsk 2/2 Running 0 109m
Probleem!
Nadat nu een nieuwe pod aangemaakt is, zien we dat het CNI network van deze pod nog steeds NIET in de pool van weave zit. Er is blijkbaar een ‘oude’ CNI pool gebruikt, ookal herstart ik eerst de ‘kubelet‘ service. Je vindt het ip adres van de CNI met
$ kubectl get pods -o wide
Elke node wijst een CNI-IP-adres toe aan de pods die toegevoegd worden. Welk IP adres dat wordt, is afhankelijk van de CNI die geïnstalleerd is, of was? De network adressen van de verschillende interfaces vind je met:
$ ifconfig <snip> weave: flags=4163 mtu 1376 inet 10.40.0.0 netmask 255.240.0.0 broadcast 10.47.255.255 </snip>
Zoals je ziet zou een nieuwe pod nu een IP adres in het network 10.40.0.0/12 moeten krijgen.
Oplossing
Op de nodes waar voorheen flannel was geïnstalleerd, is een verwijzing gemaakt in de directory /etc/cni/net.d/ In mijn geval was dit het volgende:
$ sudo ls -l /etc/cni/net.d/ -rw-r--r-- 1 root root 292 Feb 24 16:08 10-flannel.conflist -rw-r--r-- 1 root root 318 Feb 20 20:42 10-weave.conflist
Dit houdt in dat de flannel-optie handmatig verwijderd moet worden met:
$ sudo rm /etc/cni/net.d/10-flannel.conflist
Tevens vind ik nog een flannel network interface en ip link op de nodes, deze ga ik ook verwijderen:
$ sudo ipconfig delete flannel.1 $ sudo ip link delete flannel.1
Hierna een restart van kubelet:
$ sudo systemctl restart kubelet
Nadat ik nu nieuwe pod(s) aanmaak zal het IP adres hiervan uit de pool van Weave komen en nu kan ik dus ook networkpolicies gaan maken! De controle:
$ kubectl get po -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES nginx 1/1 Running 0 40m 10.40.0.1 node1 <none> <none>
Tip: wellicht een goed idee om nu ook je ‘oude’ coredns-pods te deleten zodat hier nieuwe van ge-deployed worden in het juiste netwerk.