报错
Jul 23 15:00:06 VBaas-sit-fabric01 dockerd[927]: time="2020-07-23T15:00:06.734158327+08:00" level=error msg="Could not parse VIP address while releasing"
Jul 23 15:00:06 VBaas-sit-fabric01 dockerd[927]: time="2020-07-23T15:00:06.734583476+08:00" level=error msg="error deallocating vip" error="invalid CIDR address: " vip.addr= vip.network=nq2y2dl9myhd5ben8c6zx9348
Jul 23 15:00:06 VBaas-sit-fabric01 dockerd[927]: time="2020-07-23T15:00:06.734909092+08:00" level=error msg="Failed allocation for service ck7j3mop8zopu8nnf7j4ts8st" error="could not find an available IP while allocating VIP" module=node node.id=hxnlqnvi9x6dwjg480mvhqemp
Jul 23 15:00:06 VBaas-sit-fabric01 dockerd[927]: time="2020-07-23T15:00:06.730441990+08:00" level=debug msg="Service ck7j3mop8zopu8nnf7j4ts8st was scaled up from 0 to 1 instances" module=node node.id=hxnlqnvi9x6dwjg480mvhqemp
Jul 23 15:00:06 VBaas-sit-fabric01 dockerd[927]: time="2020-07-23T15:00:06.742072661+08:00" level=debug msg="task j9i3foe9kn79ehi30l3s25g5k was marked pending allocation" module=node node.id=hxnlqnvi9x6dwjg480mvhqemp
Jul 23 15:00:06 VBaas-sit-fabric01 dockerd[927]: time="2020-07-23T15:00:06.743440730+08:00" level=error msg="task allocation failure" error="service ck7j3mop8zopu8nnf7j4ts8st to which task j9i3foe9kn79ehi30l3s25g5k belongs has pending allocations" module=node node.id=hxnlqnvi9x6dwjg480mvhqemp
分析
docker swarm 集群(Ubuntu,3个机器,内存足够负载也不高)启动了11个网络。第11个网络下面启动不了容器。系统日志提示:could not find an available IP while allocating VIP。
添加网络的命令:docker network create --driver overlay --attachable fabric-testzjj
前面10个网络下面的容器都启动ok。
第11个网络下面的失败。
尝试解决
查看ingress网络详细信息
docker network inspect ingress
找出系统日志中说的VIP
映射端口到宿主机的容器会分派一个VIP,通过命令可以发现,VIP是和ingress网络一个网段。使用的是10.0.0.0/24 。
理论上,ingress自己占一个,还有253个VIP可以分配。
下面脚本统计出来的是全部services 的,过滤掉没有分配VIP的service,统计出来VIP已经分派了71个正常使用。
目前猜测:部分VIP资源分配给已经清理的容器后没有从资源池释放。
查看容器VIP的脚本:
for Service in `docker service ls |awk '{print $2}'`
do
echo $Service
docker service inspect --format {{.Endpoint.VirtualIPs}} $Service
done
尝试回收VIP资源
查找官网,暂时没找到办法
通过自定义ingress的子网ip来扩大VIP个数
温馨提示 :该方案不适合已经运行的生产环境。只能在测试环境操作。
1. 将docker swarm 集群拆分,重建
1. 查看集群节点
# docker node ls
2. 降级节点,删除节点
#docker node demote 节点id
#docker node rm 节点id
3. 查看docker的配置路径
# df -h|grep docker
![](https://img2020.cnblogs.com/blog/1444147/202007/1444147-20200724105952559-44442288.png)
4. 停止docker服务
# systemctl stop docker
5. 删除docker的配置 --慎重执行--生产环境不要这样执行---
# rm /var/lib/docker/* -rf
6. 启动docker
#systemctl start docker
7. 初始化swarm
# docker init
2. 自定义ingress
自定义 10.0.0.0/16 ,可以有2的16次方减1 (65535)个VIP。
1. 删除默认创建的ingress
# docker network rm ingress
2. 自定义ingress
# docker network create --driver overlay --ingress --subnet=10.0.0.0/16 --gateway=10.0.0.1 --opt com.docker.network.mtu=1400 ingress
3. 恢复集群
# docker swarm join-token manager
复制提示的操作命令去其他节点执行。
4. 把服务启动
后话
一个docker swarm 只能拥有一个ingress