• docker swarm:启动多个 overlay网络出现 could not find an available IP while allocating VIP问题


    报错

    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

  • 相关阅读:
    VBA操作IE
    Eclipse中Git图标表示内容
    sqldeveloper更改语言设定
    VBA-FileToFileUpdate
    VBA-UTF-8文件的操作
    Null项目参与排序
    阿里云的学生机如何开放全部端口
    .net core3.1 webapi + vue + element-ui upload组件实现文件上传
    .net core控制台使用log4net
    vue2.x中使用三元表达式绑定class的时候遇到的坑
  • 原文地址:https://www.cnblogs.com/zoujiaojiao/p/13366680.html
Copyright © 2020-2023  润新知