Triển khai VXLAN với BGP EVPN trên Linux bằng FRRouting

Networking tutorial - IT technology blog
Networking tutorial - IT technology blog

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.

Share: