Docker集群开发规范

hqzhu

hqzhu

架构设计原则

  1. 支撑服务与业务系统解耦
    • traefik为基础服务
    • 将相互依赖的services集成在一个stack中部署
    • 如果service提供公共服务,应通过traefik模块暴露接口
  2. 如非必要不映射端口,如需对外服务应通过traefik转发外部请求
  3. 如非必要不加载本地存储,解除service和服务器的依赖
    • 如果必须要加载本地存储,则需要将服务和当前服务器绑定,且只能存在1个副本
    • 原则上数据库等服务不部署在集群之中
  4. 生产负载的副本不应是单点,也不应超过集群中worker数量
  5. 所有负载应该清楚定义最大CPU/内存需求,上限应不超过当前node总量的一半
  6. 所有违反上述原则情况必须在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

  1. 版本号
    • 使用的镜像应该标注尽量准确的版本号,而不是使用latest
  2. 网络设定
    • 生产services将网络设定production
    • 测试services将网络设定develop
    • 支持services将网络设定operation
    • 非特殊情况不独立创建network
  3. 日志设定
    • driver设置为fluentd
    • 将业务日志的输出设置为standout或standerr
    • 避免业务在本地生成包括日志文件在内的临时文件
    • 通过设定tag整合或者区分日志
  4. labels设置
    • 生产services将usage.group.name设定production
    • 测试services将usage.group.name设定develop
    • 支持services将usage.group.name设定operation
  5. 副本数量设置
    • replicas设定应至少等于2
  6. 部署限制
    • 生产和测试副本应该将node.role限制为worker
    • 支持副本应该将node.role限制为manager
  7. 升级动作限制
    • 升级动作应设定为先启动新副本再关闭旧副本
    • 启动新副本失败设定为rollback旧副本
  8. 资源限制
    • 需要设定每个项目的自选限制(limits)
    • 限制应该不超过所在node提供资源的一半