深入探究kubernetes resources - Part 1

news2024/11/17 17:26:58

在开始使用 Kubernetes 时,社区教给我们的第一件事就是始终为我们 pod 中的每个容器设置 CPU 和内存的请求和限制。

当您指定 Pod 时,您可以选择指定容器需要多少资源。 您指定的最常见资源是 CPU 和内存 (RAM);

apiVersion: v1
kind: Pod
metadata:
  name: frontend
spec:
  containers:
  - name: app
    image: images.my-company.example/app:v4
    resources:
      requests:
        memory: "64Mi"
        cpu: "250m"
      limits:
        memory: "128Mi"
        cpu: "500m"

如果容器指定了自己的资源限制但没有指定资源请求,那么 Kubernetes 会自动分配一个与指定限制相匹配的资源请求。

然而,经过多年的许多用例经验和调查许多与资源相关的问题,我发现 Kubernetes 资源管理比看起来要复杂得多。

让我们从头开始

Kubernetes 是一种容器编排器,可在资源池(节点)上部署工作负载(Pod)。 当然,这是一个巨大的简化,因为 Kubernetes 复杂得多,并且使用许多不同的参数来调度 pod,但我想在本文中深入探讨的是 Kubernetes 如何管理容器资源。

那么 Kubernetes 可以管理哪些资源呢? 容器消耗多种资源。 最明显的是 CPU 和内存等资源,但它们也会消耗其他资源,例如磁盘空间、磁盘时间 (I/O)、网络带宽、进程 ID、主机端口、IP 地址、GPU、电源等等!

首先,让我们深入了解一下容器

那么,容器到底是什么?

简而言之,容器是一组 Linux 命名空间。

那么,什么是 Linux 名称空间?

Linux 命名空间是一种 Linux 内核功能,它对内核资源进行分区,以便同一 Linux 命名空间中的一个或一组进程可以看到一组内核资源,并与其他命名空间中的进程隔离。 这些命名空间的一些示例是 PID、UID、Cgroups 和 IPC(请参阅 wiki 中的完整列表)。

关于命名空间的另一件事是它们是嵌套的,这意味着命名空间可以在其他命名空间内。 子命名空间与其父命名空间隔离,但父命名空间可以看到子命名空间内的所有内容。

从技术上讲,当运行 Linux 机器时,您已经在容器中(因为您在第一组名称空间中)。 在同一系统中创建另一组名称空间时,我们利用容器的隔离优势。

因此,当启动一个容器时,它会创建一组这样的名称空间并在其中运行您的应用程序。 这也是为什么在容器内部,您会看到应用程序的 PID 通常设置为 1(或较低的数字,具体取决于您正在运行的是什么),而在容器外部(在主 PID 命名空间中),PID 你的应用程序将是一个更大的数字。 这是相同的过程,但容器中的 PID 映射到主命名空间中的更高 PID,并与它和任何其他命名空间集(其他容器)隔离。

命名空间使我们能够将进程彼此隔离,但是资源消耗呢? 如果我们所有的容器都认为它们是孤立运行的,那么它们不会消耗太多资源并影响其他容器吗? 这种现象被称为资源互相影响。

那么我们该如何应对资源互相影响呢? 一种方法是限制每个进程可以消耗的资源,并且(令人惊讶的是)Linux 内核还有另一个可以做到这一点的功能,称为控制组(Cgroups)。 这些是为每个进程配置的,以限制、说明和隔离它们各自消耗的资源。 使用此功能,Kubernetes 可以限制容器的资源使用。

目前,Kubernetes 使用的是 Cgroups v1,但另一个玩家已经进入竞技场(过去五年),Cgroups v2! 它们目前的用途是内存服务质量 (QoS),自从 1.22 处于 alpha 版本以来,它已经打开了一个全新的可能性世界。 你可以在这里读到所有和它有关的。

Kubernetes 目前管理着哪些资源?

Kubernetes 本身目前只管理现有资源的一小部分。 首先,它列出了其节点上每个资源的容量。

# You can see it using kubectl.
kubectl get node -ojson | jq '.items[].status.capacity' 
{
  "cpu": "2",
  "ephemeral-storage": "52416492Ki",
  "hugepages-1Gi": "0",
  "hugepages-2Mi": "0",
  "memory": "8003232Ki",
  "pods": "110"
}

