Bối cảnh & Lý do
Lúc này là 2:15 sáng. Máy nhắn tin của bạn réo inh ỏi với cảnh báo: Critical: Database cluster split-brain across rack 3 and rack 7. Bạn đăng nhập vào jump host, dụi mắt và lập tức nhận ra thủ phạm. Cụm cơ sở dữ liệu legacy phụ thuộc vào các địa chỉ IP gán cứng, bắt buộc phải nằm trong cùng một broadcast domain Layer 2. Một kỹ sư đã migrate hai VM replica sang các switch Top-of-Rack (ToR) leaf khác nhau, và ranh giới Layer 3 có định tuyến giữa các rack đã âm thầm cắt đứt gói tin heartbeat của cụm.
VLAN truyền thống hoàn toàn quá tải trước quy mô hiện đại. Cấu hình trunk 802.1Q qua 40 switch sẽ gây ra tình trạng mất ổn định Spanning Tree, giới hạn topo mạng ở mức 4.094 phân đoạn mạng (segment) và làm tràn các broadcast frame qua các liên kết spine. Các tunnel VXLAN point-to-point tĩnh giải quyết được giới hạn 4.000 này. Tuy nhiên, việc duy trì danh sách flood tĩnh và ánh xạ MAC từ xa thủ công trên 50 hypervisor sẽ biến mỗi lần migration máy chủ thành một thảm họa vận hành.
Ethernet VPN (EVPN) kết hợp Border Gateway Protocol (BGP) giải quyết triệt để vấn đề này. Tại đây, BGP EVPN đóng vai trò là control plane cho data plane VXLAN bên dưới. Thay vì phụ thuộc vào cơ chế broadcast flooding để định vị endpoint, các máy chủ Linux sẽ chủ động trao đổi thông tin liên kết MAC và IP thông qua các route BGP Type-2. Nếu bạn đang vận hành các bare-metal Kubernetes node, môi trường Proxmox đa người dùng (multi-tenant) hoặc private cloud, việc nắm vững kiến trúc này sẽ cứu nguy cho các ca trực on-call của bạn.
Cài đặt
Chúng ta sẽ cấu hình hai máy chủ Ubuntu 22.04 LTS: Leaf-01 và Leaf-02. Mỗi node hoạt động như một Virtual Tunnel Endpoint (VTEP). Mạng underlay kết nối chúng qua các tuyến IPv4 định tuyến tiêu chuẩn, trong khi FRRouting (FRR) phân phối dữ liệu định tuyến EVPN.
Trước tiên, hãy xác nhận rằng kernel đã nạp module VXLAN:
modprobe vxlan
lsmod | grep vxlan
Cài đặt FRRouting từ kho lưu trữ chính thức của dự án (upstream). Các package upstream cung cấp đầy đủ các tính năng EVPN address-family mới nhất mà các bản phân phối mặc định thường thiếu:
sudo apt-get update && sudo apt-get install -y curl gnupg2 lsb-release
# Thêm GPG key và repo của FRR
curl -s https://deb.frrouting.org/frr/keys.asc | sudo gpg --dearmor -o /etc/apt/trusted.gpg.d/frr.gpg
FRRVER="frr-stable"
echo "deb https://deb.frrouting.org/frr $(lsb_release -s -c) $FRRVER" | sudo tee /etc/apt/sources.list.d/frr.list
sudo apt-get update && sudo apt-get install -y frr frr-pythontools
Tiếp theo, kích hoạt daemon BGP bằng cách chỉnh sửa file /etc/frr/daemons:
sudo sed -i 's/bgpd=no/bgpd=yes/' /etc/frr/daemons
sudo systemctl restart frr
Cấu hình
1. Thiết lập mạng trên Host và Underlay
Dưới đây là mô hình lab của chúng ta: Leaf-01 sử dụng loopback IP underlay 10.0.0.1/32, trong khi Leaf-02 sử dụng 10.0.0.2/32. Cả hai host giao tiếp với nhau qua các interface vật lý (eth0). Chúng ta sẽ tạo một local bridge (br10) và liên kết nó với một interface VXLAN có VNI 10010.
Trên Leaf-01, tạo bridge và interface tunnel:
# Tạo L2 bridge
sudo ip link add br10 type bridge
sudo ip link set br10 up
# Tạo thiết bị VXLAN (VNI 10010) ánh xạ tới nguồn underlay 10.0.0.1
sudo ip link add vxlan10 type vxlan \
id 10010 \
local 10.0.0.1 \
dstport 4789 \
nolearning
# Gắn VXLAN vào bridge và bật interface lên
sudo ip link set vxlan10 master br10
sudo ip link set vxlan10 up
Hãy đặc biệt lưu ý đến cờ nolearning. Cờ này thông báo cho Linux kernel vô hiệu hóa cơ chế snooping flood-and-learn truyền thống trên data path. FRRouting sẽ đảm nhiệm việc cập nhật các địa chỉ MAC bằng cách lập trình trực tiếp vào forwarding database (FDB).
Trên Leaf-02, chạy các lệnh tương đương với IP loopback cục bộ của máy:
sudo ip link add br10 type bridge
sudo ip link set br10 up
sudo ip link add vxlan10 type vxlan \
id 10010 \
local 10.0.0.2 \
dstport 4789 \
nolearning
sudo ip link set vxlan10 master br10
sudo ip link set vxlan10 up
2. Cấu hình BGP EVPN trên FRRouting
Khởi chạy shell quản trị tương tác của FRR trên Leaf-01:
sudo vtysh
Vào chế độ cấu hình (conf t) và định nghĩa peering BGP:
router bgp 65001
bgp router-id 10.0.0.1
no bgp default ipv4-unicast
neighbor 10.0.0.2 remote-as 65002
neighbor 10.0.0.2 description Leaf-02
neighbor 10.0.0.2 update-source 10.0.0.1
address-family l2vpn evpn
neighbor 10.0.0.2 activate
advertise-all-vni
exit-address-family
exit
Chuyển sang Leaf-02, vào vtysh và cấu hình phiên làm việc đối ứng:
router bgp 65002
bgp router-id 10.0.0.2
no bgp default ipv4-unicast
neighbor 10.0.0.1 remote-as 65001
neighbor 10.0.0.1 description Leaf-01
neighbor 10.0.0.1 update-source 10.0.0.2
address-family l2vpn evpn
neighbor 10.0.0.1 activate
advertise-all-vni
exit-address-family
exit
Lưu lại các thay đổi để giữ nguyên sau khi khởi động lại bằng cách thực thi lệnh write memory trên cả hai máy.
Kiểm tra & Giám sát
Trong quá trình xử lý sự cố, việc kiểm tra có cấu trúc sẽ giúp tiết kiệm từng phút quý giá. Hãy làm theo quy trình kiểm tra 3 bước sau để xác thực trạng thái của cả control plane và data plane.
1. Kiểm tra BGP EVPN Control Plane
Chạy lệnh show bgp summary bên trong vtysh để xác nhận trạng thái phiên:
show bgp summary
Kết quả đầu ra phải hiển thị phiên đã được thiết lập (established) với các prefix EVPN đang hoạt động trong cột State/PfxRcd:
Neighbor V AS MsgRcvd MsgSent TblVer InQ OutQ Up/Down State/PfxRcd PfxSnt
10.0.0.2 4 65002 42 45 0 0 0 00:18:12 2 2
Bây giờ, hãy kiểm tra xem host cục bộ đã học được các route EVPN Type-2 (MAC/IP) nào:
show bgp l2vpn evpn
VNI 10010 #
Route Distinguisher: 10.0.0.1:2
*> [2]:[0]:[48]:[52:54:00:12:34:56]
10.0.0.2 0 32768 ?
*> [2]:[0]:[48]:[52:54:00:12:34:56]:[32]:[192.168.10.20]
10.0.0.2 0 32768 ?
2. Kiểm tra FDB của Linux Kernel
FRR phân tích các route BGP này và nạp thẳng vào forwarding database của Linux kernel. Thoát khỏi vtysh và kiểm tra các mục FDB trên Leaf-01:
bridge fdb show dev vxlan10
Tìm địa chỉ MAC đích được ánh xạ trực tiếp tới IP của VTEP từ xa:
52:54:00:12:34:56 dst 10.0.0.2 self permanent
00:00:00:00:00:00 dst 10.0.0.2 self permanent
3. Kiểm tra kết nối đầu-cuối (End-to-End)
Gắn một network namespace thử nghiệm hoặc veth interface vào br10 trên cả hai node. Gán địa chỉ 192.168.10.10/24 trên Leaf-01 và 192.168.10.20/24 trên Leaf-02. Bắt đầu lệnh ping ICMP, sau đó bắt gói tin trên transit interface:
sudo tcpdump -ni eth0 udp port 4789 -vv
Bạn sẽ thấy các gói tin UDP tiêu chuẩn trên port 4789 đóng gói các frame Layer 2 bên trong. Payload mang tag VNI 10010 bao bọc các gói tin ICMP request và reply. Cả hai host lúc này đã có thể giao tiếp qua một broadcast domain L2 hợp nhất, hoàn toàn tách biệt khỏi các giới hạn về rack vật lý và ràng buộc định tuyến spine.

