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=amd64beta.kubernetes.io/os=linuxkubernetes.io/arch=amd64kubernetes.io/hostname=k8s-node01kubernetes.io/ingress=nginxkubernetes.io/os=linux
Annotations:        kubeadm.alpha.kubernetes.io/cri-socket: unix:///var/run/containerd/containerd.socknode.alpha.kubernetes.io/ttl: 0projectcalico.org/IPv4Address: 11.0.1.13/24projectcalico.org/IPv4IPIPTunnelAddr: 172.16.85.192volumes.kubernetes.io/controller-managed-attach-detach: true
CreationTimestamp:  Wed, 20 Mar 2024 10:42:57 +0800
Taints:             <none>
Unschedulable:      false
Lease:HolderIdentity:  k8s-node01AcquireTime:     <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 nodeMemoryPressure       False   Fri, 12 Apr 2024 09:20:17 +0800   Fri, 12 Apr 2024 09:15:11 +0800   KubeletHasSufficientMemory   kubelet has sufficient memory availableDiskPressure         False   Fri, 12 Apr 2024 09:20:17 +0800   Fri, 12 Apr 2024 09:15:11 +0800   KubeletHasNoDiskPressure     kubelet has no disk pressurePIDPressure          False   Fri, 12 Apr 2024 09:20:17 +0800   Fri, 12 Apr 2024 09:15:11 +0800   KubeletHasSufficientPID      kubelet has sufficient PID availableReady                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.13Hostname:    k8s-node01
Capacity:cpu:                2ephemeral-storage:  18121Mihugepages-1Gi:      0hugepages-2Mi:      0memory:             1862816Kipods:               110
Allocatable:cpu:                2ephemeral-storage:  17101121099hugepages-1Gi:      0hugepages-2Mi:      0memory:             1760416Kipods:               110
System Info:Machine ID:                 770cecbd0b4543279b46495d03f3e1d7System UUID:                83374D56-C17C-C044-73D5-E8B739FCF790Boot ID:                    69a2e659-996e-4876-8324-5413b3880695Kernel Version:             3.10.0-1160.108.1.el7.x86_64OS Image:                   CentOS Linux 7 (Core)Operating System:           linuxArchitecture:               amd64Container Runtime Version:  containerd://1.6.28Kubelet Version:            v1.27.1Kube-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%)         2dkube-system                 calico-node-2jq57                           250m (12%)    0 (0%)      0 (0%)           0 (0%)         2dkube-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: NodeHasSufficientMemoryNormal  NodeHasNoDiskPressure    6m45s (x8 over 14d)  kubelet  Node k8s-node01 status is now: NodeHasNoDiskPressureNormal  NodeHasSufficientPID     6m45s (x8 over 14d)  kubelet  Node k8s-node01 status is now: NodeHasSufficientPIDNormal  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 $nodeCapacity:cpu:                ...ephemeral-storage:  ...hugepages-1Gi:      2Gihugepages-2Mi:      1Gimemory:             ...pods:               ...
Allocatable:cpu:                ...ephemeral-storage:  ...hugepages-1Gi:      2Gihugepages-2Mi:      1Gimemory:             ...pods:               ...

        3.创建pod yaml文件

apiVersion: v1
kind: Pod
metadata:name: huge-pages-example
spec:containers:- name: exampleimage: fedora:latestcommand:- sleep- infvolumeMounts:- mountPath: /hugepages-2Miname: hugepage-2mi- mountPath: /hugepages-1Giname: hugepage-1giresources:limits:hugepages-2Mi: 100Mihugepages-1Gi: 2Gimemory: 100Mirequests:memory: 100Mivolumes:- name: hugepage-2miemptyDir:medium: HugePages-2Mi- name: hugepage-1giemptyDir:medium: HugePages-1Gi

         

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C语言——实践小游戏(贪吃蛇)代码版

