SynfraCore
Synfracore
Start Learning
Navigation

Academies

Platform

RoadmapsLabsCertificationsInterviewPYQsAI AssistantCareer
Start Learning Free Learning Roadmaps

eBPF & CiliumInstallation

Step-by-step setup and installation guide

📄
Last updated Aug 2026
Expert Content

eBPF & Cilium — Installation Guide

Pre-Flight — Confirm Kernel Support

eBPF requires a sufficiently modern Linux kernel — confirm this before installing anything, especially on older nodes or minimal base images:

bash
uname -r
# Most current managed Kubernetes node images (EKS, GKE, AKS) already
# meet this requirement; a genuinely old kernel is the main real
# blocker `(needs verification — recheck current Cilium docs for the
# exact minimum kernel version required)`

Install Cilium as the Cluster CNI

The standard path — replacing the default CNI (often kube-proxy + a basic CNI) entirely, per Overview's framing:

bash
helm repo add cilium https://helm.cilium.io/
helm repo update

helm install cilium cilium/cilium \
  --namespace kube-system \
  --set kubeProxyReplacement=true \
  --set hubble.relay.enabled=true \
  --set hubble.ui.enabled=true

# Verify installation health
cilium status
# Reports kube-proxy-replacement mode and overall health — this is
# the single most useful command for confirming Cilium is actually
# functioning correctly, not just that pods are Running

Install the Cilium CLI

bash
CILIUM_CLI_VERSION=$(curl -s https://raw.githubusercontent.com/cilium/cilium-cli/main/stable.txt)
curl -L --remote-name-all "https://github.com/cilium/cilium-cli/releases/download/${CILIUM_CLI_VERSION}/cilium-linux-amd64.tar.gz"
tar xzvf cilium-linux-amd64.tar.gz -C /usr/local/bin

cilium version

Install the Hubble CLI (Flow Observability)

bash
HUBBLE_VERSION=$(curl -s https://raw.githubusercontent.com/cilium/hubble/master/stable.txt)
curl -L --remote-name-all "https://github.com/cilium/hubble/releases/download/${HUBBLE_VERSION}/hubble-linux-amd64.tar.gz"
tar xzvf hubble-linux-amd64.tar.gz -C /usr/local/bin

hubble status

Bootstrapping a New Cluster With Cilium From the Start (kind, for Local Practice)

bash
cat <<EOF | kind create cluster --config=-
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
networking:
  disableDefaultCNI: true   # Cilium replaces the default CNI entirely
EOF

helm install cilium cilium/cilium --namespace kube-system \
  --set kubeProxyReplacement=true --set hubble.relay.enabled=true --set hubble.ui.enabled=true

Verify Everything Works

bash
# 1. Confirm Cilium reports healthy
cilium status
# Look specifically for "KubeProxyReplacement: True" and no error states

# 2. Run Cilium's own built-in connectivity test
cilium connectivity test
# This deploys real test pods and verifies pod-to-pod, pod-to-service,
# and policy-enforcement connectivity end to end — the most thorough
# post-install check available

# 3. Confirm Hubble is observing real flows
hubble observe --namespace kube-system

Common Installation Issues

cilium status reports KubeProxyReplacement: False unexpectedly

bash
cilium status --verbose
# Confirm kubeProxyReplacement=true was actually set at install time —
# a missing or misspelled Helm flag silently falls back to a
# lower-capability mode rather than erroring

Hubble UI shows no flow data

This is the exact scenario covered in Troubleshooting: hubble-relay and per-node Hubble collection are two separate flags — both hubble.relay.enabled=true and Hubble being enabled per-node are required for the UI to show anything, even if hubble observe at the CLI works fine against a single node.

Cilium pods stuck in CrashLoopBackOff after install

bash
kubectl logs -n kube-system -l k8s-app=cilium
# Most common cause on a fresh cluster: an incompatible or too-old
# kernel version, or a conflicting CNI still partially installed

cilium connectivity test fails on cross-node traffic specifically

bash
cilium status --verbose | grep -i tunnel
# Confirms the encapsulation/tunneling mode Cilium is using — a
# mismatch between the configured mode and the actual network
# environment (e.g., cloud security groups blocking the tunnel port)
# is the usual cause

What's Installed

After a successful Cilium installation:

Cilium agent — DaemonSet running on every node, implementing the eBPF-based datapath (replacing kube-proxy if kubeProxyReplacement=true)
Cilium Operator — cluster-level coordination
Hubble (if enabled) — per-node flow observability, plus hubble-relay for cluster-wide aggregation and hubble-ui for the visual flow explorer

Next Steps

Go to the Fundamentals section to explore Hubble flow data and write your first CiliumNetworkPolicy.

Share:
Join our Community
Daily tips, job alerts, interview help — join engineers learning together
Up Next
🔤
eBPF & CiliumFundamentals
Core concepts and commands — hands-on from the start
Also Worth Exploring
← Back to all eBPF & Cilium modules
PrerequisitesFundamentals