问题描述使用docker compose编排服务,并做了启动约束。发现服务一直在pending状态,而删掉约束后可以正常启动。docker compose文件如下version: '3'service
问题描述
使用docker compose编排服务,并做了启动约束。发现服务一直在pending状态,而删掉约束后可以正常启动。
docker compose文件如下
version: '3'services: elasticsearch: image: elasticsearch:5.5 ports: - "9200:9200" - "9300:9300" environment: TZ: Asia/Shanghai networks: - log-efk logging: driver: json-file options: max-file: '10' max-size: 1m deploy: mode: replicated replicas: 1 update_config: parallelism: 1 delay: 10s restart_policy: condition: on-failure placement: constraints: - node.ip == 172.16.4.34 resources: limits: cpus: '0.5' memory: 900M reservations: cpus: '0.001' memory: 20M kibana: image: kibana:5.5 environment: TZ: Asia/Shanghai ELASTICSEARCH_URL: http://elasticsearch:9200/ ports: - "5601:5601" networks: - log-efk logging: driver: json-file options: max-file: '10' max-size: 1m deploy: mode: replicated replicas: 1 update_config: parallelism: 1 delay: 10s restart_policy: condition: on-failure placement: constraints: - node.ip == 172.16.4.33 resources: limits: cpus: '0.1' memory: 300M reservations: cpus: '0.001' memory: 20M fluentd: image: fluent/fluentd:v0.12.29 ports: - "24224:24224" volumes: - ./fluentd.conf:/fluentd/etc/fluentd.conf environment: TZ: Asia/Shanghai FLUENTD_CONF: fluentd.conf networks: - log-efk logging: driver: json-file options: max-file: '10' max-size: 1m deploy: mode: replicated replicas: 1 update_config: parallelism: 1 delay: 10s restart_policy: condition: on-failure placement: constraints: - node.ip == 172.16.4.33 resources: limits: cpus: '0.1' memory: 200M reservations: cpus: '0.001' memory: 20Mnetworks: log-efk: driver: overlay
解决步骤
- 检查约束条件是否书写正确
与docker compose文档进行了对比,没有问题,都是- key == value 类型
- 检查约束条件是否存在
我原本已经把约束条件通过书写到daemon.json添加到docker引擎里面,通过docker info也可以看到相应的labels。
Labels: node.ip=172.16.4.33 node.type=db
按理说约束条件应该是没有问题的。
- 官网查找文档
在官网搜索文档,搜索label的时候,看到这么一条信息。
Add labels to cluster nodes
点进去看了下,原来可以通过
docker node update --label-add <key>=<value> <node-id>
命令来给集群节点添加标签。
这里需要看清楚,示例里面添加的标签是stronger=ssd但是在deploy约束的时候写的是node.labels.strongger==ssd
也就是说deploy约束并不是默认使用swarm node的labels,也不是使用docker engine的labels。而是需要通过添加前缀来指定。
swarm node的labels使用node.labels前缀
docker engine的labels使用engine.labels前缀。
如果你有其他需求,你可以再测试是否还有其他前缀。目前来说,一般只需要使用swarm node的labels就可以了,至于为什么不用engine的labels,是因为修改engine的参数,需要重启docker服务,会对业务造成影响。