vervang flannel door weave

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.