你真的理解 Kubernetes 中的 requests 和 limits 吗?

news2024/9/20 5:55:14

 你真的理解 Kubernetes 中的 requests 和 limits 吗?

https://www.cnblogs.com/kubesphere/p/14632890.htmlicon-default.png?t=O83Ahttps://www.cnblogs.com/kubesphere/p/14632890.html在 Kubernetes 集群中部署资源的时候,你是否经常遇到以下情形:

  1. 经常在 Kubernetes 集群种部署负载的时候不设置 CPU requests 或将 CPU requests 设置得过低(这样“看上去”就可以在每个节点上容纳更多 Pod )。

    在业务比较繁忙的时候,节点的 CPU 全负荷运行。业务延迟明显增加,有时甚至机器会莫名其妙地进入 CPU 软死锁等“假死”状态。

  2. 类似地,部署负载的时候,不设置内存 requests 或者内存 requests 设置得过低,这时会发现有些 Pod 会不断地失败重启。

    而不断重启的这些 Pod 通常跑的是 Java 业务应用。但是这些 Java 应用本地调试运行地时候明明都是正常的。

  3. 在 Kubernetes 集群中,集群负载并不是完全均匀地在节点间分配的,通常内存不均匀分配的情况较为突出,集群中某些节点的内存使用率明显高于其他节点。

    Kubernetes 作为一个众所周知的云原生分布式容器编排系统,一个所谓的事实上标准,其调度器不是应该保证资源的均匀分配吗?

如果在业务高峰时间遇到上述问题,并且机器已经 hang 住甚至无法远程 ssh 登陆,那么通常留给集群管理员的只剩下重启集群这一个选项。

如果你遇到过上面类似的情形,想了解如何规避相关问题或者你是 Kubernetes 运维开发人员,想对这类问题的本质一探究竟,那么请耐心阅读下面的章节。

我们会先对这类问题做一个定性分析,并给出避免此类问题的最佳实践,最后如果你对 Kubernetes requests 和 limits 的底层机制感兴趣,我们可以从源码角度做进一步地分析,做到“知其然也知其所以然”。

 

 

问题分析

资源限制

您可以指定应用程序能使用的资源上限,包括 CPU、内存、GPU,防止占用过多资源。

  • CPU 限制显示在清单文件中的 .spec.containers[].resources.limits.cpu实际用量可以短时间超过 CPU 限制,容器不会被停止。
  • 内存限制显示在清单文件中的 .spec.containers[].resources.limits.memory。实际用量不能超过内存限制,如果超过了,容器可能会被停止或者被调度到其他资源充足的机器上。

对于情形 1

首先我们需要知道对于 CPU 和内存这 2 类资源,他们是有一定区别的。 CPU 属于可压缩资源,其中 CPU 资源的分配和管理是 Linux 内核借助于完全公平调度算法( CFS )和 Cgroup 机制共同完成的。

简单地讲,如果 Pod 中服务使用 CPU 超过设置的 CPU limits, Pod 的 CPU 资源会被限流( throttled )。对于没有设置limit的 Pod ,一旦节点的空闲 CPU 资源耗尽,之前分配的 CPU 资源会逐渐减少。

不管是上面的哪种情况,最终的结果都是 Pod 已经越来越无法承载外部更多的请求,表现为应用延时增加,响应变慢。

对于情形 2

内存属于不可压缩资源, Pod 之间是无法共享的,完全独占的,这也就意味着资源一旦耗尽或者不足,分配新的资源一定是会失败的。有的 Pod 内部进程在初始化启动时会提前开辟出一段内存空间。

比如 JVM 虚拟机在启动的时候会申请一段内存空间。如果内存 requests 指定的数值小于 JVM 虚拟机向系统申请的内存,导致内存申请失败( oom-kill ),从而 Pod 出现不断地失败重启。

对于情形 3

实际上在创建 Pod 的过程中,一方面, Kubernetes 需要拨备包含 CPU 和内存在内的多种资源,这里的资源均衡是包含 CPU 和内存在内的所有资源的综合考量。

