Kubernetes集群选择最佳设置推荐方案 - daniele


在编写任何代码之前如果要为Kubernetes集群选择最佳设置怎么办?我构建了一个集群计算器,以帮助您选择群集大小和最佳实例,这篇文章会告诉您在下面之间如何平衡:

  • -成本(已用与浪费)
  • -调整交付周期
  • -过多设置

事实证明Kubernetes中的许多设置都是相关的。如果更改Pods请求,则可能需要不同的节点实例和自动缩放设置。同样,更改节点实例会对扩展,资源利用率和成本产生影响。
 
如何在群集节点中分配资源?
Kubernetes集群中部署的Pod会消耗内存,CPU和存储等资源,但是并非Kubernetes节点中的所有CPU和内存都可用于运行Pod。
操作系统和kubelet也需要内存和CPU,因此您应该照顾这些额外的资源。
如果您仔细查看单个节点,则可以将可用资源划分为:
  1. 运行操作系统和系统守护程序所需的资源,例如SSH,systemd等。
  2. 运行Kubernetes代理所需的资源,例如Kubelet,容器运行时,节点问题检测器等。
  3. Pods可用的资源。
  4. eviction threshold.保留的资源。

所有这些配额都是可定制的。
但是请注意,为操作系统保留100MB内存并不意味着操作系统仅限于使用该数量。
它可能会使用更多(或更少)资源-您只是在尽力而为地分配和估计内存和CPU使用率。
但是,您如何决定如何分配资源?
不幸的是,由于它取决于您的群集,所以没有固定的答案。
但是,主要的托管Kubernetes服务Google Kubernetes Engine(GKE)Azure Kubernetes Service(AKS)Elastic Kubernetes Service(EKS)已经达成共识,值得讨论它们如何划分可用资源。
 
Google Kubernetes引擎(GKE)
Google Kubernetes Engine(GKE)具有明确定义的规则列表,用于为Node分配内存和CPU
对于内存资源,GKE保留以下内容:
  • 内存少于1 GB的计算机为255 MiB
  • 前4GB内存的25%
  • 接下来的4GB内存的20%(最多8GB)
  • 接下来的8GB内存的10%(最多16GB)
  • 接下来的112GB内存的6%(最高128GB)
  • 超过128GB的任何内存的2%

对于CPU资源,GKE保留以下内容:
  • 第一核心的6%
  • 下一个核心的1%(最多2个核心)
  • 接下来的2个核心的0.5%(最多4个核心)
  • 4个核以上的任何核的0.25%

 
弹性Kubernetes服务(EKS)
EKS为​​每个节点保留以下内存:
Reserved memory = 255MiB + 11MiB * MAX_POD_PER_INSTANCE
什么MAX_POD_PER_INSTANCE啊,在Amazon Web Service中,每种实例类型对其可以运行的Pod数量都有不同的上限。
例如,一个m5.large实例只能运行29个Pod,但一个m5.4xlarge实例最多可以运行234个。
如果选择m5.large,则为kubelet和代理保留的内存为:
Reserved memory = 255Mi + 11MiB * 29 = 574MiB

对于CPU资源,EKS复制GKE实现并保留:

  • 第一核心的6%
  • 下一个核心的1%(最多2个核心)
  • 接下来的2个核心的0.5%(最多4个核心)
  • 4个核以上的任何核的0.25%

 
Azure Kubernetes服务
Azure提供了有关其资源分配的详细说明
为Kubelet保留的内存为:
  • 内存少于1 GB的计算机为255 MiB
  • 前4GB内存的25%
  • 接下来的4GB内存的20%(最多8GB)
  • 接下来的8GB内存的10%(最多16GB)
  • 接下来的112GB内存的6%(最高128GB)
  • 超过128GB的任何内存的2%

请注意,分配方式与Google Kubernetes Engine(GKE)相同。

  
概括
您可能会得出这样的结论:在最大化可分配内存和CPU的情况下,较大的实例是必经之路。
不幸的是,成本只是设计集群时的一个因素。
如果您正在运行大型节点,则还应考虑:

  1. 在节点上运行的Kubernetes代理的开销-例如容器运行时(例如Docker),kubelet和cAdvisor。
  2. 您的高可用性(HA)策略。可以将Pod部署到选定数量的节点上
  3. 爆炸半径。如果您只有几个节点,那么发生故障的节点的影响会比拥有多个节点的影响大。
  4. 自动缩放的成本效益较差,因为下一个增量是一个(很大)节点。

较小的节点也不是灵丹妙药。
因此,您应该为运行的工作负载类型设计集群,而不要遵循最常见的选择。