你的Kubernetes集群健康吗?这里有5种检验方法

2023年 7月 9日 54.2k 0

   Kubernetes 是一门极其智能化的科学技术,但是如果搞错了方向,它就会以一种非预期的方式响应. 对于大部分 “聪明的” 科技来说, 其智能化程度取决于操作者。  为了通过使用Kubernetes组建团队来达到成功巅峰,其中最关键的是每一位组员能清晰地掌握Kubernetes 集群。这里有5种方法可以使工程师在建立Kubernetes集群时能最好的鉴定出任何未结的任务,并且尽可能确保负载在最健康的水平(想要更深入的了解 Kubernetes 的可观察性,请查阅我们的电子书 Kubernetes Observability)。

   幸运的是, 在 Kubernetes 环境中有技术可以收集日志、性能指标、事件和安全警告,从而帮助我们模拟各种集群的健康水平。这些收集器从Kubernetes 集群的所有组件中收集数据,它们汇集起来可以得到一个 集群健康状况的 高层级的视图, 并且可以及时深入的了解诸如 资源(resource), 使用性能(utilization), 配置(configuration)错误和其他问题。

  1. 在所有的pod库中设置 CPU requests(请求)和limits(限额)

  requests(请求)和limits(限额)是k8s的一种机制,该机制用来给pods 自动分配 像CPU和内存使用量这样的可用资源 。CPU 是用毫核来定义的, 所以1000毫核等于1核。requests(请求)是预期给定容器所需要的资源使用量,limits(限额), 换句话说,就是一个容器被允许使用的资源量的实际上限。 

确保所有的pods 都指定requests(请求)。一个最佳的实践是给这些pods 指定1核或者更少,如果需要更多算力的话,就添加额外的副本。还有很重要的需要注意的一点, 如果你配置的太高, 比如2000毫核(2核),但是只有1核可用,那么这个pod将永远不会被调度。 在第5步中,我会告诉你如何去重复确认哪些未被调度的pods。

  确保所有的pods 都有CPUlimits(限额)。 如上面提到的,limits(限额)是上限, 所以Kubernetes不允许pod 使用超出limits(限额)所定义的CPU 数量。即便如此,CPU 有点宽容,因为它被认为是一种可压缩资源。如果pod 达到CPU limits(限额), 它将不会被终止, 而是被限制。你的CPU将被限制,所以你可能会遇到性能问题。

  2. 在所有的pods 上设置内存requests(请求)和limits(限额) 

  确保为所有pod设置了内存requests(请求):内存requests(请求)是指你认为pod将消耗多少数据。与CPU一样,如果内存requests(请求)大于最大节点,Kubernetes也不会调度pod。

    确保为所有pod设置了内存limits(限额):内存limits(限额)是允许pod使用多少内存的硬上限。与CPU不同,内存是不可压缩的,不能被限制。如果一个容器超过了它的内存limits(限额),那么它将被终止。

3.审核资源配额

    Kubernetes的最佳健康状况的另一检查项是— 是否不足或过度配置资源。如果可用CPU和内存过剩,那么消耗不足,很可能有浪费。另一方面,如果接近100%的利用率,则在需要扩展或有意外负载时可能会遇到问题。

    检查剩余的pod容量。一个有用的Kubernete衡量标准是“kube_node_status_allocatable”,这是Kubernetes在给定平均pod资源利用率的情况下,对一个节点将容纳多少个pod的估计。我们可以把剩余的pod容量加起来,粗略估计一下在不遇到问题的情况下可以扩展多少。 

