我正在使用docker swarm来处理CPU密集型计算应用程序。每个容器都运行相同的单线程应用程序。当然,可用的容器越多,整体计算的速度就越快,但最多只能达到可用的CPU核心数。因此,在具有8个核心的节点上,应该有8个正在运行的容器。
但是,节点会动态加入和离开群集,因此群中可用CPU核心的总数会有所不同。如何自动缩放服务,以反映这一点?
备注:我的应用程序依赖于覆盖网络,据我所知,使用服务而不是手动处理容器是首选方法。
答案 0 :(得分:0)
我想到的一个选择是定期检查连接的节点,并为每个节点创建一个具有适当副本数量的服务。它可能不是一个非常优雅的解决方案,但至少它适用于以下Python脚本。
#!/usr/bin/env python3
import docker
def rescale(service_prefix,service_arguments):
client = docker.from_env()
service_names = [s.name for s in client.services.list()]
for node in client.nodes.list():
# Only handle ready nodes
if node.attrs['Status']['State'] != 'ready':
continue
service_name = service_prefix+node.id
if service_name not in service_names:
# Service does not exist -> Create it
cpus = node.attrs['Description']['Resources']['NanoCPUs']/1000000000
print("Creating service %s with %i replicas"%(service_name,cpus))
mode={'Replicated':{'Replicas':int(cpus)}}
constraints=['node.id==%s'%node.id]
client.services.create(name=service_name, mode=mode, constraints=constraints, **service_arguments)
else:
# Continue running this service
service_names.remove(service_name)
# Remove services of no longer existing nodes
for service in service_names:
print("Removing service %s"%service)
client.services.get(service).remove()
rescale(service_prefix="evaluation_",
service_arguments={'image':'imagename','networks':['swarmnet']})