Cilium CNI Scaling Strategy

โดย อ. บอมกิตติทัศน์เจริญพนาสิทธิ์ | อัปเดต 24 ก. พ. 2026 | อ่าน 16 นาที
- eBPF คืออะไร — เทคโนโลยีเบื้องหลัง Cilium
- Cilium คืออะไร — eBPF-based CNI
- เปรียบเทียบ Cilium vs Calico vs Flannel vs WeaveNet
- ติดตั้ง Cilium บน Kubernetes
- Cilium Network Policy — L3/L4/L7
- Cilium Service Mesh — Sidecar-free
- Hubble — Network Observability
- Load Balancing ด้วย XDP
- Bandwidth Management และ QoS
- Cluster Mesh — Multi-cluster Networking
- Scaling Strategy — ออกแบบให้รองรับ 10,000+ Pods
- Performance Tuning
- Troubleshooting
- Best Practices และสรุป
eBPF คืออะไร — เทคโนโลยีเบื้องหลัง Cilium
eBPF (extended Berkeley Packet Filter) เป็นเทคโนโลยีที่เปลี่ยนวิธีคิดเรื่อง Linux Kernel Programming ให้รัน Custom Program ใน Kernel Space ได้โดยไม่ต้อง Recompile Kernel หรือโหลด Kernel Module Program ถูกตรวจสอบโดย eBPF Verifier ก่อนรันจึงปลอดภัยและ Stable
eBPF ถูกใช้ใน 3 ด้านหลัก Networking จัดการ Packet ที่ Kernel Level เร็วกว่า iptables (Cilium, Cloudflare), Security ตรวจจับ System Call ที่ผิดปกติ (Falco, Tetragon) และ Observability ดึง Metrics/Traces จาก Kernel (Pixie, Hubble) โดยไม่กระทบ Performance ของ Application
Cilium คืออะไร — eBPF-based CNI
Cilium เป็น CNI (Container Network Interface) Plugin สำหรับ Kubernetes ที่ใช้ eBPF เป็น Data Plane แทน iptables แบบเดิมเป็น CNCF Graduated Project (2024) ถูกใช้โดย Google GKE, AWS EKS, Azure AKS เป็น Default CNI และบริษัทใหญ่อีกมาก
Cilium ทำ 4 อย่างหลัก Networking Pod-to-Pod, Service Load Balancing, Multi-cluster, Security Network Policy ระดับ L3/L4/L7 (DNS, HTTP, gRPC), Observability Hubble แสดง Flow Log, Service Map, DNS Query แบบ Real-time และ Service Mesh mTLS, Traffic Management แบบ Sidecar-free ไม่ต้อง Inject Sidecar Container
เปรียบเทียบ Cilium vs Calico vs Flannel vs WeaveNet
| คุณสมบัติ | Cilium | Calico | Flannel | WeaveNet |
|---|---|---|---|---|
| Data Plane | eBPF | iptables/eBPF | VXLAN | VXLAN |
| Performance | ดีเยี่ยม | ดี | ปานกลาง | ปานกลาง |
| Network Policy | L3/L4/L7 | L3/L4 | ไม่มี | L3/L4 |
| Service Mesh | ในตัว (Sidecar-free) | ไม่มี | ไม่มี | ไม่มี |
| Observability | Hubble (ดีมาก) | Basic | ไม่มี | Basic |
| Multi-cluster | Cluster Mesh | Federation | ไม่มี | ไม่มี |
| Complexity | สูง | ปานกลาง | ต่ำ | ต่ำ |
ติดตั้ง Cilium บน Kubernetes
# ติดตั้ง Cilium CLI
CILIUM_CLI_VERSION=$(curl -s https://raw.githubusercontent.com/cilium/cilium-cli/main/stable.txt)
curl -L --fail --remote-name-all \
https://github.com/cilium/cilium-cli/releases/download//cilium-linux-amd64.tar.gz
sudo tar xzvfC cilium-linux-amd64.tar.gz /usr/local/bin
# ติดตั้ง Cilium บน Cluster
cilium install --version 1.16
# ตรวจสอบ Status
cilium status --wait
# เปิด Hubble (Observability)
cilium hubble enable --ui
# ทดสอบ Connectivity
cilium connectivity test
Cilium Network Policy — L3/L4/L7
# L3/L4 Policy — อนุญาตเฉพาะ Port 80 จาก Frontend
apiVersion: cilium.io/v2
kind: CiliumNetworkPolicy
metadata:
name: allow-frontend-to-api
spec:
endpointSelector:
matchLabels:
app: api
ingress:
- fromEndpoints:
- matchLabels:
app: frontend
toPorts:
- ports:
- port: "80"
protocol: TCP
---
# L7 Policy — อนุญาตเฉพาะ GET /api/products
apiVersion: cilium.io/v2
kind: CiliumNetworkPolicy
metadata:
name: allow-get-products
spec:
endpointSelector:
matchLabels:
app: api
ingress:
- fromEndpoints:
- matchLabels:
app: frontend
toPorts:
- ports:
- port: "80"
rules:
http:
- method: GET
path: "/api/products"
---
# DNS Policy — อนุญาตเฉพาะ DNS ที่กำหนด
apiVersion: cilium.io/v2
kind: CiliumNetworkPolicy
metadata:
name: allow-external-api
spec:
endpointSelector:
matchLabels:
app: backend
egress:
- toFQDNs:
- matchName: "api.stripe.com"
- matchName: "api.sendgrid.com"
toPorts:
- ports:
- port: "443"
Cilium Service Mesh — Sidecar-free
Cilium Service Mesh ใช้ eBPF ทำ mTLS, Traffic Management, Observability โดยไม่ต้อง Inject Sidecar Container เหมือน Istio ลด Resource Overhead (ไม่มี Sidecar = ไม่มี CPU/Memory เพิ่ม), ลด Latency (ไม่ต้องผ่าน Proxy), ลด Complexity (ไม่ต้องจัดการ Sidecar Injection)
# เปิด Service Mesh
cilium install --set kubeProxyReplacement=true \
--set ingressController.enabled=true \
--set envoy.enabled=true
# Ingress Controller (แทน Nginx Ingress)
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: my-api
annotations:
ingress.cilium.io/loadbalancer-mode: shared
spec:
ingressClassName: cilium
rules:
- host: api.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: api-service
port:
number: 80
Hubble — Network Observability
# ดู Flow Log แบบ Real-time
hubble observe --namespace production
# Filter เฉพาะ Dropped Traffic
hubble observe --verdict DROPPED
# Filter เฉพาะ DNS
hubble observe --protocol DNS
# Filter เฉพาะ HTTP 5xx
hubble observe --http-status-code 500-599
# เปิด Hubble UI
cilium hubble enable --ui
kubectl port-forward -n kube-system svc/hubble-ui 12000:80
# เปิด http://localhost:12000 ดู Service Map
Hubble UI แสดง Service Dependency Map แบบ Real-time เห็นว่า Service ไหนเรียก Service ไหนผ่าน Protocol อะไร Latency เท่าไรมี Error Rate กี่เปอร์เซ็นต์ช่วย Debug Network Issue ได้อย่างรวดเร็ว
Load Balancing ด้วย XDP
Cilium ใช้ XDP (eXpress Data Path) สำหรับ Load Balancing ที่ NIC Driver Level เร็วกว่า kube-proxy (iptables) 10 เท่าเพราะจัดการ Packet ก่อนเข้า Kernel Network Stack
# เปิด kube-proxy Replacement
cilium install \
--set kubeProxyReplacement=true \
--set loadBalancer.acceleration=native \
--set loadBalancer.mode=dsr \
--set bpf.masquerade=true
# ตรวจสอบ
cilium status | grep KubeProxyReplacement
# KubeProxyReplacement: True [eth0 (Direct Routing)]
# DSR (Direct Server Return) — Response ไม่ผ่าน LB กลับ
# ลด Latency และ Load บน LB Node
Bandwidth Management และ QoS
# จำกัด Bandwidth ต่อ Pod
apiVersion: v1
kind: Pod
metadata:
name: bandwidth-limited
annotations:
kubernetes.io/egress-bandwidth: "10M"
kubernetes.io/ingress-bandwidth: "20M"
spec:
containers:
- name: app
image: nginx
Cluster Mesh — Multi-cluster Networking
Cilium Cluster Mesh เชื่อม Kubernetes Cluster หลายตัวให้ Pod สื่อสารข้าม Cluster ได้โดยตรงเหมือนอยู่ Cluster เดียวกันเหมาะกับ Multi-region, Disaster Recovery, Hybrid Cloud
# เปิด Cluster Mesh บน Cluster 1
cilium clustermesh enable --context cluster1
# เปิด Cluster Mesh บน Cluster 2
cilium clustermesh enable --context cluster2
# เชื่อม 2 Cluster
cilium clustermesh connect --context cluster1 --destination-context cluster2
# ตรวจสอบ
cilium clustermesh status --context cluster1
# Global Service — Service ที่ Load Balance ข้าม Cluster
apiVersion: v1
kind: Service
metadata:
name: api-service
annotations:
service.cilium.io/global: "true"
service.cilium.io/shared: "true"
Scaling Strategy — ออกแบบให้รองรับ 10,000+ Pods
- ใช้ Direct Routing แทน VXLAN — ลด Encapsulation Overhead ให้ Throughput สูงขึ้น 15-20% ต้องมี L2 Connectivity ระหว่าง Node
- เปิด BPF Host Routing — ข้าม Kernel Network Stack ไปเลยลด Latency 10-15%
- ใช้ XDP Acceleration — Load Balancing ที่ NIC Level เร็วกว่า iptables 10 เท่า
- Tune eBPF Map Size — เพิ่มขนาด Map สำหรับ Cluster ใหญ่
--set bpf.mapDynamicSizeRatio=0.0025 - ใช้ IPv6 Native — ลด NAT Overhead ไม่ต้อง Masquerade
- Separate Control Plane Network — แยก Network สำหรับ Cilium Agent Communication
- Hubble Sampling — ตั้ง Sampling Rate ไม่ Observe ทุก Packet สำหรับ Cluster ใหญ่
- Cilium Operator HA — รัน Operator 2+ Replica สำหรับ Production
# Production Helm Values สำหรับ Large Cluster
cilium install \
--set kubeProxyReplacement=true \
--set routingMode=native \
--set ipv4NativeRoutingCIDR=10.0.0.0/8 \
--set bpf.masquerade=true \
--set bpf.hostLegacyRouting=false \
--set loadBalancer.acceleration=native \
--set loadBalancer.mode=dsr \
--set hubble.enabled=true \
--set hubble.metrics.enableOpenMetrics=true \
--set operator.replicas=2 \
--set ipam.mode=kubernetes
Performance Tuning
- MTU ให้ถูกต้อง — ตั้ง MTU ตาม Network (1500 สำหรับ Ethernet, 9000 สำหรับ Jumbo Frame, ลด 50 สำหรับ VXLAN)
- CPU Pinning — Pin Cilium Agent ไว้ที่ CPU Core เฉพาะสำหรับ Cluster ใหญ่
- Memory Limit — เพิ่ม Memory Limit ของ Cilium Agent สำหรับ Cluster ที่มี Policy จำนวนมาก
- Disable Unused Features — ปิดฟีเจอร์ที่ไม่ใช้เช่นถ้าไม่ใช้ Service Mesh ก็ปิด Envoy
Troubleshooting
# ตรวจ Cilium Agent Status
cilium status
cilium-dbg status --verbose
# ดู Endpoint (Pod) Status
cilium-dbg endpoint list
# ตรวจ BPF Program
cilium-dbg bpf lb list
cilium-dbg bpf ct list global
# ดู Policy ที่ Apply อยู่
cilium-dbg policy get
# Monitor Dropped Packets
cilium-dbg monitor --type drop
# Connectivity Test
cilium connectivity test
Best Practices และสรุป
- ใช้ Cilium แทน kube-proxy — kubeProxyReplacement=true ลด Resource และเพิ่ม Performance
- เปิด Hubble — Network Observability เป็นสิ่งจำเป็นสำหรับ Production
- ใช้ L7 Network Policy — ไม่แค่ Block Port แต่ Block ถึง HTTP Method/Path
- ใช้ DNS-based Policy — สำหรับ Egress ไป External Service กำหนดด้วย FQDN
- ใช้ Direct Routing สำหรับ Performance — ถ้า Network รองรับ
- Monitor eBPF Map Usage — ถ้า Map เต็มจะ Drop Packet
- Test Connectivity หลัง Upgrade —
cilium connectivity testทุกครั้ง - ใช้ Cluster Mesh สำหรับ Multi-cluster — ไม่ต้อง Expose Service ผ่าน Internet
Cilium เป็น CNI ที่ทรงพลังที่สุดสำหรับ Kubernetes ในปี 2026 ด้วย eBPF ที่ทำ Networking, Security และ Observability ที่ Kernel Level ให้ Performance ดีกว่า CNI แบบเดิมหลายเท่าเมื่อรวมกับ Scaling Strategy ที่เหมาะสมจะรองรับ Cluster ขนาดใหญ่ได้อย่างมั่นใจติดตามบทความใหม่ๆได้ที่ SiamCafe.net
Q: Cilium คืออะไร
eBPF-based CNI สำหรับ Kubernetes ทำ Networking, Security, Observability ที่ Kernel Level เร็วกว่า iptables-based CNI หลายเท่าเป็น CNCF Graduated