Table of Contents
- บทนำ (Introduction)
- Cilium คืออะไร?
- ทำไม Cilium คือ CNI ที่ดีที่สุดสำหรับผมในตอนนี้ (2024)?
- ความสามารถที่น่าสนใจของ Cilium (บางส่วน)
- บทสรุป (Conclusion)
บทนำ (Introduction)
แม้ก่อนหน้าผมจะใช้ Cilium ในงานเล็ก ๆ มาบ้าง แต่ช่วงวันหยุดที่ผ่านมาผมสละเวลาส่วนตัวกว่า 22+ ชั่วโมงไปกับการทำ 17 hand-on labs และ exams ของเค้า (ช้าหน่อยเพราะผม note ทุกอย่างไว้ทั้งหมด)
และนี่คือ 18 badges ที่ผมได้มาครับ 😎 (เดี๋ยวจะเลือกหัวข้อทำให้ครบ 20 ไปเลย 😂)
แน่นอนว่าบทความนี้ไม่มีอะไรมากกว่าไปกว่าการแนะนำ(อวย) Cilium ครับ 😂
Cilium คืออะไร?
-
Cilium เป็น open source ที่เข้ามาทำเรื่อง networking, security และ observability บน Kubernetes
-
ตัวมันเป็น Kubernetes CNI แต่ขณะเดียวกันก็มีความสามารถบางอย่างแบบ service mesh
-
แม้วันนี้ Cilium จะยังไม่เก่งเท่า service mesh ก็ตาม แต่ในมุมของผู้ใช้งานผมว่ามันสะดวกกว่า
-
Cilium ใช้เทคโนโลยี eBPF (Extended Berkeley Packet Filter) ซึ่งทำให้มีข้อได้เปรียบกว่า legacy CNI ตัวอื่น
-
จุดที่น่าสนใจคือความสามารถที่ Cilium ทำได้นั้นเก่งกาจเกิน CNI ตัวอื่นไปพอสมควร
-
เก่งจน Cisco ตัวพ่อวงการ network ต้องซื้อไปเข้าใต้ร่มเงา
-
ดูข้อมูลเพิ่มเติมได้ที่นี่ครับ https://cilium.io
ทำไม Cilium คือ CNI ที่ดีที่สุดสำหรับผมในตอนนี้ (2024)?
- Cilium คือ Kubernetes CNI ที่เก่งที่สุดในตอนนี้ และมีแนวโน้มที่จะมาทดแทนการใช้ service mesh ได้ในอนาคต
- เป็น open source ที่ support หลาย Kubernetes platform ทำให้ไม่ติดเรื่อง vendor/platform lock-in
- มี enterprise version ให้เลือกใช้สำหรับองค์กรที่ต้องการ support และฟีเจอร์ระดับสูงขึ้น
- การใช้ eBPF มีข้อดีหลายอย่าง เช่น
- Cilium ไม่ต้องพึ่งพา kube-proxy กับ iptables หรือ IPVS อีกต่อไป ทำให้ performance ดีขึ้น
- การทำ observability ง่ายและลึกขึ้น มีตัวช่วยอย่าง Hubble ที่ integrate เข้ากับ stack ยอดนิยมได้
- Envoy บน Cilium เป็น sidecarless คือไม่มี sidecar ใน application pods อีกต่อไป
- โดยภาพรวมมีศักยภาพที่จะใช้เป็น CNI หลักเพื่อรองรับความต้องการในระยะยาว เช่น การทำ hybrid หรือ multi-cloud, การจัดการ networking หรือ security ที่ซับซ้อน
- อย่าลืมว่าการ migrate CNI ไม่ใช่งานง่าย ดังนั้นการใช้ CNI ที่มีความสามารถครอบคลุมและมีอนาคตไว้แต่แรกอาจเป็นทางเลือกที่ดีกว่า
ความสามารถที่น่าสนใจของ Cilium (บางส่วน)
1) Cluster Mesh
-
เชื่อมต่อ Kubernetes หลาย clusters เข้าด้วยกัน โดยสามารถเข้าถึง service ข้าม cluster ได้ เช่น service ใน cluster A สามารถให้ pod ใน cluster B เรียกใช้งานได้
-
แน่นอนว่าสามารถเชื่อมต่อกันข้าม cloud providers ได้เพื่อช่วยเรื่องของ high availability (HA)
-
สามารถกำหนด multi-cluster network policy ให้เป็นมาตรฐานเดียวกันทุก clusters ได้
-
เหมาะกับการสร้าง shared service โดยกำหนด cluster กลางให้ expose service ออกไปให้ clusters อื่น ๆ ใช้งานได้
2) Multi-Networking
- ทำให้ pod หนึ่งตัวสามารถอยู่ในหลาย networks ได้ และสามารถทำ network policy แยกกันได้ด้วย
- ใช้แบ่ง network (segmentation) ตาม security zone เช่น แยก network สำหรับ frontend กับ backend
- ใช้ในกรณีที่ต้องการแยก network ของ tenant ออกจากกัน โดยแต่ละ pod สามารถเชื่อมต่อกับหลาย networks ได้
- หรือใช้กำหนดให้ traffic ไหลผ่าน services ต่าง ๆ ตามลำดับเพื่อให้ส่ง traffic ไปตาม service chain ได้
3) Egress Gateway
- เราสามารถกำหนดได้ว่า traffic จาก pods จะออกจาก Kubernetes node ไหน
- โดยจะทำ source NAT ที่ node นั้นเพื่อใช้ IP ของ node ในการออกไปข้างนอก
- ทำให้การ configure rules บน traditional firewall ทำได้ง่ายและเฉพาะเจาะจงได้มากขึ้น
- ช่วยในการ migration โดยย้าย legacy applications มาไว้บน Kubernetes โดยใช้ IP เดิม
- ช่วยในการควบคุม routing ว่า services กลุ่มไหนควรจะต้องวิ่งไป path ใด
- หรือช่วยให้การ analyze logs ต่าง ๆ ง่ายขึ้นเพราะกำหนด egress node (IP) เอาไว้ชัดเจน
4) L7 Network Policy และ Host Firewall
- ปกติ Kubernetes network policy จะทำงานอยู่ในระดับ layer 3/4 นั่นคือระดับ IP และ port
- ซึ่งเราจะทำแบบนี้ไม่ได้ เช่น ต้องการกำหนด egress rule เพื่อให้ pod วิ่งไปเฉพาะ…
- FQDN ที่
nopnithi.com
เท่านั้น - หรือ HTTP path เป็น
/blog
เท่านั้น - หรือกำหนด protocol ในระดับ layer 7 เช่น ใช้ Kafka หรือ gRPC เท่านั้น
- FQDN ที่
- แต่ Cilium Network Policy (CNP) สามารถทำได้สบายมาก และทำได้ในหลายระดับด้วย
- กำหนด network policy ระดับ pod
- กำหนด network policy ระดับ node (หรือหลาย nodes)
- กำหนด network policy ระดับ cluster (หรือหลาย clusters)
- เช่น ผมไม่ต้องการให้ใคร SSH เข้ามาที่ Kubernetes node จาก network ข้างนอก แต่ภายใน cluster สามารถทำได้
- หรือช่วยป้องกันการติดต่อกับ destination ที่ไม่พึงประสงค์อื่น ๆ โดยจำกัด traffic ที่ออกจาก nodes ทั้งหมด
5) BGP Routing
- หัวข้อนี้ใครที่เป็นสาย network (มาก่อนแบบผม)น่าจะเห็นภาพมากขึ้น
- BGP (Border Gateway Protocol) ก็คือ routing protocol ตัวหนึ่งซึ่งใช้ในการแลกเปลี่ยน routes กัน
- Cilium ช่วยให้เราใช้ BGP แลกเปลี่ยน pod routes ระหว่าง Kubernetes cluster กับ datacenter ที่เป็น traditional network ได้
- ใช้ BGP ช่วยประกาศ
LoadBalancer
service IPs เพื่อให้สามารถเข้าถึงจากนอก cluster ได้ - ทำให้ pod ใน cluster A สามารถส่ง traffic หา cluster B หรือไปถึง on-premise ผ่าน IP core ได้
6) Load Balancer IPAM
- ปกติ Kubernetes
LoadBalancer
Service เราจะต้อง allocate IP ให้มันด้วย - ซึ่งบน cloud provider จะมี controller จัดการให้ แต่บน bare-metal cluster เราต้องจัดการเอง
- โดยเราอาจจะใช้ MetalLB ช่วย แต่หากใช้ Cilium มันก็จะจัดการให้จบได้ในตัว CNI
- Cilium สามารถสร้าง IP pools แล้วให้ services เลือกใช้ pools ต่าง ๆ ได้ตามต้องการ
- แยกตาม namespace ได้ เป็นการทำ multi-tenancy
- หรือจะระบุ IP แบบเฉพาะเจาะจงให้กับ service ก็ได้เช่นกัน
- หลังจาก allocate IP ให้ service แล้วมันจะ advertise IP นั้นผ่่าน layer 2 (ARP) หรือ BGP ได้
7) Transparent Encryption ด้วย IPSec หรือ WireGuard
- ทำ encryption ในระดับ layer 3 (network) ระหว่าง pod-pod หรือ node-node ได้ง่ายมาก
- โดย support ทั้งการใช้ IPSec และ WireGuard
- ฝั่ง application ไม่ต้องทำอะไรทั้งนั้น เพราะ Cilium จะไปจัดการข้างหลังให้ทั้งหมด
8) Mutual Authentication (mTLS)
- mTLS คือการทำ handshake ระหว่าง services เพื่อการยืนยันตัวตน (authentication) ก่อนส่งข้อมูล
- Cilium ช่วยให้การทำ mutual authentication นั้นง่ายมาก โดยกำหนดที่ Cilium network policy แค่ 2 บรรทัด
- เช่นกัน ฝั่ง application ไม่ต้องทำอะไรทั้งนั้น เพราะ Cilium จะไปจัดการข้างหลังให้ทั้งหมด
9) Gateway API
- ใครยังไม่รู้จัก Kubernetes Gateway API ให้ตามไปอ่านก่อนได้เลย
- นี่ไม่ใช่ความสามารถพิเศษอะไร แค่จะบอกว่า Cilium ก็เป็นหนึ่งในคนที่ทำ Gateway API controller ด้วยเช่นกัน
- ที่จริงเค้าก็มี Ingress controller ด้วยเหมือนกัน แต่ผมไม่ได้กล่าวถึงเพราะเราควรบอกลา Ingress กันได้แล้ว
10) DeamonSet สำหรับ Envoy และ L7 Load Balancing
-
ตัว Cilium เองจะจัดการ network ในระดับ layer 3/4 ส่วน layer 7 จะใช้ Envoy เข้ามาช่วย
-
แต่เราไม่ต้องทำอะไร มันจะจัดการ Envoy ให้ทั้งหมด (เราจัดการผ่าน Cilium CRD อีกที)
-
Cilium แยก Envoy มาจาก agent pod ทำให้จัดการแยกส่วนกันโดยไม่กระทบ traffic และไม่ต้องยุ่งกับ pod ของ application
-
Envoy เข้ามาช่วยให้ Cilium มีความสามารถคล้าย service mesh (แต่ยังไม่เก่งเท่า ณ ตอนนี้) เช่น
- การทำ L7 load balancing บน gRPC protocol
- การทำ curcuit breaker
- และอื่น ๆ อีกเพียบ (อยู่บน gateway API ก็เยอะนะครับ)
บทสรุป (Conclusion)
Cilium คือหนึ่งใน Kubernetes CNI ที่ดีที่สุดและครอบคลุมที่สุดในปัจจุบัน ด้วยเทคโนโลยีใหม่อย่าง eBPF, ความสามารถมากมายที่ตอบโจทย์ยุค cloud native และ multi-cloud ทำให้การจัดการ networking, security และ observability เป็นเรื่องง่ายและมีประสิทธิภาพมากขึ้น หากใครกำลังมองหา CNI ตัวหลักในระยะยาวที่รองรับการทำงานหลาย platform ผมมองว่า Cilium คือตัวเลือกอันดับต้น ๆ
Cilium ยังมีความสามารถอีกเพียบที่ผมไม่ได้กล่าวถึงและจะถูกเพิ่มเติมเข้ามาในอนาคต รวมถึงการใช้งานร่วมกับ tools อย่าง Hubble และ Tetragon ด้วย เอาเป็นว่าถ้ามีเวลาอยากให้ไปลองด้วยตัวเองครับ