Skip to main content
This guide demonstrates how to enable and use the Cilium ingress controller on a Kubernetes cluster where Cilium was installed (for example via Helm) with the default values (ingress disabled by default). You’ll learn the required Cilium Helm values, how to enable the Cilium ingress controller, deploy example apps, create an Ingress resource using the Cilium ingress class, and validate routing.

Prerequisites

Quick cluster sanity check:
Cilium’s ingress support requires one of two approaches. Choose either NodePort-based ingress or kube-proxy replacement plus L7 proxy. Below is a summary to compare the two options. Minimum required Helm values examples (pick one approach):
or
If your environment is kind (or another local cluster without a cloud LB), provide a LoadBalancer implementation such as MetalLB so the Cilium ingress LoadBalancer can obtain an external IP.
Cilium documentation reference:
A screenshot of the Cilium documentation webpage titled "Kubernetes Ingress Support," showing a left navigation menu and the main content explaining ingress/load balancer modes. The page includes highlighted note boxes, bullet points, and the Cilium logo/header at the top.

Enable the Cilium ingress controller

Add or update the ingress controller section in your values.yaml for the Cilium Helm chart:
Notes on key fields:
  • loadbalancerMode: shared — multiple Ingress resources share a single Cilium-created LoadBalancer (cilium-ingress).
  • loadbalancerMode: dedicated — each Ingress gets its own LoadBalancer (separate external IP per Ingress).
  • enforceHttps: true — forces HTTP → HTTPS (308) redirection for TLS-enabled hosts.
Apply the Helm upgrade and restart Cilium components:
Verify the Cilium IngressClass has been created:

If using a local cluster (kind, minikube, etc.)

Local clusters often lack a cloud load balancer. Install MetalLB or another LoadBalancer provider and configure an address pool so the cilium-ingress LoadBalancer acquires an external IP address for testing.

Example application topology

For this demo we deploy three services and a default backend:
  • shopping.com
    • /products → ecom-products-service (port 3000)
    • /cart → ecom-carts-service (port 3000)
  • blogger.com
    • all paths → blog-service (port 3000)
  • default-backend-service (port 80) — catch-all for unmatched hosts/paths

Application manifests (Deployment + Service)

Save the following manifests in the working directory and apply them with kubectl apply -f .. ecom-products (deployment + service):
ecom-carts (deployment + service):
blog (deployment + service):
default-backend (deployment + service):
Deploy the example apps:
Typical apply output (example):
Confirm deployments and services are ready:

Ingress resource (Cilium ingress class)

Create ingress.yaml to define host/path routing and a default backend. The Ingress uses the Cilium ingress class:
Apply the Ingress:
Verify the Ingress and the Cilium LoadBalancer:
The Ingress ADDRESS corresponds to the external IP assigned to the cilium-ingress LoadBalancer service.

DNS / hosts mapping for testing

For local testing, map the demo hostnames to the LoadBalancer IP (example /etc/hosts entries):

Testing the routes

Use curl (or a browser) to validate routing via the LoadBalancer IP:

Troubleshooting checklist

  • Confirm ingressClassName: cilium on the Ingress or that Cilium is set as the default IngressController.
  • Verify service names and ports referenced by the Ingress match the Services (kubectl get svc).
  • Check for typos in hostnames and paths (e.g., /card vs /cart).
  • Ensure the cilium-ingress Service has an external IP (install MetalLB in local environments if necessary).
  • Inspect Cilium logs if requests are not reaching the expected backend:
    • kubectl -n kube-system logs deployment/cilium-operator
    • kubectl -n kube-system logs ds/cilium

Shared vs dedicated LoadBalancer behavior

Conclusion

You have enabled the Cilium ingress controller, configured load balancer behavior, deployed demo applications, created an Ingress resource using the Cilium ingress class, and tested routing. For production or multi-environment use, consider DNS automation to point hostnames to the Cilium LoadBalancer external IP(s) and review TLS configuration and enforceHttps behavior.

Watch Video