Docker 入门之overlay网络
前序
推荐先看过之前的入门文章:
什么是什么是Overlay网络?
Overlay网络,顾名思义,是一种"覆盖"在现有物理网络(Underlay)之上的虚拟网络层。它通过在底层IP网络之上封装额外的网络层,实现逻辑上的网络隔离和扩展。
其核心工作原理基于**VXLAN(Virtual Extensible LAN)**技术。 这里省略一万字关于VXLAN的介绍,感兴趣的同学可以自行查阅。
什么时候用overlay网络?
当你知道overlay网络的基础就是vxlan之后,那么就差不多知道时候适用overlay网络了。
-
多主机的容器编排
-
分布式集群的容器编排
-
多租户的网络隔离
如何使用overlay网络?
适用overlay网络的方式和你使用的编排工具有关,他也需要各种插件的配合才能完成,但是今天就以最简单的docker swarm为例,来演示如何使用overlay网络。
这是Overlay网络最原生、最无缝的集成场景,也是最轻量级的场景,非常使用节点不多的集群,比如10个点以下的。不想资源被k8s这种重型的编排工具占据了。
搭建基于docker swarm的overlay网络
主机(节点)环境准备和确认:
bash
# 确认内核转发
sysctl -w net.ipv4.ip_forward=1
# docker版本
docker version
防火墙规则:
bash
iptables -A INPUT -p tcp -m multiport --dports 2377,7946,4789 -j ACCEPT
TCP 2377:Swarm集群管理端口,用于管理节点与工作节点的安全通信。
TCP/UDP 7946:用于节点间发现(Gossip协议),维护集群成员状态。
UDP 4789:VXLAN数据平面端口
为了实验环境,我直接关了防火墙!但是如果你没关,需要记得放行这些端口,最好是指定对端ip的放行
创建集群
- 管理节点
bash
docker swarm init --advertise-addr xxxxx

- 工作节点(这条命令的token是上一个命令输出的)
bash
docker swarm join --token xxxx xxx

管理节点不干活,所以至少准备2个work节点,才能正常使用overlay网络。
检查节点:
在管理节点执行:
bash
docker node ls

创建overlay网络
在管理节点上创建:
bash
docker network create -d overlay \
--attachable \
--subnet 10.10.0.0/24 \
--gateway 10.10.0.1 \
--opt com.docker.network.driver.mtu=1450 \
my-overlay
这里补充说一下mtu: VXLAN封装会增加约50字节的头部开销。为避免数据包分片导致性能下降

部署服务
bash
# 部署一个Nginx服务,拥有2个副本,并自动接入my-overlay网络
docker service create \
--name web \
--replicas 2 \
--network my-overlay \
nginx:alpine

Swarm调度器会将两个容器副本分配到集群中的节点上。它们通过my-overlay网络直接通信,并通过服务名web实现内部发现和负载均衡
查看一下每个节点上的容器:
bash
docker ps


测试
找一个节点,进入容器:
bash
docker exec -it 3498d1a71152 sh
ip addr show
curl http://web

在任一节点的宿主机上执行:
bash
bridge fdb show

可以看到vlan 信息
小结
Overlay网络适用于Docker Swarm集群环境或需要简单配置且不依赖第三方工具的场景。
其他常用命令
bash
# 1. 节点操作
docker node update --availability pause <节点ID> #暂停节点,不再接收新任务,但现有任务继续运行。
docker node update --availability drain <节点ID> #排空节点,不接收新任务且现有任务迁移到其他节点。
docker node update --availability active <节点ID> #恢复节点为活动状态
# 2. 节点退出集群
docker swarm leave
# 3. 查看服务状态
docker service ls
docker service ps my-app
# 4 缩减到2个副本
docker service scale web-service=2
# 5. 扩展服务
docker service scale my-app=5
# 6. 更新服务镜像
docker service update --image nginx:latest my-app
# 7. 监控服务日志
docker service logs -f my-app
# 8. 服务维护时排空节点
docker node update --availability drain <节点ID>
# 9. 删除服务
docker service rm my-app
欢迎关注: