docker swarm生产环境中遭遇network IP池资源不够 --- task allocation failure

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

上面的解决方案只是环境崩溃之后的恢复过程,未验证的方案还没验证就查出服务器内核问题。唉

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值