Skip to main content

Cilium Debugging Quick Reference

This page collects the cilium debugging commands actually used throughout this tutorial series, each with a one-sentence purpose and a copyable command for quick troubleshooting. Commands are organized for cilium 1.20 (the currently verified version of this tutorial series), and every subcommand has been cross-checked against that version's source.

The CLI is named cilium-dbg in cilium 1.20

Starting from cilium 1.16, the former cilium CLI binary was renamed to cilium-dbg; the cilium 1.20 container image still keeps a cilium symlink pointing to cilium-dbg, so both names are equivalent. This page uses cilium-dbg consistently, executed inside the cilium Pod via kubectl -n kube-system exec ds/cilium -- cilium-dbg <subcommand>.

Check Feature Status

Check the actual status of various cilium features in the current deployment:

kubectl -n kube-system exec ds/cilium -- cilium-dbg status

The three lines most worth checking during troubleshooting:

FieldMeaningWhat to look for
KubeProxyReplacementkube-proxy replacementShould be True; if False, Service forwarding falls back to kube-proxy
Host RoutingHost routing modeBPF or Legacy; Legacy indicates a configuration-level fallback (e.g. bpf.masquerade=true missing)
MasqueradingIP masquerading modeBPF, IPTables, or Disabled; changes in tandem with Host Routing
status showing BPF does not mean the datapath hits it

The Host Routing field of cilium status only reflects the cilium-agent configuration layer: in VPC-CNI Native mode, endpointRoutes is enabled and Pod traffic bypasses the cilium_host device, so status shows BPF while the datapath never hits it. See VPC-CNI Native Routing in Depth for the full analysis.

Monitor Cilium Network on a Specific Node

NODE=172.22.48.23
POD=$(kubectl --namespace=kube-system get pod --field-selector spec.nodeName=$NODE -l k8s-app=cilium -o json | jq -r '.items[0].metadata.name')
kubectl --namespace=kube-system exec -it $POD -- cilium-dbg monitor
Note

Replace NODE with the actual name of the node you want to monitor.

Observe Pod-to-Pod Traffic in Real Time

The cilium-agent has a built-in Hubble Server, and the Pod image also ships the hubble CLI (which targets the local node's unix domain socket by default), so you can observe traffic in real time on a node without deploying Hubble Relay:

# Observe traffic of a specific Pod in real time (matches source or destination Pod, Ctrl+C to exit)
kubectl -n kube-system exec ds/cilium -- hubble observe --pod default/my-app -f

# Observe dropped traffic in real time (NetworkPolicy denial, blackhole drops, etc.) to quickly spot policy misfires
kubectl -n kube-system exec ds/cilium -- hubble observe --verdict DROPPED -f

# Observe traffic from Pod a to Pod b (--from-pod/--to-pod pin the direction)
kubectl -n kube-system exec ds/cilium -- hubble observe --from-pod default/a --to-pod default/b
Replaying recent flows

Without -f, hubble observe prints the most recent 20 flows from the buffer and exits; use --last N to adjust how many flows to look back.

To observe cluster-wide (Hubble Relay aggregating multiple nodes) or to use Hubble UI, see Enhancing Observability with Cilium.

Inspect BPF Maps and Agent Internal State

Inspect Load-Balancing Maps

With kubeProxyReplacement, Service frontends and backends are written by cilium into BPF maps. When troubleshooting unreachable Services or empty backends, check the kernel-side data first:

kubectl -n kube-system exec ds/cilium -- cilium-dbg bpf lb list

Then compare it with the service data in the cilium-agent process memory, to tell whether the agent never received the backends (watch issue) or received them but failed to write them into the BPF map (sync issue):

kubectl -n kube-system exec ds/cilium -- cilium-dbg shell -- db/show frontends

For a real troubleshooting case, see connection to apiserver reports operation not permitted (how empty Service backends were located).

Inspect Egress Gateway Rules

When traffic breaks after configuring Egress Gateway policies, check the egress BPF rules actually in effect on the node (Source IP is the Pod IP; an Egress IP of 0.0.0.0 means no rule selects the current node):

kubectl -n kube-system exec ds/cilium -- cilium-dbg bpf egress list

See the "FAQ" section of Egress Gateway in Practice for details.

Inspect Endpoints and Identities

When troubleshooting Pods not taken over by cilium, or NetworkPolicy identity matching not working, inspect the endpoint and security identity data on the node:

# All endpoint (Pod) entries in the node's BPF map
kubectl -n kube-system exec ds/cilium -- cilium-dbg bpf endpoint list

# Mapping between security identities and labels
kubectl -n kube-system exec ds/cilium -- cilium-dbg identity list

# Mapping between IPs (including node IP/EIP) and identities
kubectl -n kube-system exec ds/cilium -- cilium-dbg bpf ipcache list

For large-scale clusters, first watch whether the total identity count is ballooning via kubectl get ciliumidentities | wc -l, then drill down with the commands above; see Large-Scale Cluster Tuning Guide.