在上周六遭遇阿里雲容器服務 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 節點上的應用容器依然可以正常工作。