K8S资源管理之计算资源管理

1.详解Requests和Limits参数

        以CPU为例,下图显示了未设置Limits与设置了Requests和Limits的CPU使用率的区别

       尽管Requests和Limits只能被设置到容器上,但是设置了Pod级别的Requests和Limits能大大提高管理Pod的便利性和灵活性,因此在Kubernetes中提供了对Pod级别的Requests和Limits的配置。对于CPU和内存而言,Pod的Requests或Limits指该Pod中所有容器的Requests或Limits的总和(对于Pod中没有设置Requests或Limits的容器,该项的值被当作0或者按照集群配置的默认值来计算)。下面对CPU和内存这两种计算资源的特点进行说明 。

        (1)CPU

                CPU的Requests和Limits是通过CPU数(cpus)来度量的。CPU的资源值是绝对值,而不是相对值,比如O.1CPU在单核或多核机器上是一样的,都严格等于0.1CPU core。

        (2)Memory

                内存的Requests和Limits计量单位是字节数。使用整数或者定点整数加上国际单位制来表示内存值。国际单位制包括十进制的E、P、T、G、M、K、m或二进制的Ei、Pi、Ti、Gi、Mi、Ki。KiB与MiB是以二进制表示的字节单元,常见的KB与MB则是以十进制表示的字节单位,简而言之:

        1KB=1000Bytes=8000Bits

        1KiB=2^{10}Bytes=1024Bytes=8192Bits

2.基于Requests和Limits的Pod调度机制

        当—个Pod创建成功时,Kubernetes调度器(Scheduler)会为该Pod选择一个节点来执行。对于每种计算资源(CPU和Memory)而言,每个节点都有一个能用于运行Pod的最大容量值。调度器在调度时,首先要确保调度后该节点上所有Pod的CPU和内存的Requests 总和,不超过该节点能提供给Pod使用的CPU和Memory的最大容量值 。

        例如:某个节点上的CPU资源充足,而内存为4GB,其中3GB可以运行Pod,而某Pod的Memory Requests为1GB、Limits为2GB,那么在这个节点上最多可以运行3个这样的Pod。

        有个情景:可能某个节点上的实际资源使用量非常低,但是已运行Pod配置的Requests值的总和非常高,如果要新调度Pod的Requests值+已运行所有Pod配置的Requests值>节点提供给Pod资源容量上限,这是该Pod不会在该节点上运行。

        用数字量化来说就是3个Pod实际使用内存都不足500M,但是3个Pod的Request值相加已经达到了节点可用内存上限3G,故K8S不会在调度Pod到该节点上了

3.Requests和Limits的背后机制

        kubelet在启动Pod的某个容器时,会将容器的Requests和Limits值转化为相应的容器启动参数传递给容器来执行,传递参数给Docker的过程如下:

        1.spec.container[].resources.requests.cpu

                这个参数值会被转化为core数(比如配置100m会转化成0.1),然后乘以1024,再将这个结果作为--cpu-shares参数的值传递给docker run命令,在docker run命令中,--cpu-share参数是一个相对权重值(Relative Weight),这个相对权重值会决定Docker在资源竞争时分配给容器的资源比例。

                这里举例说明--cpu-shares参数在Docker中的含义:比如将两个容器的CPU Requests分别设置为1和2,那么容器在docker run启动时对应的--cpu-shares参数值分别为1024和2048,在主机CPU资源产生竞争时,Docker会尝试按照1:2的配比将CPU资源分配给这两个容器使用。

                其中,这个参数对于Kubernetes来说是绝对值,是多少就会转换后传递给docker的--cpu-shares参数,主要用于Kubernetes的调度和管理,但是对于Docker来说是相对值,按照比例来分配资源

        2.spec.container[].resources.limits.cpu

                 这个参数值会被转化为millicore数(比如配置的1被转化为1000, 而配置的100m被转化为100),将此值乘以100000,再除以1000,然后将结果值作为--cpu-quota参数的值传递给docker run 命令。docker run命令中的另一个参数--cpu-period 默认被设置为100000,表示Docker重新计算和分配CPU的使用时间间隔为100000µs ( 100ms ) 。

                Docker的--cpu-quota参数和--cpu-period参数一起配合完成对容器CPU的使用限制:比如在Kubernetes中配置容器的CPU Limits为0.1, 那么计算后--cpu-quota为10000,而--cpu-period 为 100000, 这意味着Docker在l00ms内最多给该容器分配10ms*core的计算资源用量,10/100=0.1 core 的结果与 Kubernetes 配置的意义是一致的。

        3.spec.container[].resources.requests.memory

                这个参数值只提供给Kubernetes调度器作为调度和管理的依据,不会作为任何参数传递给Docker

        4.spec.container[].resources.limits.memory

                这个参数值会被转化为单位为Bytes的整数,值作为--memory参数传递给docker run。

                如果一个容器在运行过程中使用了超出其内存Limits配置的内存限制值,那么它可能会被“Kill”掉,如果这个容器的重启策略是always,那么kubernetes会在kill掉后重新拉起,此时应该重新评估设置limits.memory值。

                与内存Limits不同的是,CPU在容器技术中属于可压缩资源,因此对CPU的Limits配置一般不会因为偶然超标使用而导致容器被系统”Kill"。