然后,它计算用于 Pod 调度的可分配数量。 节点的可分配资源是通过从节点的总资源中减去 Linux 系统、kubelet 的保留资源缓冲区和驱逐阈值来计算的。 从 1.21 开始,kubelet 只计算 CPU、内存、大页面和临时存储的可分配资源。

kubectl get node -ojson | jq '.items[].status.allocatable' 
{
  "cpu": "1930m",
  "ephemeral-storage": "47233297124",
  "hugepages-1Gi": "0",
  "hugepages-2Mi": "0",
  "memory": "7313056Ki",
  "pods": "110"
}

每个可分配资源都是一个向量,Kubernetes 调度程序使用它来进行调度决策。

Requests

在调度 pod 时,调度器只考虑 pod 的容器请求对可分配资源的请求(这自然会降低可分配资源的数量,因此下一个 pod 请求将有更少的可分配资源,它可以请求调度)。 它不考虑节点上的实际资源使用情况(即使用资源超过或低于其请求的容器)。

如果我的 pod 中的容器没有分配请求,Kubernetes 可以将它们调度到任何节点(当然,如果没有其他调度限制)。

默认情况下,Kubernetes 每个节点最多可以调度 110 个 pod。

从 Kubernetes 1.21 开始,您可以从 Kubernetes 请求的主要资源是 CPU、内存、临时存储和 HugePages。 此外,您可以通过使用扩展资源请求自定义资源来完成调度(也可以与控制器一起应用,例如 Nvidia 控制器用于 GPU)。

请注意,您还可以在节点级别限制每个 pod 的 PID 消耗。

所以我们了解到资源请求对于调度很重要(不仅仅是调度,更多信息请参见下一部分),其中所有请求的资源都必须在节点中可用,包括扩展资源。

在这系列博文的第二部分,我们将深入探讨 CPU 请求的其他影响。

Limits

资源被考虑用于调度和运行时。 为了限制我们的容器过载和消耗过多资源,Kubernetes 使用了 Cgroups。 Kubernetes 使用容器限制来定义 Cgroup 并限制它们的资源消耗。

可压缩与不可压缩资源

我想退一步谈谈两种不同类型的资源,可压缩和不可压缩。

可压缩资源意味着如果该资源的使用达到其最大值,则需要该资源的进程将不得不等待直到该资源空闲。 换句话说,限制进程。

把它想象成一个水坝; 当大坝的出水管满了,到达大坝的流水超过这些管道的容量时,大坝内的水就会被填满。 通常,我们用时间来衡量可压缩资源。

CPU 是一种可压缩资源,这意味着如果 CPU 使用率为 100%,则需要 CPU 的进程将需要等待,直到它们获得 CPU 时间。

可压缩资源不会被逐出!

另一方面,不可压缩的资源意味着进程不能等待它; 它们要么无法运行,要么必须停止并为新进程释放资源。

把它想象成把盒子放在架子上,一旦架子上装满了盒子,你就不能再把另一个盒子放在架子上了。 您要么必须通过从架子上取下箱子或根本不将箱子放在架子上来腾出空间。 内存是一种不可压缩的资源,这意味着如果您的内存不足并且想要为新的或现有的进程分配内存,您必须终止占用内存空间的进程,否则该进程将崩溃。

对于 Kubernetes,它管理的唯一可压缩资源是 CPU。 Kubernetes 管理的其他资源(内存、HugePages、临时存储和 PID)都是不可压缩的。

当您为 CPU 等可压缩资源指定限制时,Kubernetes 会确保在它们尝试消耗超过其允许水平时限制它们。 另一方面,Kubernetes 必须使用驱逐来处理不可压缩资源的限制。 我们将在接下来的博文中对此进行深入探讨。

Requests vs. Limits

所以我们知道我们使用资源请求作为 Kubernetes 调度程序的“手动”指南,以根据确保我们的工作量所需的最小数量做出调度决策。

我们还可以使用资源限制作为 Kubernetes 的指令,它应该为我们的容器及其阈值配置哪些 Cgroup。

当使用扩展资源时,Kubernetes 将使用请求进行调度,但不会使用限制来设置任何 Cgroup 并限制那些特殊资源的使用。

服务质量——不是真正的底线

我们可以为 Pod 中的容器指定资源请求和限制; 基于这些参数,Kubernetes 还为我们的 pod 分配了一个 QoS 类(服务质量)。

