Skip to content

Part 1: Introduction ​

Reviewed baseline: Cilium 1.20.2 / Cilium CLI 0.20.1 / Hubble CLI 1.20.2. Last Updated: October 15, 2026

Lab Environment Setup ​

Use an isolated, prepared Kubernetes environment. Cilium 1.20 lists Kubernetes 1.33–1.36 as tested. Nodes require AMD64/AArch64 Linux with kernel 5.10+, or the documented equivalent such as RHEL 8.10's backported 4.18 kernel. A kind/minikube VM or container uses its node/VM kernel; the workstation's OS name alone does not establish compatibility. Feature-specific requirements still apply.

Use kubectl within one minor version of the API server. Install the correct OS/architecture Cilium CLI and Hubble CLI assets with checksum verification as described in the main guide. Helm can render/review configuration; the audit used Helm 3.21.3. Do not repeat unchecked latest AMD64 downloads or reinstall the release in every chapter.

Install Once with the Selected Profile ​

EKS ENI, VPC CNI chaining and ordinary cluster-pool configurations have different prerequisites; see the main guide. The following lab values are the ordinary IPv4 cluster-pool alternative, with kube-proxy and DNS already working and one prepared CNI owner. They are not an EKS migration recipe. Verify that the Pod CIDR does not overlap Service, node or connected-network ranges.

Save as cilium-lab-values.yaml:

yaml
routingMode: tunnel
tunnelProtocol: vxlan
kubeProxyReplacement: false
ipv4:
  enabled: true
ipv6:
  enabled: false
ipam:
  mode: cluster-pool
  operator:
    clusterPoolIPv4PodCIDRList:
    - 10.244.0.0/16
    clusterPoolIPv4MaskSize: 24
hubble:
  enabled: true
  relay:
    enabled: true
  ui:
    enabled: true
  metrics:
    enabled:
    - dns
    - drop
    - tcp
    - flow
    - icmp
    - httpV2
bash
CILIUM_LAB_CONTEXT=replace-with-nonproduction-context
kubectl --context "$CILIUM_LAB_CONTEXT" get nodes -o wide
cilium version --client

# Fresh installation only, after preparing the cluster/CNI ownership and values.
cilium install --context "$CILIUM_LAB_CONTEXT" --version 1.20.2 \
  --values cilium-lab-values.yaml
cilium status --context "$CILIUM_LAB_CONTEXT" --wait

If Cilium is already installed, inspect its version/configuration and follow its owner’s upgrade process. Installation/status commands and the later connectivity tests are not evidence of production compatibility; no cluster was provisioned for this audit.

What is Cilium? ​

Cilium provides networking, security and observability through a Linux eBPF dataplane and Kubernetes integration. It offers endpoint policy, mode-dependent IPAM/routing, Service handling and Hubble flow visibility. The Docker libnetwork integration was removed in 1.20; Kubernetes, Docker and Mesos should not be presented as interchangeable current installation targets.

Core Components and Capabilities ​

Component / featureRole and qualification
Cilium AgentPer-node endpoint and dataplane management; it does not own every host/networking function
Cilium OperatorCluster-level allocation/identity/controller work; multiple replicas are supported, with leader election where applicable. The reviewed chart defaults to two replicas
eBPFPrograms/maps at kernel hooks, subject to verification and feature requirements; performance must be measured
L3/L4 and L7 policyL7 needs the supported Envoy/DNS proxy path; Kafka-aware L7 policy was removed in 1.20, while L4 rules can still govern Kafka connections
kube-proxy replacementOptional Service handling; DSR, Maglev and XDP have their own configuration/topology constraints
Encryptionencryption.type selects ipsec, wireguard, or beta ztunnel; ztunnel workload mTLS has its own enrollment, bootstrap, traffic and policy prerequisites
HubbleNetwork/proxy flow observations and service maps, not automatic end-to-end application tracing
ClusterMesh / BGPClusterMesh needs identity, trust and network reachability; BGP advertises routes but does not program internal cluster routing

The component relationship is: kubelet requests Pod sandbox operations through CRI; the container runtime invokes the configured CNI plugin; Cilium coordinates endpoint setup and the agent programs the dataplane. CNI is not a per-packet forwarding hop. Envoy handles configured L7 proxy traffic, and Hubble exposes flow events separately from Prometheus metric scraping.

Security Identity ​

