首页 > 其他分享 >Kubernetes-POD的QoS

Kubernetes-POD的QoS

时间:2024-08-09 21:16:45浏览次数:15  
标签:QoS Kubernetes oom 内存 POD Pod 资源

目录

背景

今天开发团队反馈,测试环境中部分业务功能无法正常使用。经过初步排查,发现某个业务Pod在一天内重启了10次,因此需要进一步调查原因。

问题分析

首先,我查看了Pod的日志,发现JVM并未抛出任何错误,服务却直接重启了。这表明进程是被强制终止的,初步判断可能是Pod达到内存上限后被Kubernetes触发了OOM(Out Of Memory)杀死进程的机制。
接下来,我检查了Pod的事件信息,发现以下关键点:

  • Last State: Terminated
  • Exit Code: 137
Containers:
  container-prod--:
    Container ID:   --
    Image:          --
    Image ID:       docker-pullable://--
    Port:           8080/TCP
    Host Port:      0/TCP
    State:          Running
      Started:      Thu, 08 Aug 2024 11:40:01 +0800
    Last State:     Terminated
      Reason:       Error
      Exit Code:    137
      Started:      Thu, 08 Aug 2024 11:27:38 +0800
      Finished:     Thu, 08 Aug 2024 11:39:58 +0800
    Ready:          True
    Restart Count:  8
    Limits:
      cpu:     8
      memory:  7Gi
    Requests:
      cpu:        100m
      memory:     512Mi

这个错误码表示Pod的进程被SIGKILL信号强制终止。通常情况下,这是因为Pod达到了内存上限而被Kubernetes杀死。但是,当我查看Pod的内存监控时,发现Pod被杀前的内存使用量仅为3G左右,远未达到设置的7G上限。此时,问题变得更加复杂。

进一步排查

为了找出原因,我查询了Pod所在的节点,并进入该节点查看其内存使用率。结果发现,宿主机的内存使用率已经达到了98%。

问题原因

这就引出了关键问题:为什么Pod的内存未达到上限,却依然被Kubernetes杀死?
经过分析,得出了以下几点结论:

  1. 内存上限未达,Exit Code 137:
    • 如果Pod因内存上限被杀,虽然Exit Code依然是137,但Reason会显示为OOMKilled,而不是Error
  2. 宿主机内存耗尽,触发Kubernetes保护机制:
    • 宿主机内存耗尽时,Kubernetes会启动保护机制,开始驱逐(evict)一些Pod来释放资源。
  3. QoS机制的影响:
    • 为什么在整个集群中,只有这个Pod反复被驱逐,而其他服务未受影响?原因在于Kubernetes的QoS(Quality of Service)机制。当宿主机资源耗尽时,Kubernetes会按照QoS的优先级,选择驱逐低优先级的Pod来释放资源。

最终,定位到的原因是这个Pod的QoS优先级较低,因此在宿主机资源紧张时,成为了驱逐的首选。
那么问题来了,什么是Pod的QoS?

Pod的QoS服务质量等级

QoS,指的是Quality of Service,也就是k8s用来标记各个pod对于资源使用情况的质量,QoS会直接影响当节点资源耗尽的时候k8s对pod进行evict的决策
image.png
QoS(Quality of Service),可译为 "服务质量等级",或者译作 "服务质量保证",是作用在 Pod 上的一个配置,当 Kubernetes 创建一个 Pod 时,它就会给这个 Pod 分配一个 QoS 等级。
k8s会以pod的描述文件里的资源限制,对pod进行分级:
Guaranteed (该策略下,设置的requests 等于 limits)

  • pod.spec.containers[].resources中会存在cpu或memory的request和limit。顾名思义是该容器对资源的最低要求和最高使用量限制。如果我们配置了limit,没有配置request,默认会以limit的值来定义request。

BestEffort(该策略下,没有设置requests 、 limits)

  • 当pod的描述文档中没有resource.limit、resource.request相关的配置时,意味着这个容器想跑多少资源就跑多少资源,其资源使用上限实际上即所在node的capacity。

Burstable(该策略下,设置的requests 小于 limits)

  • 当resource.limit和resource.request以上述两种方式以外的形式配置的时候,就会采用本模式。 QoS目前只用cpu和memory来描述,其中cpu可压缩资源,当一个容器的cpu使用率超过limit时会被进行流控,而当内存超过limit时则会被oom_kill。这里kubelet是通过自己计算容器的oom_score,确认相应的linux进程的oom_adj,oom_adj最高的进程最先被oom_kill。 Guaranteed模式的容器oom_score最小:-998,对应的oom_adj为0或1,BestEffort模式则是1000,Burstable模式的oom_score随着其内存使用状况浮动,但会处在2-1000之间。

当节点资源耗尽的时候,k8s会按照BestEffort->Burstable(该策略的pods如有多个,也是按照内存使用率来由高到低地终止)->Guaranteed这样的优先级去选择杀死pod去释放资源。