大家好久不见&#xff0c;我是残念我回来了&#xff0c;希望在你看完之后&#xff0c;能对你有所帮助&#xff0c;有什么不足请指正&#xff01;共同学习交流 本文由&#xff1a;残念ing原创CSDN首发&#xff0c;如需要转载请通知 个人主页&#xff1a;残念ing-CSDN博客&#x…

DS数模-Mathorcup妈妈杯C题思路

2024Mathorcup数学建模挑战赛&#xff08;妈妈杯&#xff09;C题保姆级分析完整思路代码数据教学 C题题目&#xff1a;物流网络分拣中心货量预测及人员排班 接下来我们将按照题目总体分析-背景分析-各小问分析的形式来 总体分析&#xff1a;题目要求我们处理的是一个关于物流…

国芯科技(C*Core)车规MCU产品选型与应用

一、MCU市场概述 MCU&#xff08;Micro Controller Unit&#xff09;即微控制器&#xff0c;俗称单片机&#xff0c;是把 CPU 的规格与频率做适当缩减&#xff0c;并将ROM、RAM、A/D转换、各式I/O接口以及Timer等功能整合在单一芯片上&#xff0c;形成芯片级的计算机。 根据…

【应用】SpringBoot-自动配置原理

前言 本文简要介绍SpringBoot的自动配置原理。 本文讲述的SpringBoot版本为&#xff1a;3.1.2。 前置知识 在看原理介绍之前&#xff0c;需要知道Import注解的作用&#xff1a; 可以导入Configuration注解的配置类、声明Bean注解的bean方法&#xff1b;可以导入ImportSele…

Prototype 原型

意图 用原型实例指定创建对象的种类&#xff0c;并且通过复制这些原型创建新的对象。 结构 Prototype声明一个复制自身的接口。ConcretePrototype实现一个复制自身的操作。Client让一个原型复制自身从而创建一个新的对象。 适用性 当一个系统应该独立于他的产品创建、构成和…

oceanbase一键安装

安装文档&#xff1a;https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000000642554 软件下载 https://www.oceanbase.com/softwarecenter 安装obd yum install -y yum-utils yum-config-manager --add-repo https://mirrors.aliyun.com/oceanbase/OceanBa…

《剑指 Offer》专项突破版 - 面试题 107 : 矩阵中的距离(C++ 实现)

题目链接&#xff1a;矩阵中的距离 题目&#xff1a; 输入一个由 0、1 组成的矩阵 M&#xff0c;请输出一个大小相同的矩阵 D&#xff0c;矩阵 D 中的每个格子是矩阵 M 中对应格子离最近的 0 的距离。水平或竖直方向相邻的两个格子的距离为 1。假设矩阵 M 中至少有一个 0。 …

网络原理(应用层、传输层)

文章目录 一、应用层1.1 自定义协议1.2 通用协议XMLJSONprotobuf 1.3 DNS 域名解析系统 二、传输层2.1 UDP协议2.2 TCP协议协议端格式及解析可靠性机制确认应答超时重传连接管理&#xff08;三次握手&#xff0c;四次挥手&#xff09;流量控制拥塞控制 效率机制滑动窗口延迟应答…

【进阶六】Python实现SDVRPTW常见求解算法——差分进化算法(DE)

基于python语言&#xff0c;采用经典差分进化算法&#xff08;DE&#xff09;对 带硬时间窗的需求拆分车辆路径规划问题&#xff08;SDVRPTW&#xff09; 进行求解。 目录 往期优质资源1. 适用场景2. 代码调整2.1 需求拆分2.2 需求拆分后的服务时长取值问题 3. 求解结果4. 代码…

Cloudshark数据包分析功能介绍

什么是CloudShark CloudShark是一种基于Web的数据包分析平台&#xff0c;可以认为是wiresshark的cloud版本&#xff0c;但是其在威胁分析等方面比Wireshark的功能强大&#xff0c;如下是他们的主要区别。 Wireshark VS Cloudshark Wireshark定位是一款本地开源的网络数据包分…

