Khi Docker Bridge chạm ngưỡng giới hạn
Hầu hết các đội ngũ bắt đầu với Docker bridge mặc định. Nó tiện lợi và có thể sử dụng ngay. Tuy nhiên, sự tiện lợi này đi kèm với một chi phí ẩn: gánh nặng NAT. Các bridge tiêu chuẩn sử dụng iptables và Network Address Translation (NAT) để điều phối lưu lượng. Quá trình này tiêu tốn chu kỳ CPU và làm tăng độ trễ đáng kể.
Năm ngoái, đội ngũ chúng tôi đối mặt với một cuộc khủng hoảng. Cụm VOIP của chúng tôi, xử lý hơn 50.000 luồng G.711 đồng thời, bắt đầu bị rớt gói tin. Chúng tôi đã truy vết điểm nghẽn nằm ở driver bridge. Nó tiêu thụ tới 15% tổng CPU chỉ để biên dịch gói tin. Chúng tôi cần một cách để các container truy cập trực tiếp vào mạng vật lý. Bằng cách chuyển sang Macvlan và Ipvlan, chúng tôi đã loại bỏ thành phần trung gian và khôi phục sự ổn định cho các dịch vụ streaming.
Lựa chọn Network Driver phù hợp
Cả Macvlan và Ipvlan đều kết nối container trực tiếp với giao diện vật lý của bạn. Chúng bỏ qua hoàn toàn bridge của máy chủ (host). Tuy nhiên, cách chúng xử lý địa chỉ phần cứng rất khác nhau. Việc chọn sai driver có thể làm treo switch mạng hoặc chặn kết nối của các container.
Macvlan: Mỗi Container một địa chỉ MAC
Hãy coi Macvlan như một bộ chia ảo cho cáp Ethernet của bạn. Nó gán một địa chỉ MAC duy nhất, giống như phần cứng, cho mỗi container. Đối với switch vật lý, mỗi container trông như một máy chủ riêng biệt được cắm vào cổng. Điều này hoàn hảo cho các ứng dụng cũ yêu cầu một định danh mạng riêng biệt.
Chúng tôi sử dụng Bridge mode cho hầu hết các lần triển khai. Nó cho phép các container trên cùng một máy chủ giao tiếp with nhau. Tuy nhiên, hãy cẩn thận. Nhiều switch doanh nghiệp có giới hạn “Port Security”. Nếu bạn chạy 200 container trên một máy chủ, switch có thể thấy 200 địa chỉ MAC trên một cổng và ngắt kết nối đó để ngăn chặn tấn công giả mạo (spoofing).
Ipvlan: Giải pháp cho mật độ cao
Ipvlan là câu trả lời hiện đại cho giới hạn địa chỉ MAC. Thay vì các định danh duy nhất, mọi container đều chia sẻ địa chỉ MAC vật lý của máy chủ. Nó phân biệt lưu lượng truy cập bằng địa chỉ IP ở Layer 3. Cách tiếp cận này giúp giảm tải đáng kể cho thiết bị mạng của bạn.
Ipvlan cung cấp hai chế độ chính:
- L2 (Layer 2): Nó hoạt động giống như Macvlan nhưng chia sẻ địa chỉ MAC. Nó vẫn xử lý ARP và broadcast.
- L3 (Layer 3): Chế độ này hoạt động như một bộ định tuyến (router). Nó không xử lý ARP, giúp mang lại hiệu quả cực cao cho các cụm máy chủ lớn, nơi nhiễu broadcast thường làm chậm hệ thống.
Thiết lập Macvlan
Hãy xem cấu hình thực tế cho một node cơ sở dữ liệu. Giả sử giao diện vật lý của bạn là eth0 và subnet là 192.168.1.0/24.
# Tạo mạng
docker network create -d macvlan \
--subnet=192.168.1.0/24 \
--gateway=192.168.1.1 \
-o parent=eth0 my_macvlan_net
# Chạy container với IP tĩnh
docker run -d \
--name db_node \
--network my_macvlan_net \
--ip 192.168.1.50 \
postgres:15
Container hiện đã “trực tiếp trên đường truyền”. Bạn có thể ping 192.168.1.50 từ bất kỳ thiết bị nào trong mạng văn phòng mà không cần thiết lập port forwarding.
Triển khai Ipvlan L2
Chúng tôi đã chuyển các agent giám sát sang Ipvlan để tránh làm quá tải các switch Cisco. Cấu hình gần như tương tự nhưng sử dụng driver ipvlan. Điều này giữ cho số lượng MAC ở mức chính xác là một trên mỗi máy chủ vật lý.
# Tạo mạng Ipvlan L2
docker network create -d ipvlan \
--subnet=192.168.1.0/24 \
--gateway=192.168.1.1 \
-o ipvlan_mode=l2 \
-o parent=eth0 my_ipvlan_net
# Triển khai container
docker run -d \
--network my_ipvlan_net \
--ip 192.168.1.60 \
alpine sleep infinity
Nếu bạn chạy tcpdump trên máy chủ, bạn sẽ nhận thấy rằng các gói tin từ .60 sử dụng địa chỉ MAC của máy chủ. Điều này giúp đội ngũ hạ tầng mạng giám sát hệ thống sạch sẽ hơn nhiều.
Rào cản về sự cô lập
Có một đặc điểm kỹ thuật khiến nhiều kỹ sư bất ngờ. Theo mặc định, máy chủ không thể giao tiếp với các container Macvlan hoặc Ipvlan của chính nó. Nhân Linux cô lập chúng để ngăn chặn vòng lặp lưu lượng (traffic loops). Nếu máy chủ của bạn cần truy cập container — chẳng hạn để Prometheus thu thập dữ liệu — bạn phải tạo một liên kết ảo trên chính máy chủ đó.
Sử dụng các lệnh sau để kết nối:
# Tạo sub-interface trên máy chủ
ip link add macvlan_bridge link eth0 type macvlan mode bridge
# Gán IP và kích hoạt nó
ip addr add 192.168.1.250/24 dev macvlan_bridge
ip link set macvlan_bridge up
# Định tuyến lưu lượng đến container thông qua sub-interface
ip route add 192.168.1.50 dev macvlan_bridge
Đánh giá trong thực tế Production
Sau sáu tháng vận hành thiết lập này, những cải thiện về hiệu suất là không thể phủ nhận. Độ trễ trong ứng dụng truyền dữ liệu của chúng tôi đã giảm từ 1,1ms xuống còn khoảng 0,3ms.
Nên dùng Macvlan nếu:
- Bạn cần địa chỉ MAC duy nhất cho DHCP hoặc phần mềm có bản quyền.
- Bạn đang chạy số lượng ít container (dưới 50 trên mỗi cổng).
- Bạn muốn thiết lập đơn giản nhất để hiển thị ra bên ngoài.
Nên chọn Ipvlan nếu:
- Bạn đang mở rộng lên hàng trăm container trên mỗi máy chủ.
- Switch mạng của bạn có chính sách bảo mật nghiêm ngặt về việc có nhiều địa chỉ MAC.
- Bạn đang làm việc trên các đám mây công cộng như AWS hoặc GCP, nơi các địa chỉ MAC ảo thường bị chặn.
Lời kết
Loại bỏ Docker bridge giống như việc tháo bỏ những rào cản cho mạng lưới của bạn. Mặc dù việc thiết lập ban đầu đòi hỏi nhiều kế hoạch hơn — đặc biệt là về giao tiếp với máy chủ — nhưng hiệu suất và khả năng hiển thị mang lại là hoàn toàn xứng đáng. Nếu bạn đang phải vật lộn với mức sử dụng CPU cao hoặc bảng định tuyến phức tạp, đã đến lúc đưa các container của bạn trực tiếp lên mạng vật lý.

