Published on

Docker 入门之overlay网络

Authors
  • avatar
    Name
    弈秋
    Twitter

Docker 入门之overlay网络

前序

推荐先看过之前的入门文章:

  1. Docker 入门之基本概念

  2. 入门之overlay网络

什么是什么是Overlay网络?

Overlay网络,顾名思义,是一种“覆盖”在现有物理网络(Underlay)之上的虚拟网络层。它通过在底层IP网络之上封装额外的网络层,实现逻辑上的网络隔离和扩展。

其核心工作原理基于**VXLAN(Virtual Extensible LAN)**技术。 这里省略一万字关于VXLAN的介绍,感兴趣的同学可以自行查阅。

什么时候用overlay网络?

当你知道overlay网络的基础就是vxlan之后,那么就差不多知道时候适用overlay网络了。

  1. 多主机的容器编排

  2. 分布式集群的容器编排

  3. 多租户的网络隔离

如何使用overlay网络?

适用overlay网络的方式和你使用的编排工具有关,他也需要各种插件的配合才能完成,但是今天就以最简单的docker swarm为例,来演示如何使用overlay网络。

这是Overlay网络最原生、最无缝的集成场景,也是最轻量级的场景,非常使用节点不多的集群,比如10个点以下的。不想资源被k8s这种重型的编排工具占据了。

搭建基于docker swarm的overlay网络

主机(节点)环境准备和确认:

# 确认内核转发
sysctl -w net.ipv4.ip_forward=1

# docker版本
docker version

防火墙规则:

iptables -A INPUT -p tcp -m multiport --dports 2377,7946,4789 -j ACCEPT

TCP 2377:Swarm集群管理端口,用于管理节点与工作节点的安全通信。 TCP/UDP 7946:用于节点间发现(Gossip协议),维护集群成员状态。 UDP 4789:VXLAN数据平面端口

为了实验环境,我直接关了防火墙!但是如果你没关,需要记得放行这些端口,最好是指定对端ip的放行

创建集群

  1. 管理节点
docker swarm init --advertise-addr xxxxx
dockerinfo
  1. 工作节点(这条命令的token是上一个命令输出的)
docker swarm join --token  xxxx    xxx
dockerinfo

管理节点不干活,所以至少准备2个work节点,才能正常使用overlay网络。

检查节点:

在管理节点执行:

docker node ls
dockerinfo

创建overlay网络

在管理节点上创建:

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字节的头部开销。为避免数据包分片导致性能下降

dockerinfo

部署服务

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

dockerinfo

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

查看一下每个节点上的容器:

docker ps
dockerinfo
dockerinfo

测试

找一个节点,进入容器:

docker exec -it 3498d1a71152 sh

ip addr show

curl http://web
dockerinfo

在任一节点的宿主机上执行:

bridge fdb show
dockerinfo

可以看到vlan 信息

小结

Overlay网络适用于Docker Swarm集群环境或需要简单配置且不依赖第三方工具的场景。

其他常用命令

# 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