前言
容器宿主机的选择需要考虑如下几个问题
- 用物理机还是虚拟机?
- 用多大规格的服务器?
- 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台.
网友评论