# Mycelium CNI Plugin A Container Network Interface (CNI) plugin that enables Kubernetes containers to connect to the Mycelium network. ## Overview This CNI plugin integrates with the Mycelium overlay network to provide IPv6 connectivity for Kubernetes containers. It creates veth pairs and assigns IPv6 addresses from the host's Mycelium /64 block to containers. ## Prerequisites - Mycelium daemon running on the host - Go 1.21+ - Root privileges for installation ## Installation ```bash # Build the plugin make build # Install plugin and configuration make install ``` ## Configuration The plugin uses a CNI configuration file (`10-mycelium.conflist`) that specifies the Mycelium interface name: ```json { "cniVersion": "1.0.0", "name": "mycelium-network", "plugins": [ { "type": "mycelium-cni", "myceliumInterface": "mycelium" } ] } ``` ## How it Works 1. **ADD Operation**: Creates a veth pair, moves one end to the container namespace, assigns an IPv6 address from the Mycelium prefix, and sets up routing. 2. **DEL Operation**: Cleans up the host-side veth interface when containers are destroyed. ## Usage with Kubernetes ### 1. Setup Mycelium on all nodes First, install Mycelium on all Kubernetes nodes: ```bash # Download and install Mycelium MYCELIUM_VERSION="v0.5.6" wget https://github.com/threefoldtech/mycelium/releases/download/${MYCELIUM_VERSION}/mycelium-x86_64-unknown-linux-musl.tar.gz tar xf mycelium-x86_64-unknown-linux-musl.tar.gz sudo cp mycelium /usr/local/bin/ # Create systemd service sudo tee /etc/systemd/system/mycelium.service > /dev/null < -- ping6 -c 3 ``` ## Testing ### Manual CNI Testing You can test the plugin directly using CNI testing tools: ```bash # Install CNI plugins for testing go install github.com/containernetworking/cni/cnitool@latest # Set environment export CNI_PATH=/opt/cni/bin export NETCONFPATH=/etc/cni/net.d # Test ADD operation echo '{}' | sudo cnitool add mycelium-network /var/run/netns/test # Test DEL operation echo '{}' | sudo cnitool del mycelium-network /var/run/netns/test ``` ### Troubleshooting Check common issues: ```bash # Verify Mycelium is running sudo systemctl status mycelium ip -6 addr show mycelium # Check CNI logs journalctl -u kubelet | grep -i cni # Verify network namespaces sudo ip netns list # Check container interfaces kubectl exec -it -- ip link show kubectl exec -it -- ip -6 route show ``` ## Architecture Based on the docker-demo.sh script, this plugin: - Uses IPv6 addressing from Mycelium's /64 block - Creates veth pairs for container connectivity - Sets up routing for Mycelium network (400::/7) - Enables IPv6 forwarding on the host