跨主机容器通信方案
为什么需要跨主机通信
单台 Docker 主机的资源有限,当服务规模扩大后,容器必然分布在多台主机上。这时就需要跨主机通信方案让不同机器上的容器像在同一个网络中一样通信。
方案概览
| 方案 | 原理 | 复杂度 | 性能 | 适用场景 |
|---|---|---|---|---|
| Overlay Network | VXLAN 隧道 | 中等 | 偏低 | 通用场景 |
| Macvlan | 分配独立 MAC | 低 | 接近物理 | 需要物理网段 |
| Calico | BGP 路由 | 高 | 高 | 大规模集群 |
| Flannel | VXLAN/Host-GW | 中等 | 中等 | Kubernetes 集群 |
| Weave | 加密隧道 | 中等 | 偏低 | 需要加密通信 |
方案一:Docker Overlay 网络(推荐)
Docker 原生支持 Overlay 网络,基于 VXLAN 技术实现。
前置条件
- Docker 引擎运行在 swarm mode(或使用 etcd/consul 作为 key-value store)
- 主机之间可以网络互通
配置步骤
# 在多台主机上初始化 swarm(或在第一台主机上)
docker swarm init
# 其他节点加入
docker swarm join --token :2377
# 创建 overlay 网络
docker network create -d overlay --attachable my-overlay
# 启动容器并连接到 overlay 网络
docker run -d --name web --network my-overlay nginx
docker run -d --name app --network my-overlay alpine sleep 3600
# 跨主机直接用容器名通信
docker exec app ping web
--attachable 参数允许非 swarm 服务容器也连接到该网络。
工作原理
Host A Host B
┌────────────┐ ┌────────────┐
│ Container A │ │ Container B │
│ 10.0.0.2 │ │ 10.0.0.3 │
└─────┬──────┘ └─────┬──────┘
│ │
┌─────┴──────┐ ┌─────┴──────┐
│ docker_gw │ │ docker_gw │
│ bridge │ │ bridge │
└─────┬──────┘ └─────┬──────┘
│ │
┌─────┴──────┐ ┌─────┴──────┐
│ phys eth0 │───VXLAN隧道───│ phys eth0 │
│ 192.168.1.1│ │ 192.168.1.2│
└────────────┘ └────────────┘
方案二:Macvlan
把宿主机物理网卡上的 MAC 地址分配给容器,让容器直接出现在物理网络中。
配置方式
# 创建 macvlan 网络
docker network create -d macvlan \
--subnet=192.168.1.0/24 \
--gateway=192.168.1.1 \
-o parent=eth0 \
macvlan-net
# 启动容器使用 macvlan
docker run -d --name web --network macvlan-net --ip=192.168.1.100 nginx
优点:性能接近物理机,无需端口映射
缺点:需要物理交换机支持(MAC 地址可能超限),宿主机和容器之间通信需要额外配置
方案三:Calico
基于三层路由的 CNI 方案,使用 BGP 协议在三层网络上分发路由。
核心优势
- 高性能:不需要隧道封装,直接路由
- 网络策略:支持精细的访问控制
- 大规模:支持上千节点
- 原生 Kubernetes 支持:最主流的 K8s 网络方案
基本架构
┌──────────┐ BGP ┌──────────┐
│ Host A │◄───────────►│ Host B │
│ calico │ │ calico │
│ 10.0.0.1 │ │ 10.0.0.2 │
│ route: │ │ route: │
│ 10.0.1/24│ │ 10.0.2/24│
└──────────┘ └──────────┘
简单部署
# 部署 Calico(Kubernetes 环境)
kubectl apply -f https://docs.projectcalico.org/manifests/calico.yaml
# Docker 环境(需要 etcd)
docker run -d --net=host --privileged \
-v /var/log/calico:/var/log/calico \
calico/node:v3.25
方案四:Flannel
Kubernetes 早期最常用的网络方案,简单可靠。
# 部署 Flannel
kubectl apply -f https://raw.githubusercontent.com/flannel-io/flannel/master/Documentation/kube-flannel.yml
方案选择指南
小规模环境(< 10 台主机)
- 使用 Docker Overlay 网络,配置简单,Docker 原生支持
中规模环境(10-50 台)
- Flannel 或 Calico 都是好选择
- 如果需要网络策略,选 Calico
大规模环境(> 50 台)
- Calico 性能最优
- 考虑 eBPF 模式进一步加速
特殊需求
- 需要加密通信:Weave 或 Calico with WireGuard
- 需要物理网络 IP:Macvlan
- 多租户隔离:Calico NetworkPolicy
面试常考知识点
- VXLAN 工作原理:MAC in UDP 封装,VTEP 负责封装和解封装
- Overlay 与 Underlay 的区别:Overlay 构建在物理网络之上
- BGP 基础:Calico 使用的路由协议
- 各种方案的性能对比:Macvlan > Calico > Flannel > Overlay > Weave
- 网络策略实现:Calico 的 iptables/eBPF 规则
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END


暂无评论内容