no suitable node (insufficient resources on 1 node) docker stack/service

探讨Docker服务更新过程中遇到的nosuitable node错误,分析内存资源不足的原因及解决策略,包括调整宿主机配置、优化容器内存使用和扩展集群节点。

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

 

 

当用户在使用计算平台或云服务时遇到 **"insufficient resources"** 错误,通常表示系统资源(如CPU、内存、存储、进程数、文件句柄等)不足以支持当前操作或服务的启动需求。这类问题常见于虚拟化环境、开发工具(如iOS模拟器)、高可用性集群(如VMware HA)以及消息队列系统(如MSMQ)中。 ### 错误原因分析 1. **资源限制**:系统内存、CPU或存储空间不足,无法满足新进程或服务的启动需求。 2. **并发限制**:活动进程数或打开文件数超过操作系统或应用程序的上限。 3. **高可用性配置不当**:在虚拟化平台中,集群配置的故障转移级别所需的资源未被满足 [^1]。 4. **内核或系统错误**:如内存访问冲突(SIGSEGV)可能导致资源分配失败 [^4]。 5. **系统资源泄漏**:长时间运行未释放的资源(如模拟器、服务实例)可能耗尽可用资源。 ### 解决方案 #### 1. 释放系统资源 - **关闭不必要的应用程序和服务**:特别是开发过程中运行的多个模拟器或虚拟机,关闭未使用的实例可显著释放内存和CPU资源 [^2]。 - **重启系统或服务**:重启可以清除临时资源泄漏,恢复系统正常状态。 - **优化资源使用**:关闭后台进程、释放磁盘空间、清理缓存。 #### 2. 调整系统限制 - **增加最大进程数和文件句柄数**:在类Unix系统中,可以通过修改 `/etc/sysctl.conf` 或使用 `ulimit` 命令调整限制。 - **调整内存分配**:对于模拟器或虚拟机环境,适当增加内存分配或限制单个实例使用的内存大小 [^3]。 #### 3. 高可用性集群配置调整 - **降低故障转移级别**:若集群资源不足以支持当前配置的HA级别,可适当降低故障转移级别以释放资源 [^1]。 - **扩展集群节点**:增加更多主机节点以提升整体资源容量。 #### 4. 检查并修复系统错误 - **排查SIGSEGV等系统错误**:检查日志中是否有内存访问冲突或其他内核级错误,确保软件版本兼容性 [^4]。 - **更新驱动或系统**:确保操作系统和相关驱动程序为最新版本,以修复已知的资源管理问题。 #### 5. 资源监控与优化 - **实时监控资源使用情况**:使用系统监控工具(如top、htop、Activity Monitor、vSphere Client等)观察资源使用趋势。 - **设置资源配额**:在云平台或容器环境中,合理配置资源配额,避免单个服务占用过多资源。 ### 示例:调整macOS最大文件句柄数 ```bash # 查看当前限制 ulimit -n # 临时增加限制(仅当前会话) ulimit -n 2048 # 永久修改:编辑 /etc/sysctl.conf 添加 kern.maxfiles=20480 kern.maxfilesperproc=18000 ``` ### 示例:调整Xcode模拟器内存使用 ```bash # 使用命令行关闭所有模拟器 xcrun simctl shutdown all # 删除未使用的模拟器设备 xcrun simctl delete <device-udid> ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值