算法学习 | day40/60 单词拆分/多重背包/背包问题总结

一、题目打卡 1.1 单词拆分 题目链接&#xff1a;. - 力扣&#xff08;LeetCode&#xff09; class Solution { public:bool findInVector(vector<string> &w, string& s){for(auto & it : w){if(it s) return true;}return false;}bool wordBreak(string …

构建第一个ArkTS用的资源分类与访问

应用开发过程中&#xff0c;经常需要用到颜色、字体、间距、图片等资源&#xff0c;在不同的设备或配置中&#xff0c;这些资源的值可能不同。 应用资源&#xff1a;借助资源文件能力&#xff0c;开发者在应用中自定义资源&#xff0c;自行管理这些资源在不同的设备或配置中的表…

每日一题---OJ题: 相交链表

片头 嗨! 小伙伴们,大家好! 今天我们来一起学习这道OJ题---相交链表,准备好了吗? Ready Go! ! ! emmm,看这道题好像不怎么难,我们一起画图分析分析 上图中,A链表有5个结点,分别为 a1,a2,c1,c2,c3 ; B链表有6个结点,分别为 b1,b2,b3,c1,c2,c3 ; A链表和B链表在c1结点相交 …

RabbitMQ 消息重复消费问题

RabbitMQ 消息重复消费问题 解决消息重复消费问题 解决消息重复消费问题 需要在消费端考虑消息的幂等性&#xff1a; 幂等性&#xff1a;对一个接口的多次调用和一次调用得到的结果都是一样的 使用数据库的唯一越苏保证幂等性。

vue表格操作列,按钮太多显示... 点击后悬浮显示全部按钮

效果: 分析原理: 一共就三步,仔细看看很简单,位置要加对,代码结构下边有demo 代码结构demo: <el-table-columnlabel"操作"align"center"fixed"right"show-overflow-tooltip><template slot-scope"scope"><el-buttonsi…

java 将 json 数据转为 java 中的对象

一、准备 json 数据 {"name": "mike","age": 17,"gender": 1,"subject": ["math","english"] }二、对应的java对象 package com.demo.controller;import lombok.Data; import java.util.List;Data pu…

LightM-UNet:Mamba 辅助的轻量级 UNet 用于医学图像分割

摘要 https://arxiv.org/pdf/2403.05246.pdf UNet及其变体在医学图像分割中得到了广泛应用。然而&#xff0c;这些模型&#xff0c;特别是基于Transformer架构的模型&#xff0c;由于参数众多和计算负载大&#xff0c;使得它们不适合用于移动健康应用。最近&#xff0c;以Mamb…

SpringMVC原理及工作流程

组件 SpringMVC的原理主要基于它的各个组件之间的相互协作交互&#xff0c;从而实现了Web请求的接收&#xff0c;处理和响应。 它的组件有如下几个&#xff1a; DispatcherServlet前端控制器 HandlerMapping处理器映射器 Controller处理器 ModelAndView ViewResolver视图…

数字乡村可视化大数据-DIY拖拽式设计

DIY拖拽式大数据自由设计万村乐可视化大数据V1.0 随着万村乐数字乡村系统的广泛使用&#xff0c;我们也接收到了客户的真实反馈&#xff0c;最终在公司的决定下&#xff0c;我们推出了全新的可视化大数据平台V1.0版本&#xff0c;全新的可视化平台是一个通过拖拽配置生成可视化…

【测试篇】Selenium + Java环境搭建

文章目录 Selenium Java环境搭建配置系统环境变量PATH验证环境是否搭建成功常见问题&解决办法 Selenium Java环境搭建 Java版本最低要求为8&#xff0c;这里默认大家都下载好了Java。&#x1f606; 下载chrome浏览器&#xff08;点我下载&#xff09; 观察chrome版本。…