Docker集群开发规范

hqzhu
架构设计原则
- 支撑服务与业务系统解耦
- traefik为基础服务
- 将相互依赖的services集成在一个stack中部署
- 如果service提供公共服务,应通过traefik模块暴露接口
- 如非必要不映射端口,如需对外服务应通过traefik转发外部请求
- 如非必要不加载本地存储,解除service和服务器的依赖
- 如果必须要加载本地存储,则需要将服务和当前服务器绑定,且只能存在1个副本
- 原则上数据库等服务不部署在集群之中
- 生产负载的副本不应是单点,也不应超过集群中worker数量
- 所有负载应该清楚定义最大CPU/内存需求,上限应不超过当前node总量的一半
- 所有违反上述原则情况必须在docker-compose部署说明文件中注释说明
约定和规范
- 参考docker-compose.yml
services:
app:
image: hub.nihao.com/helloworlddev/docker-demo:v0.0.15 #1
environment:
NODE_ENV: swarm
networks:
- develop #2
secrets:
-
source: docker-demo_secret
target: /app/.secret
configs:
-
source: docker-demo_env
target: /app/.env
logging: #3
driver: fluentd
options:
tag: docker-demo
deploy:
labels:
usage.group.name: develop #4
traefik.enable: 'true'
traefik.http.routers.docker-demo.entrypoints: outer
traefik.http.routers.docker-demo.rule: Host(`test.memeta.io`)
traefik.http.services.docker-demo.loadbalancer.server.port: '3000'
replicas: 2 #5
placement:
constraints: #6
- node.role==worker
update_config: #7
order: start-first
failure_action: rollback
restart_policy:
condition: on-failure
resources: #8
reservations:
cpus: '0.1'
memory: 256M
limits:
cpus: '1'
memory: 1024M
networks: #2
develop:
external: true
configs:
docker-demo_env:
external: true
secrets:
docker-demo_secret:
external: true
- 版本号
- 使用的镜像应该标注尽量准确的版本号,而不是使用latest
- 网络设定
- 生产services将网络设定production
- 测试services将网络设定develop
- 支持services将网络设定operation
- 非特殊情况不独立创建network
- 日志设定
- driver设置为fluentd
- 将业务日志的输出设置为standout或standerr
- 避免业务在本地生成包括日志文件在内的临时文件
- 通过设定tag整合或者区分日志
- labels设置
- 生产services将usage.group.name设定production
- 测试services将usage.group.name设定develop
- 支持services将usage.group.name设定operation
- 副本数量设置
- replicas设定应至少等于2
- 部署限制
- 生产和测试副本应该将node.role限制为worker
- 支持副本应该将node.role限制为manager
- 升级动作限制
- 升级动作应设定为先启动新副本再关闭旧副本
- 启动新副本失败设定为rollback旧副本
- 资源限制
- 需要设定每个项目的自选限制(limits)
- 限制应该不超过所在node提供资源的一半