4.计算资源使用情况监控

        Pod的资源用量会作为Pod的状态信息一同上报给Master。如果在集群中配置了Heapster来监控集群的性能数据,那么还可以从Heapster中 查看Pod的资源用量信息。

5.计算资源常见问题分析

        1.Pod状态为Pending,错误信息为FailedScheduling。如果Kubernetes调度器在集群中找不到合适的节点来运行Pod,那么这个Pod会一直处于未调度状态,直到调度器找到合适的节点为止。可以用这个命令来查看pod事件信息:kubelet describe pod $pod,如果有类似FailedScheduling ailed for reason PodExceedsFreeCPU and possibly others的日志,说明是CPU资源不够导致调度失败。解决方法:

                1.添加更多的Node节点

                2.停止一些非必要的Pod,释放资源

                3.检查Pod配置,错误的配置肯可能会导致该Pod永远无法被调度执行。例如:整个集群的所有节点都是1CPU,而Pod的配置CPU Requests为2,这样该Pod永远无法调度

                 查看节点计算资源命令:

[root@k8s-master ~]# kubectl describe node k8s-node01
Name:               k8s-node01
Roles:              <none>
Labels:             beta.kubernetes.io/arch=amd64
                    beta.kubernetes.io/os=linux
                    kubernetes.io/arch=amd64
                    kubernetes.io/hostname=k8s-node01
                    kubernetes.io/ingress=nginx
                    kubernetes.io/os=linux
Annotations:        kubeadm.alpha.kubernetes.io/cri-socket: unix:///var/run/containerd/containerd.sock
                    node.alpha.kubernetes.io/ttl: 0
                    projectcalico.org/IPv4Address: 11.0.1.13/24
                    projectcalico.org/IPv4IPIPTunnelAddr: 172.16.85.192
                    volumes.kubernetes.io/controller-managed-attach-detach: true
CreationTimestamp:  Wed, 20 Mar 2024 10:42:57 +0800
Taints:             <none>
Unschedulable:      false
Lease:
  HolderIdentity:  k8s-node01
  AcquireTime:     <unset>
  RenewTime:       Fri, 12 Apr 2024 09:21:48 +0800
Conditions:
  Type                 Status  LastHeartbeatTime                 LastTransitionTime                Reason                       Message
  ----                 ------  -----------------                 ------------------                ------                       -------
  NetworkUnavailable   False   Wed, 10 Apr 2024 08:30:50 +0800   Wed, 10 Apr 2024 08:30:50 +0800   CalicoIsUp                   Calico is running on this node
  MemoryPressure       False   Fri, 12 Apr 2024 09:20:17 +0800   Fri, 12 Apr 2024 09:15:11 +0800   KubeletHasSufficientMemory   kubelet has sufficient memory available
  DiskPressure         False   Fri, 12 Apr 2024 09:20:17 +0800   Fri, 12 Apr 2024 09:15:11 +0800   KubeletHasNoDiskPressure     kubelet has no disk pressure
  PIDPressure          False   Fri, 12 Apr 2024 09:20:17 +0800   Fri, 12 Apr 2024 09:15:11 +0800   KubeletHasSufficientPID      kubelet has sufficient PID available
  Ready                True    Fri, 12 Apr 2024 09:20:17 +0800   Fri, 12 Apr 2024 09:15:11 +0800   KubeletReady                 kubelet is posting ready status
Addresses:
  InternalIP:  11.0.1.13
  Hostname:    k8s-node01
Capacity:
  cpu:                2
  ephemeral-storage:  18121Mi
  hugepages-1Gi:      0
  hugepages-2Mi:      0
  memory:             1862816Ki
  pods:               110
Allocatable:
  cpu:                2
  ephemeral-storage:  17101121099
  hugepages-1Gi:      0
  hugepages-2Mi:      0
  memory:             1760416Ki
  pods:               110
