Appearance
The Ultimate Guide to Kubernetes Load Balancers in 2026 (K3s Edition) β
TL;DR β Running K3s on bare metal or edge? This guide dissects every major Kubernetes load balancer β NGINX, Traefik, MetalLB, HAProxy, Envoy, Cilium, Istio, Linkerd, and K3s's own Klipper β across architecture, performance, K3s compatibility, and real-world use cases. Pick the right one for your stack, once and for all.
π§ Why This Guide Exists β
Kubernetes load balancers are one of the most confusing corners of the cloud-native ecosystem. Search for "best Kubernetes load balancer" and you'll find a dozen blog posts each recommending something different, often without context. When you throw K3s β the lightweight, single-binary Kubernetes distribution from Rancher β into the mix, the confusion compounds further.
K3s ships with its own built-in load balancer (Klipper/ServiceLB) and its own ingress controller (Traefik). But is that the right choice for your production workload? What if you need BGP routing, service mesh capabilities, or sub-millisecond latency?
This guide covers every serious option in the market today, with real benchmarks, architecture diagrams, and clear K3s-specific guidance.
πΊοΈ The Landscape: What Are We Even Comparing? β
Before diving in, let's clarify the terminology. "Load balancer" in Kubernetes refers to multiple layers:
| Layer | What It Does | Example Tools |
|---|---|---|
| L4 LoadBalancer (IP/TCP) | Assigns external IPs to Services | MetalLB, Klipper, Kube-VIP |
| L7 Ingress Controller | Routes HTTP/HTTPS traffic by host/path | NGINX, Traefik, HAProxy |
| Reverse Proxy / Edge Proxy | Advanced traffic shaping, retries, circuit breaking | Envoy, HAProxy |
| Service Mesh | East-west (pod-to-pod) traffic management + security | Istio, Linkerd, Cilium |
Most real deployments combine tools from multiple layers. For K3s, a typical production stack might be: MetalLB (L4) + Traefik (L7 Ingress) + optionally Linkerd (mesh).
π¬ Competitor Deep-Dive β
1. π Klipper ServiceLB (K3s Built-In) β
What it is: K3s's embedded load balancer, enabled by default. Uses host ports and iptables rules to forward traffic.
Architecture:
External Traffic
β
βΌ
[Node HostPort] ββiptablesβββΊ [ClusterIP] βββΊ [Pod]
β²
[DaemonSet: svc-* pods on each node]How it works: For each LoadBalancer Service, Klipper creates a DaemonSet with svc- prefixed pods that bind to the host port. The node's own external IP is reported as the EXTERNAL-IP. There is no IP announcement to the network β it simply binds ports.
K3s-specific note: Klipper is enabled by default. To run MetalLB or any other LB controller, you must disable it:
bash
# During K3s install
curl -sfL https://get.k3s.io | sh -s - --disable servicelb
# Or in K3s config file
disable:
- servicelb| Feature | Rating |
|---|---|
| Zero config | β Built-in |
| True IP announcement | β No |
| BGP support | β No |
| Multi-node HA | β οΈ Failover only |
| Production-readiness | β οΈ Dev/small clusters |
| Resource usage | β Minimal |
Best for: Local dev, single-node K3s, homelab, quick demos.
2. π’ NGINX Ingress Controller β
What it is: The most widely deployed Kubernetes Ingress controller, based on the battle-tested NGINX reverse proxy. Two major variants exist: the community ingress-nginx and the commercial NGINX Inc. version (nginx-ingress).
Architecture:
Internet
β
βΌ
[NGINX Pod]
β Reads Ingress rules + Annotations
ββββΊ /app-a βββΊ Service A βββΊ Pods
ββββΊ /app-b βββΊ Service B βββΊ Pods
ββββΊ /api βββΊ Service C βββΊ Pods
β
[ConfigMap / Annotations drive nginx.conf]Key features:
- Annotation-driven configuration (granular control via
nginx.ingress.kubernetes.io/*) - SSL termination, wildcard certs, HSTS
- Rate limiting, IP allowlisting, custom error pages
- WebSocket support, gRPC proxying
- Prometheus metrics out of the box
- ModSecurity WAF support (community build)
K3s installation:
bash
# First, disable K3s's default Traefik if you want NGINX instead
curl -sfL https://get.k3s.io | sh -s - --disable traefik
# Install NGINX Ingress via Helm
helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
helm install ingress-nginx ingress-nginx/ingress-nginx \
--namespace ingress-nginx --create-namespaceSample Ingress resource:
yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: my-app
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
nginx.ingress.kubernetes.io/rate-limit: "100"
spec:
ingressClassName: nginx
rules:
- host: myapp.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: my-app-svc
port:
number: 80Performance: NGINX processes ~30,000β40,000 RPS per instance in typical Kubernetes ingress scenarios. Config reloads happen on Ingress updates (brief traffic disruption is possible on busy clusters).
| Feature | Rating |
|---|---|
| Community & docs | β Massive |
| Annotation flexibility | β Excellent |
| Auto TLS (Let's Encrypt) | β οΈ Needs cert-manager |
| Dynamic config (no reload) | β Requires reload |
| Performance | β Very good |
| K3s compatibility | β Excellent |
| Learning curve | β Low |
Best for: Teams migrating from traditional NGINX setups, production HTTP/HTTPS workloads, teams needing extensive annotation-based customization.
3. πΉ Traefik (K3s Default) β
What it is: A cloud-native reverse proxy and ingress controller written in Go. K3s ships Traefik v2 by default (upgraded to v3 in recent K3s releases). It auto-discovers services via Kubernetes CRDs and annotations.
Architecture:
Internet
β
βΌ
[Traefik Proxy]
β Watches: IngressRoutes, Ingress, Services
β Providers: Kubernetes CRD, Kubernetes Ingress
β
ββ[Routers]ββ[Middlewares]ββ[Services]βββΊ Pods
β β β
β Host/Path RateLimit
β rules Auth
β Retry
β
ββ[Dashboard: :8080] [Metrics: Prometheus]Key features:
- Zero-config service discovery β annotate a Service and Traefik picks it up instantly, no config file reloads
- Automatic Let's Encrypt TLS with ACME challenge support
- Middleware system: auth, rate limiting, headers, circuit breakers, retry
- Native IngressRoute CRDs for full power
- Built-in dashboard and Prometheus metrics
- TCP/UDP routing support (not just HTTP)
K3s-specific note: Traefik is bundled and managed by K3s. To customize it, use a HelmChartConfig:
yaml
# /var/lib/rancher/k3s/server/manifests/traefik-config.yaml
apiVersion: helm.cattle.io/v1
kind: HelmChartConfig
metadata:
name: traefik
namespace: kube-system
spec:
valuesContent: |-
dashboard:
enabled: true
additionalArguments:
- "--entrypoints.websecure.http.tls"
ports:
web:
redirectTo: websecureSample IngressRoute:
yaml
apiVersion: traefik.io/v1alpha1
kind: IngressRoute
metadata:
name: my-app
spec:
entryPoints:
- websecure
routes:
- match: Host(`myapp.example.com`)
kind: Rule
services:
- name: my-app-svc
port: 80
middlewares:
- name: rate-limit
tls:
certResolver: letsencryptPerformance: Traefik handles ~19,000 RPS with very stable resource consumption and zero-reload dynamic config β a key advantage over NGINX for fast-moving microservices.
| Feature | Rating |
|---|---|
| K3s integration | β Native, bundled |
| Auto TLS (Let's Encrypt) | β Built-in ACME |
| Dynamic config (no reload) | β Real-time |
| Dashboard | β Built-in |
| TCP/UDP routing | β Yes |
| Performance vs NGINX | β οΈ Slightly lower RPS |
| Enterprise features | β οΈ Enterprise version needed |
Best for: K3s default stack, teams wanting zero-touch TLS, GitOps-friendly pipelines, dev-friendly environments.
4. π· MetalLB β
What it is: A bare-metal L4 load balancer for Kubernetes. It gives LoadBalancer type Services an actual external IP from a pool you define, using either Layer 2 (ARP) or BGP protocols.
Architecture (Layer 2 mode):
External Network
β
β ARP: "Who has 192.168.1.100?" β Leader Node replies
βΌ
[Leader Node] βββΊ kube-proxy βββΊ Service Pods (all nodes)
β
[MetalLB Speaker DaemonSet] on every node
[MetalLB Controller] handles IP assignmentArchitecture (BGP mode):
[Router/Switch]
β BGP peering
βΌ
[MetalLB Speaker] on each K3s node
β Announces /32 routes per service IP
βΌ
[Direct packet routing to node]K3s installation:
bash
# Step 1: Disable Klipper
curl -sfL https://get.k3s.io | sh -s - --disable servicelb
# Step 2: Install MetalLB
helm repo add metallb https://metallb.github.io/metallb
helm install metallb metallb/metallb -n metallb-system --create-namespace
# Step 3: Configure IP pool
kubectl apply -f - <<EOF
apiVersion: metallb.io/v1beta1
kind: IPAddressPool
metadata:
name: k3s-pool
namespace: metallb-system
spec:
addresses:
- 192.168.1.200-192.168.1.220
---
apiVersion: metallb.io/v1beta1
kind: L2Advertisement
metadata:
name: k3s-l2
namespace: metallb-system
EOFImportant caveat: In L2 mode, MetalLB doesn't truly load-balance at L4 β it elects a leader node that handles ARP for a given IP, and kube-proxy does the actual pod distribution. It's more of a failover mechanism than a true LB. BGP mode provides real per-node distribution but requires BGP-capable routers.
| Feature | Rating |
|---|---|
| Bare-metal IP assignment | β Core purpose |
| BGP mode | β Yes |
| Layer 2 mode | β Yes (ARP/NDP) |
| True L4 load balancing | β οΈ BGP only |
| K3s compatibility | β Excellent (disable Klipper first) |
| Resource usage | β Very lightweight |
| Requires routers | β οΈ BGP mode does |
Best for: Bare-metal K3s clusters that need proper external IPs, homelab with a VLAN IP pool, edge deployments without cloud LB.
5. β‘ HAProxy Ingress Controller β
What it is: The Kubernetes ingress controller backed by HAProxy β historically the gold standard for raw TCP/HTTP load balancing performance. HAProxy Technologies' own benchmarks show their ingress controller handling 42,000 RPS with the lowest CPU among all competitors.
Architecture:
Internet
β
βΌ
[HAProxy Pod]
β Config generated from Ingress/CRDs by controller
β
ββ[Frontend: bind *:80]
β β
β [ACL rules: path_beg, hdr_dom]
β β
ββ[Backend pools] βββΊ Pod endpoints (health-checked)
β
[Stats: :1936] [Prometheus metrics]Key features:
- Best-in-class raw throughput and lowest latency at scale
- Native support for HTTP/3, QUIC, gRPC
- Fine-grained connection control (timeouts, retries, stick tables)
- Advanced Layer 7 routing: headers, cookies, ACLs
- TCP mode for non-HTTP workloads
- Gateway API support (HAProxy Ingress Controller v3.1+)
K3s installation:
bash
helm repo add haproxytech https://haproxytech.github.io/helm-charts
helm install haproxy-ingress haproxytech/kubernetes-ingress \
--namespace haproxy-controller --create-namespace \
--set controller.service.type=LoadBalancerPerformance edge: In head-to-head benchmarks against NGINX, Traefik, and Envoy:
- HAProxy: 42,000 RPS, 50% CPU
- NGINX: ~35,000 RPS, ~65% CPU
- Traefik: ~19,000 RPS, ~45% CPU (more consistent)
- Envoy: ~38,000 RPS, 73% CPU
| Feature | Rating |
|---|---|
| Raw throughput | β Best-in-class |
| HTTP/3 & gRPC | β Yes |
| Advanced ACLs | β Very powerful |
| Auto TLS | β οΈ Needs cert-manager |
| Dynamic config | β v2.4+ hitless reload |
| K3s compatibility | β Good |
| Complexity | β οΈ Steeper learning curve |
Best for: High-throughput production clusters, financial services, teams needing ultra-low p99 latency, TCP-heavy workloads.
6. π Envoy Proxy β
What it is: Originally built at Lyft, Envoy is a high-performance C++ proxy that has become the de facto data plane of the cloud-native ecosystem. It powers Istio, Consul Connect, AWS App Mesh, and is the backbone of the Kubernetes Gateway API ecosystem.
Architecture:
[xDS Control Plane] (e.g., Istio's istiod)
β gRPC streaming: LDS, RDS, CDS, EDS
βΌ
[Envoy Proxy Instance]
β
ββ Listeners (ports/protocols)
β β
β Filter Chains (HTTP, TCP, gRPC filters)
β β
ββ Clusters (upstream endpoints)
β
[Circuit Breaker] [Retry] [Outlier Detection]Key features:
- Dynamic configuration via xDS API (zero-downtime updates)
- Built-in circuit breaking, retries, outlier detection
- Excellent observability: detailed stats, tracing (Zipkin/Jaeger/OTLP), access logs
- gRPC-first with HTTP/1.1 and HTTP/2 support
- Mutual TLS (mTLS) between services
- WebAssembly (Wasm) plugin extensibility
- Rate limiting via external services (Ratelimit service)
Standalone on K3s (without Istio):
bash
# Envoy Gateway β standalone Gateway API implementation
helm install eg oci://docker.io/envoyproxy/gateway-helm \
--version v1.2.0 -n envoy-gateway-system --create-namespacePerformance: Envoy delivers ~38,000 RPS with excellent handling of dynamic service churn (critical for microservices that scale up/down frequently). Its sub-10ms latency during pod scaling events makes it ideal for Netflix/Uber-style workloads.
| Feature | Rating |
|---|---|
| Dynamic config (xDS) | β Best-in-class |
| Observability | β Exceptional |
| gRPC support | β Native |
| Circuit breaking | β Built-in |
| Wasm extensibility | β Yes |
| Standalone complexity | β οΈ High (needs control plane) |
| K3s standalone use | β οΈ Via Envoy Gateway |
Best for: Microservices architectures with dynamic service discovery, service mesh data plane, teams that need xDS-compatible control plane integration.
7. πΈοΈ Istio (Service Mesh) β
What it is: The most feature-complete service mesh for Kubernetes. Istio injects Envoy sidecars into every pod and manages the entire service-to-service communication layer via a centralized control plane (istiod).
Architecture:
[istiod - Control Plane]
βββ Pilot (traffic management)
βββ Citadel (certificate authority)
βββ Galley (config validation)
β xDS API
βΌ
[Pod A] [Pod B]
App Container App Container
Envoy Sidecar βββmTLSβββΊ Envoy Sidecar
(intercepts all traffic) (intercepts all traffic)Istio Ambient Mode (2024/2026): The new sidecar-free mode using per-node "ztunnel" proxies + optional Waypoint proxies eliminates the double-hop latency, bringing performance near bare-metal levels.
Key features:
- Fine-grained traffic management: canary, A/B, weighted routing, fault injection
- Automatic mTLS between all services
- Authorization policies at L7 (RBAC per HTTP path/method)
- Distributed tracing, Kiali topology visualization
- Multi-cluster and VM support
- Gateway API support
K3s resource requirements (important!):
- istiod: ~500MB RAM
- Per-pod Envoy sidecar: ~50MB RAM each
- At 500 services: 25β50GB extra RAM vs. Linkerd β plan accordingly
bash
# Install Istio on K3s
curl -L https://istio.io/downloadIstio | sh -
istioctl install --set profile=minimal -y
kubectl label namespace default istio-injection=enabled| Feature | Rating |
|---|---|
| Traffic management | β Most advanced |
| mTLS | β Automatic |
| Observability | β Full stack (Kiali, Jaeger) |
| Authorization policies | β L7 RBAC |
| Resource usage | β Heavy (per-pod sidecar) |
| Complexity | β High |
| K3s (small cluster) | β οΈ Feasible, watch RAM |
Best for: Enterprise Kubernetes, SOC 2/PCI-DSS compliance requirements, teams needing canary deployments and fault injection, hybrid VM+K8s environments.
8. π Linkerd (Service Mesh) β
What it is: The original service mesh (coined the term in 2016). Linkerd uses a Rust-based "microproxy" instead of Envoy β dramatically lighter weight, making it the fastest and most resource-efficient service mesh available.
Architecture:
[Linkerd Control Plane]
βββ destination (service discovery)
βββ identity (certificate authority)
βββ proxy-injector (sidecar injection)
β
[Pod A] [Pod B]
App Container App Container
linkerd2-proxy βββmTLSβββΊ linkerd2-proxy
(Rust, ~10MB RAM each) (tiny overhead!)Performance benchmarks (vs other meshes):
- Linkerd: ~5β10% slower than baseline (no mesh) β best among all meshes
- Istio: ~25β35% slower than baseline
- Cilium Mesh: ~20β30% slower than baseline
Key features:
- Automatic mTLS (on by default, zero config)
- Golden signals dashboard (latency, traffic, errors, saturation)
- Per-route metrics
- Traffic splitting (canary, A/B)
- Multi-cluster support
- FIPS-compliant builds available
- Graduated CNCF project (most mature after Istio)
K3s installation:
bash
# Install Linkerd CLI
curl --proto '=https' --tlsv1.2 -sSfL https://run.linkerd.io/install | sh
# Pre-flight check
linkerd check --pre
# Install on K3s
linkerd install --crds | kubectl apply -f -
linkerd install | kubectl apply -f -
linkerd check
# Inject into a namespace
kubectl annotate namespace default linkerd.io/inject=enabled| Feature | Rating |
|---|---|
| Resource efficiency | β Best among meshes |
| Performance overhead | β Minimal (5β10%) |
| mTLS | β Auto, zero-config |
| Simplicity | β Easiest mesh |
| Dashboard | β Built-in |
| Advanced traffic routing | β οΈ Less than Istio |
| K3s compatibility | β Excellent |
Best for: Teams wanting mesh capabilities without Istio's complexity, K3s clusters with limited RAM, security-first teams, anyone who wants to "just turn it on and have it work."
9. 𧬠Cilium (eBPF-based CNI + Service Mesh) β
What it is: Cilium is fundamentally different from all others β it operates at the Linux kernel level using eBPF (extended Berkeley Packet Filter), replacing traditional iptables networking entirely. It serves as both a CNI (network plugin) and optionally a service mesh.
Architecture:
[Cilium Operator] + [Cilium Agent DaemonSet]
β Programs eBPF maps
βΌ
[Linux Kernel - eBPF programs]
βββ XDP (eXpress Data Path): packet filtering at NIC level
βββ TC (Traffic Control): L3/L4 policy enforcement
βββ Socket: L7 visibility (HTTP, gRPC, Kafka, DNS)
β
[Hubble Observability Layer]
βββ hubble-relay
βββ hubble-ui (real-time network flow visualization)Key features:
- eBPF-powered networking: bypasses kernel overhead, hardware-speed L4
- No iptables β replaces kube-proxy entirely
- Deep observability via Hubble (DNS, HTTP, gRPC, Kafka at kernel level)
- Network policies at L3/L4/L7 in a single CRD
- WireGuard/IPsec transparent encryption
- Service mesh in per-node Envoy model (not sidecar-per-pod)
- Excellent for multi-cluster with Cluster Mesh
K3s installation:
bash
# Disable K3s's default flannel (Cilium replaces it)
curl -sfL https://get.k3s.io | sh -s - \
--flannel-backend=none \
--disable-network-policy \
--disable servicelb
# Install Cilium
helm repo add cilium https://helm.cilium.io/
helm install cilium cilium/cilium \
--namespace kube-system \
--set operator.replicas=1 \
--set kubeProxyReplacement=true \
--set k8sServiceHost=<K3S_SERVER_IP> \
--set k8sServicePort=6443
# Enable Hubble
cilium hubble enable --uiL4 performance: Cilium's eBPF datapath is unrivaled for L4 (TCP/UDP) β limited only by hardware NIC speed. For L7 (HTTP), it offloads to per-node Envoy, which introduces some trade-offs vs. per-pod sidecar isolation.
| Feature | Rating |
|---|---|
| L4 throughput | β Best (eBPF) |
| Network observability | β Exceptional (Hubble) |
| No iptables | β kube-proxy replacement |
| Network policies | β L3/L4/L7 unified |
| Service mesh | β οΈ Per-node (not per-pod) |
| Complexity | β οΈ eBPF expertise needed |
| K3s integration | β Good (replaces flannel) |
Best for: High-performance bare-metal clusters, security-intensive environments, teams already investing in eBPF, multi-cluster deployments with Cluster Mesh.
π The Big Comparison Table β
| Tool | Type | OSI Layer | K3s Default | Auto TLS | Performance | Resource Usage | Complexity |
|---|---|---|---|---|---|---|---|
| Klipper/ServiceLB | L4 LB | L4 | β Yes | β | Low | Minimal | Minimal |
| NGINX | Ingress | L7 | β (opt-out Traefik) | β οΈ (cert-manager) | Very High | Low | Low |
| Traefik | Ingress | L7 | β Yes (bundled) | β Built-in | High | Low | Low |
| MetalLB | L4 LB | L4 | β | β | Medium | Minimal | Low |
| HAProxy | Ingress | L4+L7 | β | β οΈ (cert-manager) | Highest | Low | Medium |
| Envoy | Proxy/Mesh DP | L4+L7 | β | β (with CP) | Very High | Medium | High |
| Istio | Service Mesh | L4+L7 | β | β Auto mTLS | Medium (overhead) | Very High | Very High |
| Linkerd | Service Mesh | L4+L7 | β | β Auto mTLS | High (least overhead) | Low | Low |
| Cilium | CNI+Mesh | L3+L4+L7 | β | β (WireGuard) | Highest L4 | Medium | High |
ποΈ Architecture Patterns for K3s β
Pattern 1: Minimal (Single Node / Homelab) β
[K3s: Traefik + Klipper built-in]
β
βββ Just works. Zero extra config needed.Use when: Local dev, single-node homelab, learning Kubernetes.
Pattern 2: Bare-Metal Production (Most Common) β
[MetalLB] βββΊ External IP βββΊ [Traefik] βββΊ [Your Services]Use when: Multiple K3s nodes, need proper external IPs, keep Traefik for simplicity.
Pattern 3: High-Performance Production β
[MetalLB] βββΊ External IP βββΊ [HAProxy Ingress] βββΊ [Services]Use when: High RPS requirements, latency-sensitive APIs, financial/gaming workloads.
Pattern 4: Secure Microservices (Security-First) β
[MetalLB] βββΊ [NGINX/Traefik] βββΊ [Linkerd Mesh] βββΊ [Services]
(mTLS, observability)Use when: Multi-service architecture, compliance requirements, need service-to-service encryption.
Pattern 5: Maximum Performance + Security (Advanced) β
[Cilium CNI + kube-proxy replacement]
ββββΊ [Cilium Ingress / Envoy Gateway] βββΊ [Services]
+ Hubble for observabilityUse when: eBPF expertise available, need kernel-level performance, security-intensive platform.
ποΈ Performance Benchmarks at a Glance β
Based on published benchmarks and production data (2024β2026):
Requests per Second (RPS) at typical K8s ingress workload:
HAProxy ββββββββββββββββββββββββββββ 42,000 RPS (50% CPU)
Envoy βββββββββββββββββββββββββββ 38,000 RPS (73% CPU)
NGINX ββββββββββββββββββββββββββ 35,000 RPS (65% CPU)
Traefik βββββββββββββ 19,000 RPS (45% CPU)
Service Mesh Overhead (vs no mesh):
Linkerd ββ 5β10% slower β Best
Cilium ββββ 20β30% slower
Istio βββββ 25β35% slower
L4 Raw Throughput:
Cilium (eBPF) ββββββββββββββββββββ Hardware-limited β Best
MetalLB (BGP) ββββββββββββββββββ Near line-rateπ― Decision Framework: Which One for Your K3s Cluster? β
START HERE
β
βΌ
Are you running a single node / homelab?
YES βββΊ Use Klipper + Traefik (K3s defaults). You're done.
NO
β
βΌ
Do you need external IPs on bare metal?
YES βββΊ Add MetalLB (disable Klipper first)
NO (cloud) βββΊ Your cloud CCM handles this
β
βΌ
Replace default Traefik ingress?
Need max performance βββΊ HAProxy Ingress
Need NGINX ecosystem βββΊ NGINX Ingress
Happy with defaults βββΊ Keep Traefik
β
βΌ
Do you have multiple microservices needing service-to-service security?
YES, want simplicity βββΊ Add Linkerd
YES, need full features βββΊ Add Istio (check your RAM budget!)
YES, eBPF expertise βββΊ Use Cilium as CNI + mesh
NO βββΊ Skip the mesh for nowπ§ K3s-Specific Tips & Gotchas β
Traefik version: K3s bundles Traefik. Pin the version in your HelmChartConfig if stability matters.
MetalLB + Traefik: A very common combo. MetalLB gives Traefik a real external IP. After MetalLB assigns an IP, Traefik's LoadBalancer service gets
EXTERNAL-IPpopulated and starts serving traffic.Cilium on K3s: You must disable flannel (
--flannel-backend=none) and network policy (--disable-network-policy). Cilium replaces both. If you also want to replace kube-proxy, add--disable-kube-proxy.Linkerd on K3s: Works out of the box. K3s's bundled components (Traefik, CoreDNS) can be meshed too β annotate the
kube-systemnamespace carefully.Resource planning: A 3-node K3s cluster with Linkerd can run comfortably on 3Γ Raspberry Pi 4 (4GB). Istio needs significantly more β budget at least 8GB per node.
Gateway API: The Kubernetes Gateway API is replacing Ingress. Traefik v3, HAProxy v3.1+, Envoy Gateway, and Cilium all support it. Consider Gateway API for new deployments.
π Final Recommendations β
| Your Situation | Recommended Stack |
|---|---|
| Homelab / learning | K3s defaults (Traefik + Klipper) |
| Bare-metal small team | MetalLB + Traefik |
| Bare-metal high traffic | MetalLB + HAProxy |
| NGINX ecosystem familiarity | MetalLB + NGINX Ingress |
| Need service mesh (simple) | MetalLB + Traefik + Linkerd |
| Need service mesh (full features) | MetalLB + Traefik + Istio (Ambient mode) |
| Max performance + security | Cilium CNI + Envoy Gateway |
| Edge/IoT K3s | Klipper + Traefik (minimal resources) |
π Further Reading β
- K3s Networking Docs
- MetalLB on K3s (SUSE Edge)
- Traefik K3s Configuration
- Linkerd Getting Started
- Cilium K3s Setup
- HAProxy Kubernetes Ingress
- Kubernetes Gateway API
Have questions about your specific K3s setup? Drop them in the comments. Running an unusual configuration (Raspberry Pi cluster, edge IoT, air-gapped)? I'd love to hear about it.
#kubernetes #k3s #devops #cloudnative #loadbalancing #traefik #nginx #metallb #linkerd #cilium