# Try this command to view your current QoS.
kubectl get pods -A -o=jsonpath='{range .items[*]}{.metadata.namespace}{" : "}{.metadata.name}{" --QoS--> "}{.status.qosClass}{"\n"}{end}'

听起来不错,服务质量并不是 pod 优先级的最终决定。 作为 Kubernetes 用户,我们可以看到此参数,以估计在高资源压力和驱逐事件的情况下我们 pod 的可能优先级。 还有很多其他原因,例如所谓的较低 QoS pod 可能会在驱逐事件中幸存下来,而较高 QoS 类 pod 可能会被终止。

到本博客系列结束时,您将了解您需要了解的有关 QoS 含义的所有信息。

首先,QoS 分为三类:

  • 保证
  • 可爆
  • 最大努力

要使 Pod 的 QoS 等级为 Guaranteed,Pod 中的每个容器都必须同时具有内存和 CPU,并且限制和请求相等。

如果 Pod 至少有一个带有内存或 CPU 请求的容器,则该 Pod 的 QoS 等级为 Burstable。

对于具有 BestEffort QoS 类的 Pod,Pod 中的容器不得有任何内存或 CPU 限制或请求。

请注意,这仅使用 CPU 和内存来计算 pod 的 QoS 等级。

关于QoS的使用,你应该知道:

  • 它用于设置 OOM_Score_adj 参数——更多内容在第 4 部分。
  • 它用于设置 QoS Cgroups——到目前为止没有效果,是未来的 QoS 功能。

总结一下;

所以要了解的信息很多,而这第一部分只是探究resources的基础知识。

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

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

相关文章

模糊测试不“模糊”,高效发掘未知漏洞与 0day 攻击

近日,在「DevSecOps软件安全开发实践」课程上,极狐(GitLab) 高级测试工程师衡韬、极狐(GitLab) 高级后端开发工程师田鲁,分享了模糊测试的概念、必要性和在极狐GitLab 上的实践。 以下内容整理自本次直播,你也可以点击&#x1f44…

合宙Air724UG Cat.1模块硬件设计指南--SIM卡接口

SIM卡接口 简介 SIM( Subscriber Identity Module)卡为用户识别模块,内部使用新式单片机及存储器管理结构,包含了大规模的集成电路,同时也称为用户识别卡。通信设备通过SIM卡来识别其用户,只有设备插入SIM卡后才能入网使用。SIM卡…

Javac编译原理:基本结构和工作原理

Javac编译器 文章目录 Javac编译器简介基本结构如何编译程序 工作原理词法分析器语法分析器语义分析器代码生成器 简介 javac是一种编译器,能将一种语言规范转化成另一种语言规范 编译器通常是将便于人理解的语言规范转换成容易理解的语言规范,如C都是…

阿里云服务器价格如何?与其他云服务提供商的价格对比如何?

阿里云服务器价格如何?与其他云服务提供商的价格对比如何?   阿里云服务器价格概述   作为全球领先的云计算服务提供商,阿里云在确保服务器性能和安全性的同时,也非常注重产品的价格竞争力。阿里云服务器(ECS&…

OpenMMLab-AI实战营第二期——6-2.玩转AIGC神器MMagic

文章目录 1. 基本介绍2. 动手实验 视频链接:玩转AIGC神器MMagic 代码教程:https://github.com/TommyZihao/MMagic_Tutorials 1. 基本介绍 Stable Diffusion的文生图,以及controlnet和dreamboost的图生图(输入一个图像文字描述&am…

python Django web 项目 联通用户管理系统

文章目录 1框架MVC 介绍Django 框架的介绍基础命令Django处理浏览器的请求的流程 部门表部门表显示7.模板的继承部门表的添加部门表的删除request.POST.get(‘key’) 、 request.GET.get(key, )部门表的编辑filter() 得到可迭代的QuerySet对象,支持for循环取容器内的元素first(…

图神经网络 GNN 入门

参考链接 A Gentle Introduction to Graph Neural Networks (distill.pub) 零基础多图详解图神经网络(GNN/GCN)【论文精读】_哔哩哔哩_bilibili 目录 图的基本构成 图的表示方法 图的示例 图网络的基本任务 图网络的处理 影响图网络效果的超参数 …

机器人参数化建模与仿真,软体机器人

专题一:机器人参数化建模与仿真分析、优化设计专题课程大纲 机器人建模基础 机器人运动学基础几何运动学闭环解解析法建模运动学MATLAB脚本文件编写(封闭解、构型绘制)、工具箱机器人工作空间(离散法、几何法)建模工作…

客户自助服务第一步:在线客服、在线帮助中心

随着互联网的快速发展,越来越多的企业开始重视客户体验,不断提升客户服务水平。其中,客户自助服务是提高客户满意度的重要途径之一。本文将从在线客服和在线帮助中心两个方面介绍。 客户自助服务的第一步 一、在线客服 在线客服是指企业通…

【linux】探索Linux命令行中强大的网络工具:netstat

文章目录 前言一、netstat是什么?二、使用方法1.常用参数2.实例演示3.更多功能 总结 前言 在Linux命令行中,有许多实用的工具可帮助我们管理和监控网络连接。其中一个最重要的工具就是netstat,它提供了丰富的网络连接和统计信息,…

怎么压缩PDF文件,这三个方便帮你一键压缩!

PDF文件是一种广受欢迎的版式文件格式,由Adobe公司发明,具有高度的兼容性,无论在不同的软件和设备中打开,都不会影响页面的排版。如今,人们常常上网搜索并下载需要的资料,例如电子书和PPT模板,这…

合宙Air724UG Cat.1模块硬件设计指南--USB接口

USB接口 简介 USB (Universal Serial Bus,通用串行总线) 是一种新兴的并逐渐取代其他接口标准的数据通信方式,自推出以来,已成功替代串口和并口,成为21世纪大量计算机和智能设备的标准扩展接口和必备接口之一,USB 具有…

HarmonyOS学习路之开发篇—Java UI框架(JS FA调用Java PA)

JS FA调用Java PA机制 使用兼容JS的类Web开发范式的方舟开发框架提供了JS FA(Feature Ability)调用Java PA(Particle Ability)的机制,该机制提供了一种通道来传递方法调用、处理数据返回以及订阅事件上。 当前提供Ab…

从零开发短视频电商 Jmeter插件安装和常用插件

Jmeter插件安装和常用插件 插件安装方式 一种是手动安装各种插件,下载对应的jar包,放到lib\ext目录下就可以使用了。另一种是通过漂亮的 UI ,jmeter 插件管理器Plugins Manager可以方便的管理其他插件的下载和更新。安装一次插件管理器&…

1设计模式

面试专题-设计模式 前言 在平时的开发中,涉及到设计模式的有两块内容,第一个是我们平时使用的框架(比如spring、mybatis等),第二个是我们自己开发业务使用的设计模式。 面试官一般比较关心的是你在开发过程中&#…

服务器性能扩展后,重启EasyDSS但无法运行是什么原因?

EasyDSS支持一站式的上传、转码、直播、回放、嵌入、分享功能,具有多屏播放、自由组合、接口丰富等特点。平台可以为用户提供专业、稳定的直播推流、转码、分发和播放服务,全面满足超低延迟、超高画质、超大并发访问量的要求。在推流方面,Eas…

seldom 实战技巧

seldom 是我一直在维护的自动化测试框架。目前GitHub已经 500 star。 最近在项目中使用Seldom poium 编写自动化测试用例。接下来,我就分享一些使用技巧。 如何参数化测试用例 网站的首页,如上面的导航。于是,开始利用poium编写元素定位。…

进程间通信 + 消息队列

进程间通信 每个进程有各自不同的用户地址空间,任何一个进程的全局变量在另一个进程中都看不到,所以进程之间要交换数据必须通过内核,在内核中开辟一块缓冲区,进程1吧数据从用户空间考到内核缓冲区,进程2再从内核缓冲…

android studio自带手机投屏功能

android studio自带手机投屏功能 最新版的android studio自带有手机投屏功能,设置后直接在android studio里面就可以“实时”投屏并操控手机。 (1)File - Settings - Experimental ,打开android物理实体设备镜像开关:…

C语言之指针详解(8)

目录 本章重点 1. 字符指针 2. 数组指针 3. 指针数组 4. 数组传参和指针传参 5. 函数指针 6. 函数指针数组 7. 指向函数指针数组的指针 8. 回调函数 9. 指针和数组面试题的解析 指针和数组笔试题解析 #include<stdio.h> int main() {//一维数组int a[] { 1,2,…