System Info:
  Machine ID:                 770cecbd0b4543279b46495d03f3e1d7
  System UUID:                83374D56-C17C-C044-73D5-E8B739FCF790
  Boot ID:                    69a2e659-996e-4876-8324-5413b3880695
  Kernel Version:             3.10.0-1160.108.1.el7.x86_64
  OS Image:                   CentOS Linux 7 (Core)
  Operating System:           linux
  Architecture:               amd64
  Container Runtime Version:  containerd://1.6.28
  Kubelet Version:            v1.27.1
  Kube-Proxy Version:         v1.27.1
Non-terminated Pods:          (3 in total)
  Namespace                   Name                                        CPU Requests  CPU Limits  Memory Requests  Memory Limits  Age
  ---------                   ----                                        ------------  ----------  ---------------  -------------  ---
  kube-system                 calico-kube-controllers-6c99c8747f-lth46    0 (0%)        0 (0%)      0 (0%)           0 (0%)         2d
  kube-system                 calico-node-2jq57                           250m (12%)    0 (0%)      0 (0%)           0 (0%)         2d
  kube-system                 kube-proxy-bvrr7                            0 (0%)        0 (0%)      0 (0%)           0 (0%)         22d
Allocated resources:
  (Total limits may be over 100 percent, i.e., overcommitted.)
  Resource           Requests    Limits
  --------           --------    ------
  cpu                250m (12%)  0 (0%)
  memory             0 (0%)      0 (0%)
  ephemeral-storage  0 (0%)      0 (0%)
  hugepages-1Gi      0 (0%)      0 (0%)
  hugepages-2Mi      0 (0%)      0 (0%)
Events:
  Type    Reason                   Age                  From     Message
  ----    ------                   ----                 ----     -------
  Normal  NodeHasSufficientMemory  6m45s (x8 over 14d)  kubelet  Node k8s-node01 status is now: NodeHasSufficientMemory
  Normal  NodeHasNoDiskPressure    6m45s (x8 over 14d)  kubelet  Node k8s-node01 status is now: NodeHasNoDiskPressure
  Normal  NodeHasSufficientPID     6m45s (x8 over 14d)  kubelet  Node k8s-node01 status is now: NodeHasSufficientPID
  Normal  NodeReady                6m45s (x8 over 14d)  kubelet  Node k8s-node01 status is now: NodeReady

 我们细致的来看这两条配置:

Capacity:
  cpu:                2
  ephemeral-storage:  18121Mi
  hugepages-1Gi:      0
  hugepages-2Mi:      0
  memory:             1862816Ki
  pods:               110
Allocatable:
  cpu:                2
  ephemeral-storage:  17101121099
  hugepages-1Gi:      0
  hugepages-2Mi:      0
  memory:             1760416Ki
  pods:               110

超过可用资源容量上限(Capacity)和已分配资源量(Allocated resources)差额的Pod无法运行在该Node上。

        2.容器被强行终止(Terminated)。如果容器使用的资源超过了它配置的Limits,那么该容器可能被强行终止。可以用这个命令来查看pod事件信息:kubelet describe pod $pod,如果有类似Last Termination State:Terminated 以及Restart Count:5,说明容器上个状态是终止的并且已经根据重启策略重启了5次

        kubectl get pod -o go-template='{{range.status.containerStatuses}} {{"Container Name:" }} {{.name}}{{"\r\nLastState: "}} {{.lastState}} {{end}}' -n kube-system $POD

可以查看是否有OOM

6.对大内存页 (Huge Page) 资源的支持

        我们可以将Huge Page理解为一种特殊的计算资源:拥有大内存页的资源。而拥有Huge Page资源的Node也与拥有GPU资源的Node一样,属于一种新的可调度资源节点(Schedulable Resource Node)。

        Huge Page类似于CPU或者Memory资源,但不同于CPU或者Memory,Huge Page资源属于不可超限使用的资源,也支持ResourceQuota实现配额限制。

举例说明:

        1.节点规划分配多种规格的巨页

                在etc/default/grub 中添加

[root@k8s-master ~]# cat /etc/default/grub 
GRUB_TIMEOUT=5
GRUB_DISTRIBUTOR="$(sed 's, release .*$,,g' /etc/system-release)"
GRUB_DEFAULT=saved
GRUB_DISABLE_SUBMENU=true
GRUB_TERMINAL_OUTPUT="console"
GRUB_CMDLINE_LINUX="crashkernel=auto spectre_v2=retpoline rhgb quiet hugepagesz=1G hugepages=2 hugepagesz=2M hugepages=512"
GRUB_DISABLE_RECOVERY="true"

