SiamCafe · Blog
Cilium CNI Scaling Strategy
บทความ

Cilium CNI Scaling Strategy

เผยแพร่ 28 พฤษภาคม 2569
Kubernetes

โดย อ. บอมกิตติทัศน์เจริญพนาสิทธิ์ | อัปเดต 24 ก. พ. 2026 | อ่าน 16 นาที

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

คุณสมบัติCiliumCalicoFlannelWeaveNet
Data PlaneeBPFiptables/eBPFVXLANVXLAN
Performanceดีเยี่ยมดีปานกลางปานกลาง
Network PolicyL3/L4/L7L3/L4ไม่มีL3/L4
Service Meshในตัว (Sidecar-free)ไม่มีไม่มีไม่มี
ObservabilityHubble (ดีมาก)Basicไม่มีBasic
Multi-clusterCluster MeshFederationไม่มีไม่มี
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 หลัง Upgradecilium 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

อ. บอมกิตติทัศน์เจริญพนาสิทธิ์
IT Infrastructure Expert | Thaiware Award | ประสบการณ์กว่า 25 ปี — ผู้ก่อตั้ง SiamCafe.net Since 2000-2026

Q: Cilium คืออะไร

eBPF-based CNI สำหรับ Kubernetes ทำ Networking, Security, Observability ที่ Kernel Level เร็วกว่า iptables-based CNI หลายเท่าเป็น CNCF Graduated