DNS & Ingress¶
This document covers the networking stack: Envoy Gateway, k8s-gateway, and Cilium LoadBalancer.
Overview¶
| Component | Purpose | IP/Port |
|---|---|---|
| Envoy Gateway (internal) | HTTP/HTTPS ingress for *.ragas.cc |
172.16.1.61 |
| Envoy Gateway (external) | Gateway behind Cloudflare tunnel for *.ragas.sh |
172.16.1.62 |
| Cloudflare Tunnel | Public ingress (Cloudflare → cluster) | in-cluster |
| k8s-gateway | Split-horizon DNS for ragas.cc (HTTPRoutes/Services) |
172.16.1.60:53 |
| Cilium | LoadBalancer + CNI | L2 announcements |
Traffic Flow¶
Internal (ragas.cc)¶
External (ragas.sh)¶
Envoy Gateway¶
Gateways¶
Two gateways are configured:
| Gateway | IP | Purpose |
|---|---|---|
| envoy-internal | 172.16.1.61 | Local network access |
| envoy-external | 172.16.1.62 | Public services via Cloudflare tunnel (ragas.sh) |
Creating an HTTPRoute¶
apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
name: myapp
namespace: default
spec:
parentRefs:
- name: envoy-internal
namespace: network
hostnames:
- "myapp.ragas.cc"
rules:
- backendRefs:
- name: myapp
port: 80
TLS Configuration¶
TLS is handled by cert-manager Certificates:
ragas-cc-production-tls(network):ragas.cc+*.ragas.ccragas-sh-production-tls(network):ragas.sh+*.ragas.sh
k8s-gateway (Split DNS)¶
k8s-gateway provides DNS responses for cluster services, enabling split-horizon DNS.
How It Works¶
- (Optional) AdGuard/router forwards
ragas.ccqueries to k8s-gateway (172.16.1.60) - k8s-gateway watches
HTTPRouteandServiceresources and returns the appropriate LoadBalancer IP - Client connects to the returned IP (typically
envoy-internal)
Configuration¶
Testing¶
# Query k8s-gateway directly
dig @172.16.1.60 home.ragas.cc
dig @172.16.1.60 grafana.ragas.cc
# Should return 172.16.1.61
Cilium LoadBalancer¶
Cilium provides LoadBalancer services via L2 announcements (ARP).
IP Pool¶
apiVersion: cilium.io/v2alpha1
kind: CiliumLoadBalancerIPPool
metadata:
name: pool
spec:
blocks:
- cidr: "172.16.1.0/24"
L2 Announcement Policy¶
apiVersion: cilium.io/v2alpha1
kind: CiliumL2AnnouncementPolicy
metadata:
name: l2-policy
spec:
loadBalancerIPs: true
interfaces:
- ^ens.*
Checking LoadBalancer IPs¶
# View assigned IPs
kubectl get svc -A -o wide | grep LoadBalancer
# Check Cilium service list
kubectl exec -n kube-system ds/cilium -- cilium service list
DNS Configuration¶
AdGuard Home¶
Recommended (dynamic): conditional forwarding to k8s-gateway:
Alternative (static): wildcard *.ragas.cc → 172.16.1.61 in your LAN DNS server.
Troubleshooting¶
Service Not Accessible¶
-
Check HTTPRoute exists:
-
Check gateway is programmed:
-
Test DNS resolution:
-
Test direct access:
LoadBalancer IP Not Reachable¶
- Check L2 announcement policy has correct interface
- Verify Cilium is healthy:
cilium status - Check ARP table on client machine
- Note: Ping won't work (only service ports are handled)