Overlay 网络场景

Overlay 网络场景

面试题

Docker Overlay 网络是什么?在什么场景下使用?底层是如何实现的?

标准答案

Overlay 网络是 Docker 的跨主机网络方案,它让不同宿主机上的容器可以像在同一台机器上一样通信。Overlay 网络必须配合 Docker Swarm 模式使用。

核心概念

Overlay 网络在现有物理网络(Underlay)之上建立一层虚拟网络,将不同宿主机上的容器连接在同一个二层网络中。数据包在宿主机间传输时被封装(VXLAN),到达目标宿主机后解封。

宿主机 A                   宿主机 B
┌──────────────┐          ┌──────────────┐
│  容器 A      │          │  容器 B      │
│  10.0.0.2    │          │  10.0.0.3    │
│  └────┬──────┘          │  └────┬──────┘
│       │                 │       │
│  ┌────┴──────────┐     │  ┌────┴──────────┐
│  │  Overlay 网络  │     │  │  Overlay 网络  │
│  │  VXLAN 封装   │     │  │  VXLAN 解封   │
│  └────┬──────────┘     │  └────┬──────────┘
│       │                 │       │
│  ┌────┴──────────┐     │  ┌────┴──────────┐
│  │  物理网络      │══════════│  物理网络      │
│  │  192.168.1.10 │     │  │  192.168.1.20 │
│  └───────────────┘     │  └───────────────┘
└──────────────────────┘ └──────────────────────┘

数据包路径:
容器 A → 容器 B: 10.0.0.2 → 10.0.0.3
  ↓
VXLAN 封装,外层目标地址为 192.168.1.20
  ↓
物理网络传输
  ↓
宿主机 B 收到,VXLAN 解封
  ↓
容器 B 收到原始包

启用 Overlay 网络

Overlay 网络必须在 Swarm 模式下使用:

# 1. 初始化 Swarm 集群
docker swarm init --advertise-addr 192.168.1.10

# 2. 其他节点加入
docker swarm join --token SWMTKN-... 192.168.1.10:2377

# 3. 创建 Overlay 网络
docker network create \
  --driver overlay \
  --subnet 10.0.0.0/16 \
  --gateway 10.0.0.1 \
  my-overlay

# 4. 使用 Overlay 网络部署服务
docker service create \
  --name web \
  --network my-overlay \
  --replicas 3 \
  nginx

# 或用于容器(仅 Swarm 服务容器,不支持普通 docker run)
docker run -d --name test --network my-overlay alpine sleep 3600

两种 Overlay 模式

1. 全局范围(Global Scope)

# 默认模式,所有 Swarm 节点都能使用
docker network create --driver overlay --scope global my-overlay

2. 交换范围(Swarm Scope)

# 仅限于 Swarm 服务使用
docker network create --driver overlay --scope swarm my-overlay

应用场景

场景一:多节点微服务

version: '3.8'
services:
  api:
    image: myapi:latest
    networks:
      - overlay-net
    deploy:
      replicas: 3
      placement:
        constraints: [node.role == worker]

  web:
    image: nginx:alpine
    networks:
      - overlay-net
    ports:
      - 80:80
    deploy:
      replicas: 2

networks:
  overlay-net:
    driver: overlay

服务发现自动生效:任意节点上的 api 服务可以通过服务名访问另一个节点上的 web

场景二:数据库主从复制

# 跨主机的数据库同步
docker service create \
  --name mysql-primary \
  --network overlay-net \
  --replicas 1 \
  -e MYSQL_ROOT_PASSWORD=secret \
  mysql:8

docker service create \
  --name mysql-replica \
  --network overlay-net \
  --replicas 2 \
  -e MYSQL_REPLICATION_MODE=slave \
  mysql:8

场景三:混合部署

# 部分容器在 Overlay 上跨主机通信
# 部分容器只在本地通信
docker network create --driver overlay public-net
docker network create --driver bridge private-net

docker service create \
  --name api \
  --network public-net \
  --network private-net \
  myapi:latest

底层原理:VXLAN

Overlay 网络使用 VXLAN(Virtual Extensible LAN)技术封装数据包:

原始数据包(容器内):
┌─────┬────────────┬──────┬──────────┐
 MAC  IP(容器)    UDP   Payload  
└─────┴────────────┴──────┴──────────┘

VXLAN 封装后(物理网络传输):
┌─────┬────────────┬──────┬──────────────┬──────────┐
 MAC  IP(宿主机)   UDP   VXLAN Header  原始包   
└─────┴────────────┴──────┴──────────────┴──────────┘
协议栈:
- 外层的 MAC/IP:宿主机之间的通信地址
- VXLAN HeaderVNIVXLAN Network Identifier
- 内层:原始容器通信数据

Overlay 网络的性能

指标 原生通信 Overlay 网络
延迟 无额外开销 加 0.1-0.5ms(封装/解封)
吞吐量 线速 约 90-95%(CPU 非 offload)
CPU 开销 中等(封装处理)
MTU 1500 1450(50 字节 VXLAN 头)

常见问题

Q:Overlay 网络需要额外配置吗?

基础配置不需要。但需要注意:
– 集群节点间的 4789/UDP 端口必须互通(VXLAN 端口)
– 推荐启用 GRO/GSO 卸载以提高性能
– MTU 可能需要调整

Q:Overlay 网络的安全如何保证?

# 启用加密传输
docker network create \
  --driver overlay \
  --opt encrypted \
  my-secure-overlay
# 使用 IPsec 加密 VXLAN 流量

Q:普通 docker run 可以使用 Overlay 网络吗?

只有 Swarm 服务(docker service create)才支持 Overlay 网络。普通 docker run 虽然也能连接到 Overlay 网络,但不建议这么做,因为网络会随着 Swarm 的 Leader 选举等操作发生抖动。

调试技巧

# 查看 Overlay 网络信息
docker network inspect my-overlay

# 在 Swarm 节点上查看 VXLAN 接口
ip link show | grep vxlan

# 查看 VXLAN 隧道
ip -d link show | grep vxlan

# 检查 VXLAN 端口是否可通
nc -uvz 192.168.1.20 4789

总结

Overlay 网络解决的是跨主机容器通信的问题,底层通过 VXLAN 封装实现。核心场景是 Swarm 集群中的多节点部署。理解 VXLAN 的封装/解封原理有助于排查跨主机通信的性能和连通性问题。

© 版权声明
THE END
喜欢就支持一下吧
点赞8 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容