另一方面, Kubernetes 内置的调度算法不仅仅涉及到“最小资源分配节点”,还会把其他诸如 Pod 亲和性等因素考虑在内。并且 Kubernetes 调度基于的是资源的 requests 数值,而之所以往往观察到的是内存分布不够均衡,是因为对于应用来说,相比于其他资源,内存一般是更紧缺的一类资源。

Kubernetes 的调度机制是基于当前的状态。比如当出现新的 Pod 进行调度时,调度程序会根据其当时对 Kubernetes 集群的资源描述做出最佳调度决定。

但是 Kubernetes 集群是非常动态的。比如一个节点为了维护,我们先执行了驱逐操作,这个节点上的所有 Pod 会被驱逐到其他节点去,当我们维护完成后,之前的 Pod 并不会自动回到该节点上来,因为 Pod 一旦被绑定了节点是不会触发重新调度的。

 

 

最佳实践

由上面的分析我们可以看到,集群的稳定性直接决定了其上运行的业务应用的稳定性。而临时性的资源短缺往往是导致集群不稳定的主要因素。集群一旦不稳定,轻则业务应用的性能下降,重则出现相关结点不可用。

那么如何提高集群的稳定性呢?

一方面,可以通过编辑 Kubelet 配置文件来预留一部分系统资源,从而保证当可用计算资源较少时 kubelet 所在节点的稳定性。这在处理如内存和硬盘之类的不可压缩资源时尤为重要。

另一方面,通过合理地设置 Pod 的 QoS 可以进一步提高集群稳定性:不同 QoS 的 Pod 具有不同的 OOM 分数,当出现资源不足时,集群会优先 Kill 掉 Best-Effort 类型的 Pod ,其次是 Burstable 类型的 Pod ,最后是Guaranteed 类型的 Pod 。

因此,如果资源充足,可将 QoS pods 类型均设置为 Guaranteed 。用计算资源换业务性能和稳定性,减少排查问题时间和成本。同时如果想更好的提高资源利用率,业务服务也可以设置为 Guaranteed ,而其他服务根据重要程度可分别设置为 BurstableBest-Effort

下面我们会以 Kubesphere 平台为例,演示如何方便优雅地配置 Pod 相关的资源。

 

 

相关概念

在进行演示之前,让我们再回顾一下 Kubernetes 相关概念。

requests 与 limits 简介

为了实现 Kubernetes 集群中资源的有效调度和充分利用, Kubernetes 采用requestslimits两种限制类型来对资源进行容器粒度的分配。每一个容器都可以独立地设定相应的requestslimits。这 2 个参数是通过每个容器 containerSpec 的 resources 字段进行设置的。一般来说,在调度的时候requests比较重要,在运行时limits比较重要。

resources:  
    requests:    
        cpu: 50m
        memory: 50Mi
   limits:    
        cpu: 100m
        memory: 100Mi

requests定义了对应容器需要的最小资源量。这句话的含义是,举例来讲,比如对于一个 Spring Boot 业务容器,这里的requests必须是容器镜像中 JVM 虚拟机需要占用的最少资源。如果这里把 Pod 的内存requests指定为 10Mi ,显然是不合理的,JVM 实际占用的内存 Xms 超出了 Kubernetes 分配给 Pod 的内存,导致 Pod 内存溢出,从而 Kubernetes 不断重启 Pod 。

limits定义了这个容器最大可以消耗的资源上限,防止过量消耗资源导致资源短缺甚至宕机。特别的,设置为 0 表示对使用的资源不做限制。值得一提的是,当设置limits而没有设置requests时,Kubernetes 默认令requests等于limits

进一步可以把requestslimits描述的资源分为 2 类:可压缩资源(例如 CPU )和不可压缩资源(例如内存)。合理地设置limits参数对于不可压缩资源来讲尤为重要。

前面我们已经知道requests参数会对最终的 Kubernetes 调度结果起到直接的显而易见的影响。借助于 Linux 内核 Cgroup 机制,limits参数实际上是被 Kubernetes 用来约束分配给进程的资源。对于内存参数而言,实际上就是告诉 Linux 内核什么时候相关容器进程可以为了清理空间而被杀死( oom-kill )。

总结一下:

  • 对于 CPU,如果 Pod 中服务使用 CPU 超过设置的limits,Pod 不会被 kill 掉但会被限制。如果没有设置 limits ,pod 可以使用全部空闲的 CPU 资源。

  • 对于内存,当一个 Pod 使用内存超过了设置的limits,Pod 中 container 的进程会被 kernel 因 OOM kill 掉。当 container 因为 OOM 被 kill 掉时,系统倾向于在其原所在的机器上重启该 container 或本机或其他重新创建一个 Pod。

  • 0 <= requests <=Node Allocatable, requests <= limits <= Infinity

Pod 的服务质量( QoS )

Kubernetes 创建 Pod 时就给它指定了下列一种 QoS 类:Guaranteed,Burstable,BestEffort。

  • Guaranteed:Pod 中的每个容器,包含初始化容器,必须指定内存和 CPU 的requestslimits,并且两者要相等。

  • Burstable:Pod 不符合 Guaranteed QoS 类的标准;Pod 中至少一个容器具有内存或 CPU requests

  • BestEffort:Pod 中的容器必须没有设置内存和 CPU requestslimits

结合结点上 Kubelet 的 CPU 管理策略,可以对指定 Pod 进行绑核操作,参见官方文档[2]。

 

 

准备工作

您需要创建一个企业空间、一个项目和一个帐户 ( ws-admin ),务必邀请该帐户到项目中并赋予 admin 角色。有关更多信息,请参见创建企业空间、项目、帐户和角色。

设置项目配额( Resource Quotas )

  1. 进入项目基本信息界面,依次直接点击“项目管理 -> 编辑配额”进入项目的配额设置页面。

  1. 进入项目配额页面,为该项目分别指定requestslimits配额。

设置项目配额的有 2 方面的作用:

  • 限定了该项目下所有 pod 指定的requestslimits之和分别要小于等与这里指定的项目的总requestslimits
  • 如果在项目中创建任何一个容器没有指定requests或者limits,那么相应的资源会创建报错,并会以事件的形式给出报错提示。

可以看到,设定项目配额以后,在该项目中创建任何容器都需要指定requestslimits,隐含实现了所谓的“code is law”,即人人都需要遵守的规则。

Kubesphere 中的项目配额等价于 Kubernetes 中的 resource quotas ,项目配额除了能够以项目为单位管理 CPU 和内存的使用使用分配情况,还能够管理其他类型的资源数目等,详细信息参见资源配额。

 

 

设置容器资源的默认请求

上面我们已经讨论过项目中开启了配额以后,那么之后创建的 Pod 必须明确指定相应的 requests 和 limits 。事实上,在实际的测试或者生产环境当中,大部分 Pod 的 requests 和 limits 是高度相近甚至完全相同的。

有没有办法在项目中,事先设定好默认的缺省 requests 和 limits ,当用户没有指定容器的 requests 和 limits 时,直接应用默认值,若 Pod 已经指定 requests 和 limits 是否直接跳过呢?答案是肯定的。

  1. 进入项目基本信息界面,依次直接点击“项目管理 -> 编辑资源默认请求”进入项目的默认请求设置页面。

  1. 进入项目配额页面,为该项目分别指定 CPU 和内存的默认值。

KubeSphere 中的项目容器资源默认请求是借助于 Kubernetes 中的 Limit Ranges ,目前 KubeSphere 支持 CPU 和内存的requestslimits的默认值设定。

前面我们已经了解到,对于一些关键的业务容器,通常其流量和负载相比于其他 Pod 都是比较高的,对于这类容器的requestslimits需要具体问题具体分析。

分析的维度是多个方面的,例如该业务容器是 CPU 密集型的,还是 IO 密集型的。是单点的还是高可用的,这个服务的上游和下游是谁等等。

另一方面,在生产环境中这类业务容器的负载从时间维度看的话,往往是具有周期性的。因此,业务容器的历史监控数据可以在参数设置方面提供重要的参考价值。

而 KubeSphere 在最初的设计中,就已经在架构层面考虑到了这点,将 Prometheus 组件无缝集成到 KubeSphere 平台中,并提供纵向上至集群层级,下至 Pod 层级的完整的监控体系。横向涵盖 CPU ,内存,网络,存储等。

一般,requests值可以设定为历史数据的均值,而limits要大于历史数据的均值,最终数值还需要结合具体情况做一些小的调整。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2118635.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