检查总的CPU使用率百分比、请求的CPU百分比与CPU limits(限额)百分比:总的CPU使用率表示现在使用了多少,requests(请求)表示预计可能需要多少,而limits(限额)是我们设置的硬性上限。

    在下面的例子中,我们只使用了可用算力的2.5%,供应远超实际使用量,而且还可能会减少。相比之下,我们的CPUrequests(请求)是46%,因此我们原以为我们可能需要用到的比实际使用的要多得多。(出现这种情况)要么是预估错误,要么就是有计划以外的突发需求。

    最后,我们的CPU Burstable告诉我们所有的CPU limits(限额)总和。由于其低于requests(请求)的CPU资源量,我们可能要回去检查我们的限制设置。要么是我们对每一个pod都没有设置limits(限额),要么我们的limits(限额)配置错误。

    检查总内存使用量百分比、内存requests(请求)百分比与内存limits(限额)百分比。就和检查CPU一样,我们可以检查内存是否配置过大。仅仅3.8%的利用率告诉我们,我们的确实供应过剩了,但我们可以舒适地长期扩展。 

   

 

 

 

4. 检查节点间的Pod分布

   当我们研究pod是如何在集群中的可用节点上分配时,我们想要一个大致均等的分配。如果某些节点完全超载或欠载,这可能意味着一个值得调查的更大问题出现了。

    需要检查的一些可能导致分配不均的因素包括:

    节点亲和力(node affinity)。 亲和力(Affinity)是一个pod设置项,使它们偏好具有某些属性的节点。例如,某些pod可能需要在带有GPU或SSD的计算机上运行,或者某些pod可能需要具有特定安全隔离或特定策略的节点。重复检查关联设置可以帮助缩小 导致不均匀分配的原因的范围,并降低严峻问题发生的可能性。

    污点(taints)和容忍(tolerations)。污点与亲和力相反。这些是节点的设置项,给节点设置污点,从而使pod 难以调度到这些节点。如果要为特定pod保留节点,或者为了确保该节点上的pod对可用资源具有完全访问权限,则可以使用此选项。    limits(限额)和requests(请求):回顾limits(限额)和requests(请求)设置项。这常常是问题的起因,以至于它值得在本文的三个部分中提及。如果调度器没有关于pods需要什么的正确信息,那么它的调度工作将会做的很差。

   5.检查pod是否处于不良状态

在Kubernetes环境中,当前的状态每时每刻都在变化,因此过度关注每一个终止的pod会慢慢侵蚀你的时间和理智。然而,为了确保它与您基于当前集群中的事件来作出的预期相符。以下所列项值得关注。 

  *Nodes not ready:节点可能由于多种原因而进入此状态,但通常是因为内存或磁盘空间不足。

  *Unscheduled pods:pod通常会由于调度器无法满足CPU或内存requests(请求) 而以未被调度的状态终止。重复检查你的集群是否有足够的podsrequests(请求)的可用资源。

   *Pods that failed to create :Pods在创建时失败,通常是因为镜像问题,比如启动脚本依赖项缺失。这种情况,建议回到原点。

   *Container restarts:只有一部分容器重启是不用担心的,但当你看到大量的(容器重启)则可能意味着pod处于OOMKill(内存不足而被杀死)状态。内存不足是Kubernetes中最常见的错误(error)之一,可能是由于镜像问题、及其引发的依赖问题或意外、limits(限额)和requests(请求)问题引起的。

   这些集群健康的最佳实践可以限制Kubernetes环境中的意外行为,并确保您不会在将来遇到可伸缩性问题。这些也是帮你回答那些无定形问题的一个起点,比如,“我的Kubernetes集群健康吗?”,如果所有这些项都是绿色的,那么您的集群可能非常健康,那么您可以轻松休息了。

    想要更深入的了解 Kubernetes 的可观察性,请查阅我们的电子书 Kubernetes Observability

 

相关文章

KubeSphere 部署向量数据库 Milvus 实战指南
探索 Kubernetes 持久化存储之 Longhorn 初窥门径
征服 Docker 镜像访问限制!KubeSphere v3.4.1 成功部署全攻略
那些年在 Terraform 上吃到的糖和踩过的坑
无需 Kubernetes 测试 Kubernetes 网络实现
Kubernetes v1.31 中的移除和主要变更

发布评论