Install Cilium CNI with kube-proxy Replacement
Cilium CNI
Section titled “Cilium CNI”Cilium provides the Container Network Interface (CNI) and replaces kube-proxy with eBPF-based load balancing.
Step 1: Install Cilium CLI
Section titled “Step 1: Install Cilium CLI”CILIUM_CLI_VERSION=$(curl -s https://raw.githubusercontent.com/cilium/cilium-cli/main/stable.txt)curl -L --fail --remote-name-all \ https://github.com/cilium/cilium-cli/releases/download/${CILIUM_CLI_VERSION}/cilium-linux-amd64.tar.gz{,.sha256sum}sha256sum --check cilium-linux-amd64.tar.gz.sha256sumsudo tar xzvfC cilium-linux-amd64.tar.gz /usr/local/binrm cilium-linux-amd64.tar.gz{,.sha256sum}Step 2: Install Cilium with kube-proxy replacement
Section titled “Step 2: Install Cilium with kube-proxy replacement”Get the version from ansible/group_vars/all.yaml:
CILIUM_VERSION=$(grep -E "cilium_version:" ansible/group_vars/all.yaml | head -n 1 | awk -F'"' '{print $2}')Update k8sServiceHost in infrastructure/cilium/values.cilium to match the control plane IP.
Install with the required settings for Tailscale compatibility:
cilium install --version $CILIUM_VERSION --values infrastructure/cilium/values.ciliumThe socketLB.hostNamespaceOnly=true setting is required when using Tailscale Kubernetes Operator LoadBalancer services. Without it, traffic forwarded through the Tailscale proxy pod will fail because Cilium’s socket-level load balancer interferes with iptables DNAT rules.
Remove the kube-proxy DaemonSet since Cilium replaces it:
kubectl -n kube-system delete daemonset kube-proxyStep 3: Enable Hubble observability
Section titled “Step 3: Enable Hubble observability”cilium hubble enable --uiStep 4: Verify installation
Section titled “Step 4: Verify installation”kubectl get nodescilium statuscilium config view | grep -E "bpf-lb-sock|kubeProxyReplacement"Expected output should include:
bpf-lb-sock-hostns-only truekubeProxyReplacement trueUpgrading Cilium
Section titled “Upgrading Cilium”To update Cilium settings after initial installation:
cilium upgrade --version $CILIUM_VERSION --set socketLB.hostNamespaceOnly=truekubectl rollout restart daemonset/cilium -n kube-systemkubectl rollout status daemonset/cilium -n kube-system