報錯
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

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