雲計算之路-阿里雲上-容器難容:優化自建 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 節點上的應用容器依然可以正常工作。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM