Phân tích cơ chế mạng Flannel trong Kubernetes

Flannel là một trong những plugin CNI phổ biến cho cụm Kubernetes, hoạt động như một mạng overlay giúp kết nối các Pod trên nhiều node khác nhau. Nó hỗ trợ nhiều backend truyền dữ liệu như VXLAN, host-gw, UDP…

Đặc điểm nổi bật của Flannel

  • Mỗi Pod trong cụm được gán một địa chỉ IP duy nhất trong không gian mạng chung.
  • Xây dựng mạng overlay — lớp mạng ảo chồng lên hạ tầng vật lý — để đóng gói và chuyển tiếp gói tin giữa các node mà không cần thay đổi cấu trúc mạng hiện có.
  • Tạo thiết bị ảo flannel0 hoặc flannel.1 (tùy backend) để xử lý việc đóng gói/giải gói, đồng thời cập nhật bảng định tuyến dựa trên thông tin từ etcd.
  • Flanneld chạy trên mỗi node, lấy về một subnet riêng từ dải IP chung của cụm, sau đó phân phối IP cho các container trong node đó.

Các thành phần chính

  • cni0: Bridge ảo, nơi các veth pair của Pod được gắn vào. Mỗi Pod có một interface eth0 kết nối với một cổng trên bridge này.
  • flannel.1: Thiết bị VXLAN dùng để đóng gói/giải gói lưu lượng giữa các node. Hoạt động như một VTEP (VXLAN Tunnel End Point).
  • flanneld: Daemon quản lý cấu hình mạng, lắng nghe sự thay đổi trong etcd để cập nhật bảng ARP/FDB và định tuyến.

Luồng dữ liệu giữa hai Pod trên hai node khác nhau

  1. Pod A gửi gói tin đến gateway mặc định (IP của cni0).
  2. cni0 chuyển gói tin sang flannel.1 dựa trên bảng định tuyến.
  3. flannel.1 tra cứu MAC đích thông qua ARP table hoặc yêu cầu flanneld nếu chưa có bản ghi.
  4. Gói tin được đóng gói VXLAN với header ngoài chứa IP của node đích, sau đó gửi qua mạng vật lý.
  5. Node đích nhận gói tin, kernel nhận diện đây là gói VXLAN → giải mã → chuyển nội dung tới flannel.1.
  6. flannel.1 tra bảng định tuyến nội bộ, chuyển gói tin tới cni0.
  7. cni0 dựa vào bảng MAC để forward gói tin đến đúng veth pair → Pod B nhận được dữ liệu.

Ví dụ thực tế với dải CIDR 172.20.0.0/16

# Trên Pod ở node 10.19.114.100
default via 172.20.0.1 dev eth0 
172.20.0.0/24 dev eth0 proto kernel scope link src 172.20.0.73

# Trên Pod ở node 10.19.114.101
default via 172.20.1.1 dev eth0 
172.20.1.0/24 dev eth0 proto kernel scope link src 172.20.1.11

Bảng định tuyến trên node:

# Node 10.19.114.100
172.20.1.0/24 via 172.20.1.0 dev flannel.1 onlink

# Node 10.19.114.101
172.20.0.0/24 via 172.20.0.0 dev flannel.1 onlink

Khi Pod 172.20.0.73 gửi dữ liệu đến 172.20.1.11:

  • flannel.1 tra ARP table để tìm MAC tương ứng với 172.20.1.0 (gateway của subnet đích).
  • Nếu không có, kernel gửi "L3 MISS" → flanneld truy vấn etcd → trả về MAC của flannel.1 trên node đích.
  • Sử dụng FDB (Forwarding Database) để xác định IP vật lý của node đích:
bridge fdb show dev flannel.1
42:6e:8b:9b:e2:73 dst 10.19.114.101 self permanent

Gói tin sau đó được đóng gói VXLAN với:

  • Outer IP: 10.19.114.100 → 10.19.114.101
  • Inner IP: 172.20.0.73 → 172.20.1.11

Trên node đích, kernel giải mã VXLAN, chuyển nội dung đến flannel.1 → cni0 → veth pair tương ứng → Pod đích.

Kiểm tra bridge để xác định veth pair tương ứng với Pod:

brctl show cni0
# Output: vethf4995a29 gắn với Pod có IP 172.20.1.11

Thẻ: Kubernetes flannel CNI vxlan overlay-network

Đăng vào ngày 7 tháng 8 lúc 15:36