结论

通过这次排查,我们确认了Pod被频繁重启的原因是宿主机内存不足,而非Pod本身的问题。要解决这个问题,可以考虑以下优化措施:

  • 调整Pod的资源请求和限制,以提高其QoS优先级。
  • 监控和优化集群资源的分配,防止节点内存耗尽的情况发生。
  • 在必要时,增加集群的资源,以应对更高的负载需求。

通过这些措施,可以减少类似问题的发生,确保服务的稳定运行。

标签:QoS,Kubernetes,oom,内存,POD,Pod,资源
From: https://www.cnblogs.com/Unstoppable9527/p/18351519

相关文章

  • Kubernetes-kubeapps-install
    Helminstall[root@rocky01~]#curl-fsSL-oget_helm.shhttps://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3[root@rocky01~]#chmod700get_helm.sh&&./get_helm.shKubeappsinstall[root@rocky01~]#helmrepoaddbitnamihttp......
  • Kubernetes:使用 K3s 为 CoreDNS 提供独立的 resolv.conf
     PodDNS解析的默认设置是CoreDNS使用worker节点底层操作系统的设置。如果您的KubernetesVM已加入多个网络或searchdomains,这可能会导致意外结果以及性能问题。如果您正在使用K3s,则可以为Kubelet提供一个独立的resolv.conf文件,该文件将由CoreDNS使用,并且不会与操......
  • Kubernetes对象YAML文件的基本格式详解
    简介  Kubernetes(K8s)作为云原生时代的基础设施核心,其配置文件通常采用YAML格式来定义和管理各种资源对象。YAML(YAMLAin'tMarkupLanguage)因其简洁、易读和易写的特性,在Kubernetes中得到了广泛应用。本文将详细探讨Kubernetes对象YAML文件的基本格式,重点解析GVK(Group、Ve......
  • 在K8S中,说下Pod亲和性的理解?
    在Kubernetes中,Pod亲和性(PodAffinity)是一种策略,它允许你根据特定的规则来控制Pod在集群中的分布。使用Pod亲和性,你可以定义Pod应该或不应该与哪些节点或Pod一起运行。这有助于优化资源使用、提高应用性能、确保数据的局部性以及满足特定的业务需求。Pod亲和性主要有以下几种类型......
  • 在K8S中,flannel可以固定节点IP和Pod的IP地址吗?
    在Kubernetes中,Flannel负责为Pod提供跨节点的网络连接,但它本身并不直接分配Pod的IP地址。Pod的IP地址是由Kubernetes的网络插件分配的,Flannel只是在这个过程中起到辅助作用。然而,Flannel可以配置为使用特定的网络模式,以支持更灵活的IP地址管理。以下是一些与IP地址管理相关的方面......
  • 在K8S中,说下Pod污点与容忍的理解?
    在Kubernetes(K8S)中,Pod污点(Taints)和容忍度(Tolerations)是两种用于控制Pod调度到特定节点的机制。它们相互配合,允许集群管理员更精细地控制Pod的部署位置,以确保资源的高效利用和服务的稳定运行。一、Pod污点(Taints)定义与目的:污点是一种应用于节点的属性,用于排斥那些不能容忍这些......
  • 【Kubernetes】pod状态与故障排查
    一、Pod启动阶段(相位phase)pod创建完之后,一直到持久运行起来,中间有很多步骤,也就有很多出错的可能,因此会有很多不同的状态。Pod的启动过程如下:0)controller-manager管理的控制器创建Pod资源1)scheduler调度器根据调度算法选择最适合的node节点调度Pod2)kubelet拉取镜像3)kubel......
  • 《Kubernetes企业级云原生运维实战》(李振良).pdf
    本书是一本实用性很强的Kubernetes运维实战指南,旨在为容器云平台的建设、应用和运维过程提供全面的指导。作者结合丰富的生产环境经验,深入探讨作为一名Kubernetes工程师必备的核心技能,包括部署、存储、网络、安全、日志、监控、CI/CD等方面的技术。本书结合大量的实际案例,......
  • kubernetes集群部署postgre 12.6数据库服务
    背景:因业务上线需要,研发中心要求在kubernetes测试集群部署一个postgre12.6的数据库,用于业务功能调试。一、实施部署postgre数据库: 1、拉取postgre12.6的镜像:[root@harbor-02~]#dockerpullregistry.cn-hangzhou.aliyuncs.com/images-speed-up/postgres:12.62017-l......
  • kubernetes 核心实战 - 存储 - 3
    Kubernetes核心实战-存储介绍1.Kubernetes存储概念及其关系在Kubernetes中,存储的几个核心概念及其关系如下:Volume:在Pod内部使用的一块存储,生命周期与Pod一致。不同类型的Volumes提供不同的存储功能,例如emptyDir、hostPath、configMap等。PersistentV......