代表了分配了 2*1GiB 的 1 GiB 页面和 512*2 MiB 的 2 MiB 页面。

        2.查看节点计算资源

kubectl describe node $node

Capacity:
  cpu:                ...
  ephemeral-storage:  ...
  hugepages-1Gi:      2Gi
  hugepages-2Mi:      1Gi
  memory:             ...
  pods:               ...
Allocatable:
  cpu:                ...
  ephemeral-storage:  ...
  hugepages-1Gi:      2Gi
  hugepages-2Mi:      1Gi
  memory:             ...
  pods:               ...

        3.创建pod yaml文件

apiVersion: v1
kind: Pod
metadata:
  name: huge-pages-example
spec:
  containers:
  - name: example
    image: fedora:latest
    command:
    - sleep
    - inf
    volumeMounts:
    - mountPath: /hugepages-2Mi
      name: hugepage-2mi
    - mountPath: /hugepages-1Gi
      name: hugepage-1gi
    resources:
      limits:
        hugepages-2Mi: 100Mi
        hugepages-1Gi: 2Gi
        memory: 100Mi
      requests:
        memory: 100Mi
  volumes:
  - name: hugepage-2mi
    emptyDir:
      medium: HugePages-2Mi
  - name: hugepage-1gi
    emptyDir:
      medium: HugePages-1Gi

         

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【RV1106的ISP使用记录之二】设备树的构建

基于MIPI接口的两种摄像头接入方式&#xff0c;理清楚各链路关系&#xff0c;方便后续的开发调试工作&#xff0c;先上一张图&#xff0c;后面再补充解释。

Git可视化工具 - 推荐

概述 Git版本管理工具是我们日常开发中常用的工具&#xff0c;熟练使用它可以提高我们的工作效率。 当然老司机基本使用命令行的方式进行操作&#xff0c;新手可借助可视化工具来进行过渡&#xff0c;命令行与可视化工具结合使用来加深对Git的熟悉程度。 下面推荐两个较受欢迎…

IP广播对讲系统停车场解决方案

IP广播对讲系统停车场解决方案 一、需求分析 随着国民经济和社会的发展&#xff0c; 选择坐车出行的民众越来越多。在保护交通安全的同时&#xff0c;也给停车场服务部门提出了更高的要求。人们对停车场系统提出了更高的要求与挑战&#xff0c; 需要停车场系统提高工作效率与服…

Asterisk 21.2.0编译安装经常遇到的问题和解决办法之pjproject风云再起

目录 pjproject问题的另外一种形式上传文件来解决关于pjproject 为什么要用指定版本的 pjproject问题的另外一种形式 在反复测试Asterisk 21.2.0版本安装的时候&#xff0c;在 ./configure 的时候又遇到一个跟pjproject有关的问题&#xff0c;错误提示信息是这样的&#xff1a…

【Linux】UDP协议

UDP协议 1.再谈端口号端口号划分认识知名端口号(Well-Know Port Number)两个问题netstatpidof 2.UDP协议2.1UDP的特点2.2面向数据报2.3UDP的缓冲区2.4UDP使用注意事项2.5基于UDP的应用层协议 喜欢的点赞&#xff0c;收藏&#xff0c;关注一下把&#xff01; 1.再谈端口号 端口…

七月审稿之提升模型效果的三大要素:prompt、数据质量、训练策略(附PeerRead)

前言 我带队的整个大模型项目团队超过40人了&#xff0c;分六个项目组&#xff0c;每个项目组都是全职带兼职&#xff0c;且都会每周确定任务/目标/计划&#xff0c;然后各项目组各自做任务拆解&#xff0c;有时同组内任务多时 则2-4人一组 方便并行和讨论&#xff0c;每周文档…

面试算法-154-搜索二维矩阵 II

题目 编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target 。该矩阵具有以下特性&#xff1a; 每行的元素从左到右升序排列。 每列的元素从上到下升序排列。 示例 1&#xff1a; 输入&#xff1a;matrix [[1,4,7,11,15],[2,5,8,12,19],[3,6,9,16,22],[10,…

【Java核心技术】第4章 对象与类

1 面向对象 2 自定义类 形式&#xff1a; class ClassName { field // 字段 constructor // 构造器&#xff08;构造函数&#xff09; method // 方法 } 如&#xff1a; class Employee {private String name;private double salary;private LocalDate hireDay;public Emp…

.icon 24 位位图读取