客户案例 | 使用 BigQuery 和 AutoML 消除电视行业的数据孤岛和分散

在这个客户案例中&#xff0c;我们会介绍一家大众媒体公司如何利用 BigQuery 和 AutoML 消除数据孤岛和分散。通过参考真实的 Google Cloud 案例研究&#xff0c;我们总结了 Google Cloud 的服务和产品如何使客户的业务受益。 Cloud Ace - 谷歌云 | 谷歌云全球战略合作伙伴 | …

《花100块做个摸鱼小网站! 》第六篇—将小网站部署到云服务器上

⭐️基础链接导航⭐️ 服务器 → ☁️ 阿里云活动地址 看样例 → &#x1f41f; 摸鱼小网站地址 学代码 → &#x1f4bb; 源码库地址 一、前言 到这一篇我们终于把环境搭好&#xff0c;也做好了几个热搜小组件&#xff0c;为了让我们方便展示成果或者方便自己摸鱼&#xff0c…

【CSS in Depth 2 精译_026】4.4 Flexbox 元素对齐、间距等细节处理(上)

当前内容所在位置&#xff08;可进入专栏查看其他译好的章节内容&#xff09; 第一章 层叠、优先级与继承&#xff08;已完结&#xff09; 1.1 层叠1.2 继承1.3 特殊值1.4 简写属性1.5 CSS 渐进式增强技术1.6 本章小结 第二章 相对单位&#xff08;已完结&#xff09; 2.1 相对…

HTML深度探索 :img应用与实践

HTML深度探索 &#xff1a;img应用与实践 1、定义和用法2、图像格式3、常用属性4、预加载和懒加载4.1 预加载4.2 懒加载 1、定义和用法 HTML 元素 <img>将一张图像嵌入文档。 从技术上讲&#xff0c;实际上并没有将图像插入到网页中&#xff0c;而是将图像链接到了网页。…

17种最佳的联盟营销工具,助你赚取更多佣金

通过最新、最先进的工具获得竞争优势&#xff0c;并启动你的联盟营销策略&#xff0c;以提高效率和节省&#xff08;大量&#xff09;时间。 如果你销售联盟产品或服务&#xff0c;你可能知道&#xff0c;当你意识到市场营销涉及大量工作&#xff08;有时还包括金钱&#xff0…

【算法思想·二叉树】后续篇

