- Docker và Kubernetes networking thực ra chỉ là tự động hóa 4 primitive của Linux: network namespace, veth pair, bridge, và iptables NAT.
- Tutorial của iximiuz Labs cho bạn tự tay dựng lại toàn bộ stack từ đầu - không cần code, chỉ cần lệnh ip và iptables.
- Sau bài này, lỗi mạng container sẽ không còn scary nữa.
TL;DR
Docker và Kubernetes networking trông như ma thuật - nhưng thực ra chỉ là 4 thứ rất cụ thể của Linux kết hợp lại: network namespace, veth pair, Linux bridge, và iptables NAT. Tutorial Container Networking From Scratch của Ivan Velichko (iximiuz Labs, cập nhật Jan 2025) cho bạn tự dựng lại toàn bộ stack từ một network namespace trống - không cần code, chỉ cần lệnh ip và iptables.

Tại sao networking container gây khó chịu
Bạn chạy docker run -p 8080:80 nginx và nó hoạt động. Nhưng khi container không kết nối được internet, hoặc hai pod trong Kubernetes không ping được nhau, bạn không biết bắt đầu debug từ đâu. Lý do: bạn đang dùng abstraction mà không biết nó xây trên cái gì.
Linux có 7 loại namespace để cô lập tài nguyên hệ điều hành (Cgroup, IPC, Network, Mount, PID, User, UTS). Container chỉ dùng Network namespace để cô lập mạng - mỗi namespace có stack mạng riêng hoàn toàn: interfaces, routing table, firewall rules, sockets.
4 viên gạch chính
Tutorial xây từng lớp, mỗi lớp giải quyết một vấn đề cụ thể:
- Network namespace (
netns): tạo môi trường mạng cô lập cho mỗi container. Lệnh:ip netns add netns0. Chạy lệnh bên trong:ip netns exec netns0 ip addr. - veth pair: cáp ảo nối namespace vào host. Lệnh:
ip link add veth0 type veth peer name ceth0, rồiip link set ceth0 netns netns0. Packet gửi từ một đầu lập tức xuất hiện ở đầu kia. - Linux bridge: switch ảo L2 kết nối N container thành một segment. Lệnh:
ip link add br0 type bridge+ip link set veth0 master br0. Bridge không quan tâm IP, chỉ forward theo MAC address - đó là lý do nó hoạt động ở Layer 2. - iptables NAT: hai bước để container ra internet: (1) bật IP forwarding:
sysctl -w net.ipv4.ip_forward=1; (2) MASQUERADE outbound:iptables -t nat -A POSTROUTING -s 172.18.0.0/16 ! -o br0 -j MASQUERADE. Để publish port: thêm DNAT rule vào PREROUTING chain.
Docker và Kubernetes thực sự làm gì
Khi bạn hiểu 4 primitive trên, Docker và Kubernetes trở nên rất rõ ràng:
| Hành động | Docker / K8s làm gì thực sự |
|---|---|
docker run | Tạo network namespace + veth pair + gắn vào bridge docker0 |
-p 8080:80 | Inject DNAT rule vào iptables chain DOCKER |
--network host | Bỏ qua namespace - container dùng root network namespace của host |
| K8s Service (ClusterIP) | kube-proxy tạo iptables chains KUBE-SERVICES + load balancing với --probability 0.33 |
| K8s CNI (Calico/Flannel) | Tự động wiring veth + namespace cho mỗi Pod theo spec CNI |
Docker overlay network (Swarm) dùng VXLAN encapsulation trên UDP port 4789 để tunnel traffic qua nhiều host. Kubernetes với Calico translate NetworkPolicy YAML thành iptables chains cali-from-<pod> / cali-to-<pod> ở kernel level.
Ai nên học ngay
Tutorial này dành cho bạn nếu bạn thuộc một trong ba nhóm:
- DevOps/SRE đang debug network issues và chỉ biết restart pod hy vọng nó tự fix.
- Developer muốn hiểu tại sao
docker-composehoạt động hay tại sao pod A không reach được pod B. - Platform engineer cần chọn CNI plugin (Calico vs Cilium vs Flannel) và muốn biết thực sự chúng khác nhau ở điểm nào.
Một use case cực kỳ thực tế từ series: bạn quên expose port cho container Java đang chạy (mất 10 phút để start), không muốn restart. Giải pháp: spin up một proxy container nhỏ trong cùng network namespace và publish port từ container đó - không cần restart, không mất state.
Khởi đầu thế nào
Tutorial hoàn toàn miễn phí trên iximiuz Labs, có sandbox browser-based (disposable, không sợ break host), tested trên Ubuntu 22.04. Yêu cầu: Linux 4.x+, root/sudo, biết cơ bản CLI và networking (IP, routing, NAT). Không cần code, không cần setup local.
Một điểm hay: khi cluster Kubernetes vượt 10.000 services, iptables bắt đầu giảm hiệu suất đáng kể. Biết được điều này, bạn sẽ biết khi nào cần chuyển kube-proxy sang IPVS mode. Đây là loại kiến thức chỉ có được khi hiểu từ lớp kernel, không phải từ docs chính thức.
Sau tutorial cơ bản này, series "Mastering Container Networking" của Ivan đi tiếp vào: port publishing internals (Docker Engine vs containerd vs nerdctl), sidecar proxy pattern, service discovery trong Kubernetes, và Traefik canary deployments với weighted load balancing.
Nguồn: iximiuz Labs - Container Networking From Scratch, Mastering Container Networking series.
