Hướng dẫn cấu hình Open vSwitch trên Proxmox VE: Bridge, Bond và GRE Tunnel

Virtualization tutorial - IT technology blog
Virtualization tutorial - IT technology blog

2 giờ sáng, hệ thống giám sát Zabbix bắn alert đỏ lòm: cụm 16 VM trên node Proxmox mất kết nối sau bản vá kernel. Mở console kiểm tra dmesg, Linux Bridge liên tục drop packet khi lưu lượng VLAN trunking vượt mốc 4 Gbps. Cặp bond LACP cũng chập chờn rớt link. Để xử lý dứt điểm tình trạng nghẽn cổ chai này, chuyển toàn bộ hạ tầng mạng ảo sang Open vSwitch (OVS) là giải pháp sạch sẽ nhất.

Ở homelab, mình duy trì 2 node Proxmox VE chạy song song 12 VM và container để test tải. Toàn bộ kịch bản phục hồi dưới đây đều được đúc kết từ những ca debug thực tế trước khi áp dụng lên hạ tầng production.

Quick start: Dựng OVS Bridge cứu mạng trong 5 phút

Khi switch ảo đang lỗi, đừng mất thời gian click chuột trên giao diện web GUI. Hãy mở console iLO/IPMI hoặc SSH trực tiếp vào node Proxmox để cài gói OVS:

apt-get update
apt-get install -y openvswitch-switch
systemctl enable --now openvswitch-switch

Xác nhận OVS daemon đã chạy:

ovs-vsctl show

Tạo nóng switch ảo vmbr1 rồi gán cổng vật lý eth0 vào bridge. Lệnh này có hiệu lực ngay lập tức mà không cần reboot host:

ovs-vsctl add-br vmbr1
ovs-vsctl add-port vmbr1 eth0

Để cấu hình không bị mất sau khi khởi động lại, bạn thêm khai báo vào /etc/network/interfaces:

auto vmbr1
iface vmbr1 inet manual
	ovs_type OVSBridge
	ovs_ports eth0
	ovs_extra set bridge vmbr1 stp_enable=true

iface eth0 inet manual
	ovs_type OVSPort
	ovs_bridge vmbr1

Nạp lại cấu hình mạng bằng công cụ ifupdown2:

ifreload -a

Thao tác hoàn tất. Bạn chỉ cần gán card mạng của VM sang vmbr1 là đường truyền thông suốt trở lại.

Bản chất kỹ thuật: Linux Bridge vs Open vSwitch

Linux Bridge truyền thống thường hụt hơi khi hệ thống mở rộng quy mô. Tại sao lại như vậy?

1. Cơ chế xử lý luồng gói tin

Linux Bridge hoạt động như một switch unmanaged L2 trong nhân Linux. Nó đơn giản, nhẹ và đủ dùng cho nhu cầu cơ bản. Tuy nhiên, Linux Bridge không hỗ trợ OpenFlow hay dynamic flow control. Khi lưu lượng vượt ngưỡng 5–7 Gbps với hàng chục VLAN tag khác nhau, kernel CPU softirq tăng vọt, gây hiện tượng drop packet hàng loạt.

Ngược lại, Open vSwitch vận hành như một switch SDN thực thụ. OVS xử lý flow trực tiếp tại kernel datapath với bảng cache chuyên biệt. Nhờ đó, thông lượng được duy trì ổn định kể cả khi bạn áp đặt hàng trăm rule QoS, NetFlow hoặc sFlow để giám sát lưu lượng.

2. Quản lý cổng và VLAN filtering

Với Linux Bridge, mỗi VLAN thường đòi hỏi một sub-interface riêng như eth0.10 hay eth0.20. Mô hình này rất rối khi quản lý hàng chục VM. Trong khi đó, OVS Bridge quản lý mọi interface vật lý lẫn ảo (tap/veth) dưới dạng một OVS Port duy nhất. Tính năng VLAN filtering được bật sẵn. Muốn trunking hay gán tag VLAN 20 cho VM, bạn chỉ cần cấu hình đúng một tham số tag trên Proxmox mà không phải chạm vào interface máy chủ.

Nâng cao: OVS Bond LACP và GRE Tunnel nối node

