Docker Engine版本
Client: Docker Engine - Community
Version: 19.03.8
API version: 1.40
Go version: go1.12.17
Git commit: afacb8b
Built: Wed Mar 11 01:27:04 2020
OS/Arch: linux/amd64
Experimental: false
Server: Docker Engine - Community
Engine:
Version: 19.03.8
API version: 1.40 (minimum version 1.12)
Go version: go1.12.17
Git commit: afacb8b
Built: Wed Mar 11 01:25:42 2020
OS/Arch: linux/amd64
Experimental: false
containerd:
Version: 1.2.6
GitCommit: 894b81a4b802e4eb2a91d1ce216b8817763c29fb
runc:
Version: 1.0.0-rc8
GitCommit: 425e105d5a03fabd737a126ad93d62a9eeede87f
docker-init:
Version: 0.18.0
GitCommit: fec3683
在通過docker stack deploy 或者 docker service update命令更新服務時候,操作成功但是出現:no suitable node (insufficient resources on 1 node), 命令執行結束但是沒有立即更新服務,命令執行state狀態爲pending,掛起,ERROR顯示原因,原因爲節點資源不足導致無法更新服務。(本例中stack.yaml,更新策略是start_first,先啓動一個服務,再暫停原服務)
[root@abc abc]# docker service ps demo_services_hi-srv
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
ea97n0dfeggm demo_services_hi-srv.1 hi-srv:latest Running Pending 4 hours ago "no suitable node (insufficien…"
當一個節點上運行的docker容器服務較多時,雖然通過free命令查看宿主機內存還有可用,但是在執行service更新時也無法立即更新,會一直處於pending狀態,等待有資源了會被調度繼續執行更新命令,free還有資源但是無法更新的最主要原因是所有已啓動的docker容器預分配的內存已經將宿主機內存資源佔用光了,所以內存不足導致無法啓動/更新service。
判斷是否還有可用資源:宿主機總內存 - (每個docker容器limit-memory+reservation-memory) = 剩餘內存資源,當啓動的新服務或者要更新的服務所需內存資源(limit-memory+reservation-memory) > 剩餘內存資源, 執行命令出現state: pending狀態,ERROR顯示消息爲:no suitable node (insufficient resources on 1 node)。需要增大宿主機內存或者增加集羣節點或者減少已存在容器佔用的內存,騰出部分資源用於更新或者啓動新服務。
limit-memory :限制容器運行佔用的系統內存
reservation-memory :爲該容器保留的內存,默認0
services:
hi-srv:
...省略...
deploy:
...省略...
update_config:
parallelism: 1
delay: 30s
order: start-first
failure_action: rollback
resources:
limits:
cpus: '0.9'
memory: ${limit_mem:-1536M}
reservations:
cpus: '0.1'
memory: ${reserve_mem:-64M}
參考:#issues25069