A security identity is an allocated numeric identifier for an endpoint's security-relevant label set, within the relevant allocation scope. These labels are filtered/configured and can include namespace-derived labels. Same app labels alone do not guarantee the same identity across namespaces or clusters. The numeric ID is not a permanent globally meaningful hash or a Pod IP. Other endpoint types also use identities.

Container Networking Basics ​

Host networking shares the host network namespace. A bridge connects interfaces on a host; an overlay encapsulates traffic across an underlay. Native routing relies on the underlay reaching Pod addresses. These concepts can coexist and should not be confused with choosing an eBPF versus Netfilter implementation.

Operational questions include address capacity, routing/MTU, Service behavior, tenant policy, observability and failure recovery. A network model alone does not determine performance or security.

Understanding CNI ​

CNI is the CNCF specification/library/plugin ecosystem for container network configuration. Plugins exchange configuration/results in JSON, and can delegate address allocation to an IPAM plugin. CNI's setup/removal contract is distinct from CRI, which kubelet uses to communicate with the container runtime. Since Kubernetes 1.24, kubelet no longer owns the removed --network-plugin/--cni-bin-dir configuration flags.

ProjectRelevant distinction
CiliumLinux eBPF dataplane, several routing/IPAM modes, proxy-assisted L7 policy and Hubble
CalicoLinux Iptables/Nftables/BPF and supported Windows HNS; OSS WireGuard, staged policy and separately configured L7 integration
FlannelConnectivity backends such as VXLAN/host-gw/WireGuard; policy can be supplied by its optional chart controller or another implementation
AWS VPC CNIVPC address allocation/networking; native policy on supported EC2 Linux nodes and separate SG-for-Pods controls
Weave NetThe original weaveworks/weave repository is archived; treat it as a historical option and check any proposed maintained distribution separately

See the current comparison for support boundaries. Do not use unbounded Kubernetes compatibility or “very high/high/medium” performance rankings as deployment evidence. Service meshes are optional integrations, not a prerequisite for ordinary Pod networking.

Lab: A Scoped L4 Policy ​

Use the chosen context and a dedicated namespace. This example defines policy; it does not deploy an application server or client images. Prepare controller-managed test workloads with approved images/tools:

  • A backend Pod labeled app=backend, listening on TCP 8080.
  • A frontend Pod labeled app=frontend and another client with a different label, both with a suitable test client.
  • Ordinary managed Pod interfaces, default label handling, known DNS/Service configuration and no other matching allow policies that invalidate the intended isolation.

Save the namespace definition as cilium-intro-namespace.yaml, apply it, then prepare the test workloads:

yaml
apiVersion: v1
kind: Namespace
metadata:
  name: cilium-intro-demo
bash
kubectl --context "$CILIUM_LAB_CONTEXT" apply -f cilium-intro-namespace.yaml

Save the policy below as cilium-intro-policy.yaml:

yaml
apiVersion: cilium.io/v2
kind: CiliumNetworkPolicy
metadata:
  name: allow-frontend-backend
  namespace: cilium-intro-demo
spec:
  endpointSelector:
    matchLabels:
      k8s:app: backend
  ingress:
  - fromEndpoints:
    - matchLabels:
        k8s:app: frontend
        k8s:io.kubernetes.pod.namespace: cilium-intro-demo
    toPorts:
    - ports:
      - port: '8080'
        protocol: TCP
bash
kubectl --context "$CILIUM_LAB_CONTEXT" get pods -n cilium-intro-demo --show-labels
kubectl --context "$CILIUM_LAB_CONTEXT" apply -f cilium-intro-policy.yaml
kubectl --context "$CILIUM_LAB_CONTEXT" get cnp -n cilium-intro-demo

With those prerequisites and no additional matching allow, expected regular Pod-to-Pod ingress results are:

Source / destinationExpected result
Same-namespace frontend → backend TCP 8080Allowed
Other client label → backend TCP 8080Denied
Frontend → backend another port/protocolNot allowed by this policy
Same app label from another namespaceNot allowed by this policy

Verify both positive and negative connections after policy realization. Other allow/deny policies, host traffic and probes can change the effective result. This ingress rule does not restrict frontend egress or provide HTTP method/path filtering. Inspect actual traffic and endpoint state rather than assuming API acceptance equals enforcement.

cilium connectivity test is an additional test runner that creates workloads and policies. Run it only in a reviewed test environment with the needed permissions; it is not a read-only status command. Use cilium connectivity perf for the separate performance runner and preserve actual version/topology/results when benchmarking.

References and Next Steps ​

Continue to eBPF or test your understanding with the Introduction Quiz.