前言
容器宿主機的選擇需要考慮如下幾個問題
- 用物理機還是虛擬機?
- 用多大規格的服務器?
- CPU和內存配比多少合理?
- 一個集群,需要放多少節點?
- 主機越大越好,還是越小越好?
這些問題,每一個單獨拿出來,都不是很好回答,并且每個企業實際情況不盡相同,我將結合我們在生產環境的實際使用經驗,來談一談如何選擇容器的宿主機,你從本文中可以獲得一些啟發,來規劃符合自己的容器集群。
1. 采用物理機還是虛擬機;
采用物理機的好處
- 資源利用率高
采用虛擬機的好處
- 重啟速度快。
- 規格可以自由確定.并且方便修改。
- 方便重建
采用虛擬機,可以獲得虛擬機帶來的諸多好處,采用物理機唯一的優勢是資源利用率高。考慮到資源利用率并不是問題, 最終采用虛擬機。
為什么資源利用率不是問題?
從 http://openskill.cn/article/88 這里的測試數據可以看出, KVM 虛擬化
- 虛擬機相對物理機的 CPU 性能損失在 1% 以內
- 內存幾乎無損耗.
- virtio 網絡幾乎無損耗.
- 磁盤 損耗受影響因素較多,推薦使用 ext4, qcow2, writeback 緩存, virtio 驅動。磁盤 從其他渠道獲取的信息來看。 大致有 12% 的損耗。
實際生產需要落地的數據,放在共享存儲上 (cephfs, moosefs) , 其iops 由存儲系統提供,本地磁盤只用來存儲鏡像及容器運行的臨時數據。 對磁盤的性能要求,無需特別苛刻。
為什么考慮重啟速度?
在實際的運維過程中,我們發現部分場景下,會出現主機卡死,或者docker進程卡死, 這時,最快恢復業務的方法是重啟主機。 容器在主機重啟后,可以自動恢復,因此可以做到在1到2分鐘內快速恢復業務。這一點太重要了,物理機重啟由于需要做各種硬件檢測,重啟時間一般在5到10分鐘, 虛擬機重啟一般在1分鐘以內 , 物理機顯然無法滿足需求。
為什么重建能力很重要?
容器平臺經常需要更新操作系統,或者根據需要調整主機規格
- 運行一段時間后,發現內存配置偏少了, 需要添加內存。這時候申請一臺新的機器加入到集群中,將舊機器下線即可。
- 運行多年的 ubuntu 12.04 官方已經不再維護, 需要全量替換,工作量相當大。好的方法就是使用全新的服務器替換舊服務器。
- 當發生故障,主機無法恢復時, 直接申請新服務器加入集群即可。
2. 容器主機的規格是如何確定的?
我們起初上線了 8 核 32G規格的虛擬機。 運維過程中發現了如下的問題
- 部分應用啟動時就需要16G 內存。 32G 的虛擬機顯得捉襟見肘,一臺主機只能運行一個此類應用。 出故障時,集群中可能沒有滿足條件的主機可供遷移。
- 系統彈性較弱。 以80% 為警戒線,每臺主機的彈性內存空間為 6.4G . 很多應用在突發請求時,會占用遠超 6.4G的內存,導致主機內存耗盡。
- 內存是獨占性資源,即使程序沒有任何請求, 內存也會被獨占。其結果是一臺主機上的內存占用特別高。 CPU 資源占用比率則相對較少。
從以上角度來看, 容器主機的規格越大越好
后來,我們將主機規格調整為 32核 128G (為什么不用物理機請參考,為什么考慮重啟速度?,為什么資源利用率不是問題? )。 運維過程中發現了如下問題
- 主機故障時,影響范圍很大。當內存使用率為 60% 的時候, 我們運行了 72個容器, 涉及到 40個業務。 當主機故障時,會同時影響40個業務。
- 太多的進程數。 監控中發現有 too many process 的報警, 這在之前32G虛擬機時,不太會出現。
- 文件描述符數量,tcp 最大連接數量等等, 都有可能被用滿。
從以上角度來看, 容器主機的規格越小越好。 物理機的容量更加大(內存可以配置到 512G 甚至更高), 故障時,影響范圍更加巨大。
3. CPU與內存的配比是如何確定的?
8核32G 的配比為 1:4 ,從以往的運行監控數據來看。當內存使用到 90%左右時, CPU使用率 40%。
- 為了有效利用資源,以 1:8 配比。 比如 16核128G
- 為了穩定性和資源彈性,仍然以 1:4 配比 。 比如 16核64G
目前在資源利用率上,docker已經做得很好, 主要考慮穩定性和彈性。 采用 1:4 的配比。
4. 一個環境中配置幾臺主機?
假設一個環境中有2臺主機, 當其中一臺主機故障時,為了能將業務遷移到另外一臺主機, 這兩臺主機的利用率最高可以到 50% 。
為了給集群提供彈性, 當有主機故障時, 其他主機要有能力承載這臺主機上的業務。 我們可以算出相關關系, N為集群主機數量, M為能夠承受損壞的主機數量
(N - 1 )* (1 - usage% ) = M * usage%
N = (M*usage%) / (1- usage%) + 1
我們看一下,為了能夠承受一臺主機完全損壞, N= usage%/ ( 1- usage%) + 1 , usage% = N-1 /N
集群利用率和集群主機數量關系為
- 2 臺主機 50%
- 3 臺主機 66.6%
- 4 臺主機 75%
- 5 臺主機 80%
- 6 臺主機 83%
我們挑選一個合理且方便計算的利用率 80% , 那么集群中最少需要5臺主機。
結合主機的規格,我們可以算出一個集群的最小容量。
- 16核 64G, 集群容量最小為 80核320G
- 32核128G,集群容量最小為 160核640G
按照一個業務占用 2G (QA環境經驗值)內存來算 , 集群可承載的業務數量為
- 16核 64G, 承載 128個
- 32核128G,承載 384個
5. 一臺主機是既是一個共享域, 又是一個沖突域。
- 共享域主機的資源越多越好。 這樣可以提供更好的資源彈性。 從而提高系統穩定性。
- 沖突域主機的資源越少越好,故障時,影響范圍可控。
過大或過小的規格,都會導致問題。 目前合理的規格為 16核64G, 或者 32核128G , 一個集群主機數量不少于5臺.