云计算之路-阿里云上-容器难容:优化自建 docker swarm 集群的部署

在上周六遭遇阿里云容器服务 swarm 版的故障之后,我们决定还是走自建 docker swarm 之路,只要不是阿里云底层的问题,我们相信会找到办法解决或避开自建 docker swarm 不稳定的问题。

以下是我们即将采用的 docker swarm 集群部署优化措施。

1)2 个 overlay 网络合并为 1 个,以减少维护多个 overlay 网络的开销

之前用了 2 个 overlay 网络 cnblogs 与 proxy ,路由容器 docker-flow-proxy 只加入 proxy 网络,所有容器加入 cnblogs 网络,需要路由的容器才加入 proxy 网络。现改为 1 个 overlay 网络,所有容器(包括 docker-flow-proxy)都加入同一个网络。

2)限制每个容器最大可以使用的 CPU 与 内存,以免有应用消耗过多 CPU 或内存而拖垮节点

以下是 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 节点上的应用容器依然可以正常工作。

posted @ 2018-04-02 19:48  博客园团队  阅读(2408)  评论(4编辑  收藏  举报