Prerequisites
Quick cluster sanity check:
Minimum required Helm values examples (pick one approach):
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.

Enable the Cilium ingress controller
Add or update the ingress controller section in yourvalues.yaml for the Cilium Helm chart:
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.
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 withkubectl apply -f ..
ecom-products (deployment + service):
Ingress resource (Cilium ingress class)
Createingress.yaml to define host/path routing and a default backend. The Ingress uses the Cilium ingress class:
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: ciliumon 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.,
/cardvs/cart). - Ensure the
cilium-ingressService 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-operatorkubectl -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 andenforceHttps behavior.
Links and references
- Cilium Documentation — Kubernetes Ingress Support
- Kubernetes Concepts — Ingress
- kind — Kubernetes IN Docker
- MetalLB — LoadBalancer for bare metal