Pod trong Kubernetes giống như những ngôi nhà nhỏ, và để chúng có thể trò chuyện với nhau hay với thế giới bên ngoài, mỗi ngôi nhà cần có một địa chỉ duy nhất. Quá trình cấp phát những địa chỉ IP này không hề đơn giản, nó được quản lý bởi một “nhạc trưởng” có tên là Container Network Interface (CNI). Khác với các máy ảo truyền thống, Kubernetes không tự tay cấp IP mà ủy thác hoàn toàn cho CNI.

CNI: Giao diện Kết nối Vạn Năng
Hãy hình dung CNI không phải là một giải pháp mạng cụ thể, mà là một tiêu chuẩn giao diện mở. Nó định nghĩa một bộ quy tắc và thư viện, cho phép các “plugin” mạng khác nhau có thể cắm vào và hoạt động trơn tru với Kubernetes. Nhờ vậy, Kubernetes không cần phải quan tâm đến việc mạng được xây dựng như thế nào, nó chỉ cần biết cách gọi CNI để thực hiện tác vụ.
Các CNI plugin phổ biến hiện nay bao gồm:
- Calico: Nổi tiếng với mạng hiệu suất cao, bảo mật chặt chẽ và khả năng mở rộng mạnh mẽ.
- Flannel: Đơn giản, dễ cài đặt, thường được dùng để tạo các mạng ảo (overlay network).
- Cilium: Một giải pháp tiên tiến, tập trung vào bảo mật mạng dựa trên công nghệ eBPF.
- Kube-router: Cung cấp các tính năng mạng toàn diện như định tuyến BGP, proxy dịch vụ và chính sách mạng.
Quá Trình Cấp IP cho Pod: Từng Bước Chi Tiết
Khi bạn tạo một Pod, mọi thứ diễn ra theo một kịch bản đã được định sẵn:
- Kubelet yêu cầu: Kubelet là một “người quản lý” nhỏ chạy trên mỗi node. Khi nó phát hiện một Pod mới, nó sẽ gọi CNI plugin đã được cài đặt trên node đó và nhờ nó “cắm” mạng cho Pod.
- CNI Plugin ra tay: Plugin CNI bắt đầu thực hiện nhiệm vụ:
- Tạo Giao diện Ảo: Plugin tạo ra một cặp giao diện ảo (veth pair), giống như một sợi dây cáp hai đầu. Một đầu được đưa vào bên trong Pod, đầu còn lại được nối với mạng của node.
- Cấp Phát IP: CNI plugin sẽ gọi một plugin nhỏ hơn gọi là IPAM (IP Address Management) để lấy một địa chỉ IP duy nhất cho Pod, thường là từ dải IP đã được quy hoạch cho node.
- Thiết lập Định tuyến: Plugin cấu hình các tuyến đường (routes) cần thiết trong Pod, đảm bảo Pod biết cách gửi và nhận dữ liệu.
- Cấu hình DNS: Cuối cùng, thông tin DNS được thiết lập để Pod có thể tìm thấy các dịch vụ khác trong cluster.
- Pod Sẵn sàng Giao tiếp: Sau khi hoàn tất, Pod đã có địa chỉ IP riêng và có thể giao tiếp với các Pod khác, các dịch vụ trong cluster, hoặc thậm chí là ra ngoài thế giới.
Ẩn sau Vỏ bọc: Linux Network Namespace và Veth Pair
Để hiểu sâu hơn, chúng ta cần tìm hiểu về hai khái niệm quan trọng:
- Linux network namespaces: Đây là một tính năng của nhân Linux, tạo ra một “môi trường mạng” hoàn toàn độc lập cho mỗi Pod. Mọi thứ từ giao diện mạng, bảng định tuyến, cho đến các cổng đều được cô lập.
- Veth pair: Đây là “cầu nối” giúp Pod có thể giao tiếp với mạng vật lý.
Khi Kubelet tạo một Pod, nó sẽ tạo một “pause container” để giữ network namespace chung. Sau đó, CNI plugin sẽ tạo một cặp veth, đưa một đầu vào namespace của Pod và đầu còn lại ra ngoài, thường là nối vào một cầu nối ảo (Linux bridge) trên node. Từ đây, dữ liệu của Pod có thể đi ra ngoài và giao tiếp với các Pod khác.
Hai Lối Đi cho Mạng Kubernetes: Overlay vs. Underlay
Sự khác biệt lớn nhất giữa các CNI plugin nằm ở cách chúng xử lý giao tiếp giữa các Pod trên các node khác nhau.
1. Mạng Overlay (Mạng Ảo)
- Cách hoạt động: Các plugin như Flannel (VXLAN) hay Calico (IPIP) tạo ra một “đường hầm” ảo giữa các node. Dữ liệu từ Pod được đóng gói (encapsulate) vào một gói tin IP mới và gửi qua mạng vật lý.
- Ưu điểm: Triển khai đơn giản, không cần thay đổi hạ tầng mạng vật lý hiện có.
- Nhược điểm: Có thể phát sinh một chút overhead do quá trình đóng gói và giải mã, gây ảnh hưởng nhỏ đến hiệu suất.
2. Mạng Underlay (Mạng Vật lý)
- Cách hoạt động: Các plugin như Calico (BGP) sử dụng các giao thức định tuyến như BGP để quảng bá trực tiếp dải IP của các Pod đến các router vật lý. Mạng vật lý giờ đây “biết” đường đi đến từng Pod mà không cần đóng gói.
- Ưu điểm: Hiệu suất cao hơn hẳn vì không có overhead, dễ dàng gỡ lỗi với các công cụ mạng truyền thống.
- Nhược điểm: Yêu cầu hạ tầng mạng vật lý phải được cấu hình để hỗ trợ BGP, có thể phức tạp hơn khi triển khai.
Vòng Đời IP: Cấp Phát rồi Giải Phóng
Quá trình cấp IP không chỉ là một chiều. Khi một Pod bị xóa, Kubelet sẽ gọi lại CNI plugin để dọn dẹp. CNI plugin sẽ thu hồi địa chỉ IP, gỡ bỏ các giao diện mạng và giải phóng tài nguyên. Địa chỉ IP đó sau đó sẽ được đánh dấu là “sẵn sàng” để được sử dụng lại cho các Pod mới.
Hiểu rõ cơ chế này sẽ giúp bạn không chỉ quản lý và gỡ lỗi mạng Kubernetes hiệu quả hơn mà còn đưa ra những quyết định kiến trúc sáng suốt, phù hợp với nhu cầu của hệ thống.