本文参考labuladong算法笔记[二叉树心法&#xff08;后序篇 | labuladong 的算法笔记] 前序位置的代码只能从函数参数中获取父节点传递来的数据&#xff0c;而后序位置的代码不仅可以获取参数数据&#xff0c;还可以获取到子树通过函数返回值传递回来的数据。 那么换句话说&am…

软件设计师备考——计算机系统

学习内容源自「软件设计师」 上午题 #1 计算机系统_哔哩哔哩_bilibili 目录 1.1.1 计算机系统硬件基本组成 1.1.2 中央处理单元 1.CPU 的功能 1)运算器 2)控制器 RISC && CISC 流水线控制 存储器 Cache 中断 输入输出IO控制方式 程序查询方式 中断驱动方…

在python里把图变成gif

import scipy.io import matplotlib.pyplot as plt import imageio import numpy as npdata scipy.io.loadmat("/文件路径/Sol.mat")# 提取数据 t_current data[t].flatten() XX, YY np.meshgrid(data[x].flatten(), data[y].flatten()) u_pred_plot_final data[…

轻松应对:环保专包二级资质续期常见问题解答

在环保专包二级资质续期过程中&#xff0c;企业可能会遇到一系列常见问题。以下是对这些问题的详细解答&#xff0c;旨在帮助企业轻松应对续期挑战&#xff1a; 一、政策理解与把握 问题&#xff1a;如何准确理解和把握最新的环保政策和资质续期要求&#xff1f; 解答&#x…

HCIA--实验十三:VLAN间通信子接口实验/双单臂路由实验

一、实验内容 1.需求/要求&#xff1a; 将两个单臂路由通过两台交换机连接起来&#xff0c;成为双臂路由&#xff0c;并探讨这么做的原因。实现全网通&#xff0c;让任何一台主机之间都可以通信。 二、实验过程 1.拓扑图&#xff1a; 2.步骤&#xff1a; 1.给PC配置ip地址…

传感器技术在构建实时监控系统中有什么作用

在无线传感器技术中&#xff0c;物联网生成的传感器数据通过无线方式传输到网络服务器&#xff0c;工程师可以在其中跟踪参数。远距离无线通信提高了工业 4.0 的成本效率并减少了人力。实时监控系统旨在显示传感器节点周围的快速变化&#xff0c;这需要快速、低延迟的数据传输。…

数据分析与挖掘课程相关资源

这是在gitee上整的关于这门课的一个开源项目。 https://gitee.com/rainpet/python-data-analysis-and-mining-demo 头歌平台。 常见问题&#xff1a; 1、如何确认conda的版本&#xff0c;执行如下命令&#xff1a; conda list anaconda$2、实验室登陆后&#xff0c;无法上网&a…

JAVA开源项目 大学生租房平台 计算机毕业设计

本文项目编号 T 019 &#xff0c;文末自助获取源码 \color{red}{T019&#xff0c;文末自助获取源码} T019&#xff0c;文末自助获取源码 目录 一、系统介绍二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究现状5.3 可行性分析 六、核心代码6.1 查…

浅谈人工智能之基于ollama的常见变量设置

浅谈人工智能之基于ollama的常见变量设置 全局命令设置 现象&#xff1a;无法直接使用命令ollama 问题显示如下&#xff1a; [rootlocalhost LLM]# ollama -bash: ollama: command not found 解决方法一&#xff1a; 第一步&#xff1a;输入如下命令&#xff1a; [rootloca…

Android Studio偶尔打开Flutter项目没有智能提示的解决方案

Flutter支持多种IDE来编程&#xff0c;我曾使用过Android Studio和VSC两款软件&#xff0c;但因为长期使用Android Studio的原因&#xff0c;使用起来会比VSC顺手&#xff0c;然后就发现偶尔AS加载Flutter项目会无法使用智能提示&#xff0c;也没有代码高亮等 问题出现的原因&…

力扣面试150 三角形最小路径和 DFS 记忆化搜索 DP 滚动数组优化DP

Problem: 120. 三角形最小路径和 &#x1f469;‍&#x1f3eb; 甜姐题解 Code class Solution {// 朴素DP// public int minimumTotal(List<List<Integer>> triangle) {// int n triangle.size();// int[][] dp new int[n1][n1];// for(int i n-1; i > 0…

公积金基数两万,养了征信三个月之后,结果怎么样了?

近期&#xff0c;有幸与一位颇具代表性的信贷经历者&#xff0c;进行了深入的交流。她的故事&#xff0c;尤其是对那些在信贷领域迷茫徘徊的朋友来说&#xff0c;无疑是一盏警示灯&#xff0c;提醒我们如何在金融海洋中稳健航行。 黄女士的信贷迷航 黄女士&#xff0c;一位拥有…

SpringMvc 之处理器方法参数解析器(HandlerMethodArgumentResolver)

概述 HandlerMethodArgumentResolver 是 Spring MVC 框架中的一个关键组件&#xff0c;用于解析控制器&#xff08;Controller&#xff09;方法的参数。在 Spring MVC 中&#xff0c;当一个请求到达时&#xff0c;DispatcherServlet 会负责找到对应的处理器&#xff08;即控制器…

9月9日星期一今日早报简报微语报早读

9月9日星期一&#xff0c;农历八月初七&#xff0c;早报微语早读。 1、庆祝第40个教师节&#xff0c;全国585个单位、1790人受表彰&#xff1b; 2、中国残奥军团94金76银50铜收官&#xff1a;连续6届残奥会金牌和奖牌榜第一&#xff1b; 3、三部门&#xff1a;拟允许在京津沪…

1688电商运营到底怎么做竞品分析(超细节)

你得学会看同行数据&#xff0c;因为同行是蕞好的老师。你把同行分析透&#xff0c;把市场分析透以后&#xff0c;你才能真正的做好这个类目。我们就来详细的讲一下具体该怎么去分析同行&#xff0c;以及要看竞品的哪些数据。 一、分析市场 就是先看一下你的这个产品&#xf…