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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM