docker swarm生产环境中遭遇network IP池资源不够
起因:
最近一个项目总是收到预警:
1)Disk I/O is overloaded on HOST。
2)Processor load is too high on HOST。
3)Too many processes on HOST。
问题持续三两分钟就就自动恢复了,时间都在晚上11点40 到凌晨00点40 之间
因为最近比较忙,预警的时间又是定时任务高发时间,就暂时没有管,想着忙完手上的项目再看一下,,结果。。。意外在没有丝毫防备的时候击穿了我的心,还爆了我的肝。。
环境直接故障,APP、后台、中间件、微服务各种报错。。
排查过程:
1、硬件套:cpu/mem/disk
2、netstat/lsof/iotop
3、docker service logs NAME/服务logs/
4、系统message/journalctl -u docker.service #dokcer 进程日志(centos)
反正就是一大堆乱七八糟的操作、各种怀疑
在系统message和docker进程日志里发现报错如下:
time="2021-03-29T23:42:16.433157563+08:00" level=error msg="task allocation failure" error="failed to allocate network IP for task jz699939vzb8bgs4zvwz2in5o network gzy342dnddzbzezc015p21nni: could not find an available IP" module=node node.id=qbyscgwd4nemdmnnbdg3lpglr
大概意思就是‘从xxx network分配IP任务失败,没有可用IP’ 。
大概明白了,项目是用的docker swarm集群模式部署。最初设计的时候因为服务数、容器副本数都不是很高,所以创建网络的时候
$ docker network create --driver overlay --subnet=10.250.0.0/24 --gateway=10.250.0.1 network_name # 10.250.0.0/24 只有两百来个可用IP
项目上不断添加微服务和外接IOT模块、前端服务分离、结合docker-compose的update_config和healthcheck做了服务启动健康检查等等。。。导致大量IP被使用,造成了现在的无IP资源可用。。。
因为leader节点正好在nfs服务器上,服务不断请求,造成了节点假死,node状态为down,期间还经历了集群重新选举等各种过程。。造成部分中间件卡死未能成功启动。然后关联的微服务就全完了。
解决方案:
临时办法:
1)把nfs从manager踢出去,并设置成drawn,只用做nfs。
2)手动update 中间件。
3)部分因为CPU load过高导致HealthCheck过不了的,重启update服务。
4)环境暂时恢复。
更改集群网络(未验证)
临时办法治标不治本,不解决IP池问题还是会出问题。
百度和官方都没有直接解决办法。
查看–help
$ docker network --help
Usage: docker network COMMAND
Manage networks
Commands:
connect Connect a container to a network
create Create a network
disconnect Disconnect a container from a network
inspect Display detailed information on one or more networks
ls List networks
prune Remove all unused networks
rm Remove one or more networks
结合从官网看的docker network的内容,
Connect a running container to a network # 将正在运行的容器连接到网络
$ docker network connect multi-host-network container1
想到一个办法:
1)先创建一个overlay网络
$ docker network create --driver overlay --subnet=10.250.100.0/22 --gateway=10.250.100.1 ztj_new_network_name
2)把容器都connect到新的network
3)取消旧network和容器的关联,并删除旧network
4)再创建和原来同名的network,并关联到容器上
这个办法有待尝试,,等我成功了再来讲一下,到时候命令也整理一下
#######################################################
#######################################################
2021-05-17 追加
这个问题前段时间解决了。原因是云商的定时备份磁盘除了问题,,,emmm
上面的解决方案只是环境崩溃之后的恢复过程,未验证的方案还没验证就查出服务器内核问题。唉