代码来源 读取格式来自&#xff1a;Icons | Microsoft Learn rgb打印来自&#xff1a;位图(BMP)文件结构分析以及使用C实现位图的读写与显示 - 简书 (jianshu.com) 位图转 icon 文件网站&#xff1a; w​​​​​​​在线生成透明ICO图标 - 在线工具 (toollist.net) ​​​​…

C++调用python脚本

1、在属性页配置 包含目录和库目 2、引入头文件并实现代码 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 // ConsoleApplication22.cpp : 此文件包含 &…

2024年第十四届 Mathorcup (B题)| 甲骨文智能识别 | 深度学习 计算机视觉 |数学建模完整代码+建模过程全解全析

当大家面临着复杂的数学建模问题时&#xff0c;你是否曾经感到茫然无措&#xff1f;作为2022年美国大学生数学建模比赛的O奖得主&#xff0c;我为大家提供了一套优秀的解题思路&#xff0c;让你轻松应对各种难题。 让我们来看看Mathorcup (B题&#xff09;&#xff01; CS团队…

AI预测福彩3D第33弹【2024年4月12日预测--第8套算法开始计算第1次测试】

今天在出预测结果之前&#xff0c;咱们先做一下经验总结。经过前面第7套算法8次的测试&#xff0c;发现了一些非常稳定的规律&#xff0c;这些规律可以作为杀号的条件&#xff1b;另一方面&#xff0c;存在一些冲突矛盾的规律&#xff0c;一旦使用&#xff0c;就可能会把中奖号…

【前缀合】Leetcode 和为k的子数组

题目解析 560. 和为 K 的子数组 算法讲解 前面滑动窗口里面有一道题和这个题很相似&#xff0c;它是求出和为k的最短子数组的长度&#xff0c;但是这道题不能使用滑动窗口&#xff0c;因为虽然找到一段子数组的和等于k&#xff0c;但是这道题里面存在0和负数&#xff0c;可能…

英伟达旗下AI估值暴增?!!

在AI初创领域中&#xff0c;OpenAI和Anthropic两家获得融资最多的闭源大模型公司备受瞩目&#xff0c;它们的投资背后分别是实力雄厚的微软和亚马逊。 资本巨头进军AI领域&#xff0c;所投入的不仅仅是资金&#xff0c;更是宝贵的云计算资源。这种全力支持的做法&#xff0c;无…

路线选择 | 用ZStack Cloud替代升级VMware

2024年&#xff0c;被博通收购后的VMware全面走向订阅模式&#xff0c;VMware将各产品线改为以VVEP/VVS/VVF/VCF四大基础订阅包并叠加组件的模式进订阅制服&#xff0c;从永久授权改为1/3/5年订阅&#xff0c;且订阅制后售卖规则也进行了调整。 对于用户来讲&#xff0c;VMwar…

C语言 函数——代码风格

目录 基本的代码规范 程序版式 对齐&#xff08;Alignment&#xff09;与缩进&#xff08;indent&#xff09; 变量的对齐规则 空行——分隔程序段落的作用 代码行内的空格——增强单行清晰度 代码行 长行拆分 标识符命名规则 标识符命名的共性规则 windows应用程序…

SpringBoot启动时banner设置

SpringBoot启动时banner设置 1.操作步骤2.各种banner图像 1.操作步骤 在application.properties文件中设置新的banner对于的文件位置&#xff0c;最好放在resources目录下 spring.banner.locationbanner.txt2.各种banner图像 &#xff08;1&#xff09;经典大佛图 具体txt文…

Docker学习笔记(一):入门篇,Docker概述、基本组成等,对Docker有一个初步的认识

前言 记录时间 [2024-4-5] 在先前的文章中&#xff0c;笔者进行了Windows系统下YOLOv8模型的简单测试&#xff0c;并由此引发思考&#xff1a;是否能尝试将此模型运行在Linux中呢&#xff1f;又或者&#xff0c;运行在Docker中。关于Docker的学习就这么展开了。 本文便是有关D…

车载视频智能创作解决方案,影视级视频制作

当下车载视频已经不仅仅是一种记录行车过程的方式&#xff0c;更是展现企业品牌形象、传递文化内涵的重要媒介。传统的车载视频制作方式往往耗时耗力&#xff0c;效率低下&#xff0c;无法满足企业对于高质量、高效率的需求。针对这一痛点&#xff0c;美摄科技凭借其在视频智能…

算法 分割字符串为实体类

题目 String userData "10000:张三:男:1998-01-01#10001:张三:男:1998-01-01#10002:李四:女:1999-02-02#10003:王五:男:2000-03-03#10004:赵六:女:2001-04-04"; String[] usersArray userData.split("#"); // 使用Stream API将字符串数组转换为SysUser对…