Mất một đường cáp mạng không được phép làm sập dịch vụ. Thiết lập kết hợp giữa OVS Bond và GRE Tunnel sẽ giải quyết bài toán dự phòng lẫn kết nối xuyên subnet.

1. Gộp card mạng 10Gbps với OVS Bond (LACP)

Giả sử máy chủ có 2 cổng 10GbE là enp3s0f0 và enp3s0f1 nối vào switch ToR (Top of Rack). Chúng ta sẽ gộp hai cổng này thành bond0 theo chuẩn 802.3ad.

Cấu hình trong /etc/network/interfaces như sau:

auto bond0
iface bond0 inet manual
	ovs_bridge vmbr0
	ovs_type OVSBond
	ovs_bonds enp3s0f0 enp3s0f1
	ovs_options bond_mode=balance-tcp lacp=active other_config:lacp-time=fast

auto vmbr0
iface vmbr0 inet static
	address 192.168.1.50/24
	gateway 192.168.1.1
	ovs_type OVSBridge
	ovs_ports bond0

Sau khi chạy ifreload -a, kiểm tra tình trạng đàm phán LACP:

ovs-appctl bond/show bond0
ovs-appctl lacp/show bond0

Nếu output hiển thị actor state: negotiated và partner state: negotiated, hai port vật lý đã bắt tay chuẩn xác với switch.

2. Dựng GRE Tunnel kết nối VM giữa 2 node khác dải IP

Tình huống thực tế: Node A mang IP 10.10.1.10, Node B mang IP 10.10.2.10, nằm cách nhau qua một router L3. Bạn cần các VM trên cả hai node thông trực tiếp tầng L2 (cùng subnet 172.16.100.0/24) mà không thể nhờ đội network cấu hình VxLAN hay kéo VLAN vật lý.

GRE Tunnel trên OVS giải quyết vấn đề này chỉ bằng 2 dòng lệnh.

Khởi tạo trên Node A (10.10.1.10):

ovs-vsctl add-br vmbr-internal
ovs-vsctl add-port vmbr-internal gre0 -- set interface gre0 type=gre options:remote_ip=10.10.2.10

Khởi tạo trên Node B (10.10.2.10):

ovs-vsctl add-br vmbr-internal
ovs-vsctl add-port vmbr-internal gre0 -- set interface gre0 type=gre options:remote_ip=10.10.1.10

Sau đó, gán card mạng của VM vào bridge vmbr-internal. Các máy ảo ở hai node lúc này ping thông nhau bình thường như đang cắm chung một switch vật lý.

Kinh nghiệm thực chiến khi vận hành OVS

  • Tránh reboot mạng bừa bãi: Tuyệt đối không dùng systemctl restart networking qua SSH. Nếu file cấu hình sai cú pháp, bạn sẽ bị ngắt kết nối ngay. Hãy dùng ifreload -a từ gói ifupdown2; công cụ này sẽ dừng lại và báo lỗi chi tiết nếu có sai sót.
  • Bẫy MTU trên GRE Tunnel: Header GRE tốn thêm 24 bytes (20 bytes IPv4 + 4 bytes GRE). Nếu card mạng vật lý để MTU 1500, gói tin 1500 bytes từ VM sẽ bị phân mảnh. Băng thông iperf3 có thể tụt từ 9.4 Gbps xuống dưới 1.5 Gbps. Cách xử lý: hạ MTU card mạng trong VM xuống 1476 (hoặc 1450), hoặc nâng MTU card vật lý của host lên 1600 (Jumbo Frames).
  • Debug gói tin với Flow Dump: Khi VM không nhận được IP từ DHCP, hãy kiểm tra gói tin có đi qua bridge hay không bằng lệnh:
ovs-dpctl dump-flows vmbr1
# Hoặc kiểm tra OpenFlow rule chi tiết:
ovs-ofctl dump-flows vmbr1

Làm chủ OVS Bridge, Bond và GRE Tunnel giúp bạn chủ động kiểm soát lưu lượng trên Proxmox VE, xử lý nhanh sự cố mạng mà không phụ thuộc hoàn toàn vào phần cứng bên ngoài.

Share: