在上周六遭遇阿里云容器服务 swarm 版的故障以后,咱们决定仍是走自建 docker swarm 之路,只要不是阿里云底层的问题,咱们相信会找到办法解决或避开自建 docker swarm 不稳定的问题。html
如下是咱们即将采用的 docker swarm 集群部署优化措施。nginx
1)2 个 overlay 网络合并为 1 个,以减小维护多个 overlay 网络的开销docker
以前用了 2 个 overlay 网络 cnblogs 与 proxy ,路由容器 docker-flow-proxy 只加入 proxy 网络,全部容器加入 cnblogs 网络,须要路由的容器才加入 proxy 网络。现改成 1 个 overlay 网络,全部容器(包括 docker-flow-proxy)都加入同一个网络。ubuntu
2)限制每一个容器最大可使用的 CPU 与 内存,以避免有应用消耗过多 CPU 或内存而拖垮节点centos
如下是 docker swarm compose 文件中的配置服务器
deploy: resources: limits: cpus: "1.5" memory: 1.5G
3)将 service 的更新顺序由 stop-first 改成 start-first ,以避免更新时形成单个容器负载太高网络
stop-first 是 docker swarm 的默认方式,更新时先中止旧容器,而后启动新容器。咱们的每一个服务部署了 2 个容器,先中止 1 个容器会将负载集中到另外 1 个容器,从而增长容器所在节点的负载。改成 start-first ,先启动新容器,后中止旧容器,可避免这个问题。优化
deploy: update_config: order: start-first
4)将 docker-flow-proxy 的 proxy_proxy 服务改成全局部署阿里云
proxy_proxy 是访问的入口,全部外部访问请求都由它转发给对应的容器,全局部署(每一个节点部署)能够减小跨主机网络通讯。操作系统
deploy: mode: global
5)使用阿里云弹性网卡,弹性网卡放在同一个专属的 VPC 交换机中,全部节点都绑定弹性网卡,这样每一个节点有 2 块网卡,节点之间的 docker swarm 通讯走弹性网卡。
docker swarm init --advertise-addr 弹性网卡IP
6)将操做系统由 ubuntu 16.04 换成 centos 7.3
原本没打算进行这个更换,更换是因为 ubuntu 16.04 不直接支持阿里云弹性网卡(须要另外手工配置),以前一直用的是 ubuntu 16.04 跑 docker swarm ,正好借此机会换上 centos 看看效果。
2018年5月15日更新
后来实际采用的部署:
1)仍是用了 2 个 overlay 网络,以便于进行内外网应用之间的隔离
2)继续采用
3)继续采用
4)用基于约定的静态配置的 nginx 取代了 docker-flow-proxy ,nginx 也是全局部署
5)因为 docker swarm 对多网卡的支持有问题,放弃使用多网卡
6)继续采用
7)设置 reserve memory
7.1)借助一个容器为系统保留内存
resources: limits: memory: 600M reservations: memory: 600M
7.2)给每一个应用容器设置了 reservations - memory ,以免将太多容器部署在一个节点上
8)设置 task-history-limit 以减小 manager 解决的资源消耗
docker swarm update --task-history-limit 2
9)在服务器资源配置上由“保 manager 节点为主”改成“保 worker 节点为主”,即便 manager 节点宕机,已运行于 worker 节点上的应用容器依然能够正常工做。