Kubernetes(K8s)_12_资源管理
Kubernetes(K8s)集群资源管理-CPU和内存
Kubernetes(K8s)_12_资源管理
资源管理
Kubernetes集群中资源管理分为:针对Pod、针对容器
1)实现方式为:资源请求量(requests)、资源限制量(limits)
2)主要限制资源为:CPU和内存
3)容器内部查看的资源信息是节点资源信息(而非容器本身)
4)CPU是可压缩资源,而内核和PVC是不可压缩资源
//可压缩资源:该资源不论是否被分配,在未被调用时可被其他对象临时占用
//Kubernetes集群中也可自定义限制资源类型(不能以kubernetes.io为前缀)
节点上资源的状态分为:节点总量、资源申请量、实际使用量、未分配资源量
1)节点总量:该节点拥有全部资源的总和;
2)资源申请量:节点中各个对象申请(request)到的资源量;
3)实际使用量:节点中各个对象在实际运行时所占用的资源量;
4)未分配资源量:节点中未分配给任何对象的资源量;
//节点总量 = 资源申请量 + 未分配资源量
如:查看节点的资源总量(Capacity)和未分配资源量(Allocatable)
//Scheduler的调度策略仅考虑节点的未分配资源量
requests/limits
在Pod中的定义通过requests和limits字段针对每个容器做资源管理:
1)可单独指定requests或limits字段;
2)若单独指定limits字段,则会自动复制limits字段以生成requests字段;
Pod中定义requests和limits的格式(其他省略):
spec:
containers:
resources:
requests:
资源要求1: 要求量1
资源要求N: 要求量N
limits:
资源限制1: 限制量1
资源限制N: 限制量N
(1)requests字段中需注意的事项:
1)调度Pod时,只有节点的未分配资源量满足该Pod要求量才拥有被分配权;
2)调度Pod时还基于两个要求量优先级排序函数,如下:
优先级排序函数 | 说明 |
---|---|
LeastRequestedPriority | Pod优先调度到拥有更多未分配资源量的节点 |
MostRequestedPriority | Pod优先调度到拥有更少未分配资源量的节点 |
//Scheduler只能根据一个优先级排序函数对Pod调度(后者使Pod紧凑编排)
3)request字段同时决定着节点中对象如何划分节点中未分配资源量(比率);
如:Node节点中两个请求CPU资源量的实际划分
//若后续添加其他对象,则该未分配资源量将会被回收(按照比率重新分配)
(2)limits字段中需注意的事项:
1)limits字段中指定的限制量总和可超过节点的资源总量;
2)若节点中对象的实际使用量超过资源总量,则会自动关闭部分容器;
3)当容器中进程申请的内存资源量超过内存限制量,则会被OOMKilled;
4)Kubelet会自动尝试重启因资源限制量而关闭的Pod,直到运行成功或删除;
//Pod被尝试重启时,会一直处于CrashLoopBackOff状态
//Kubelet以几何倍数增加重启的间隔时间,直到300s后固定(初始值:10s)
QoS
QoS(Quality of Service):划分Pod在同一命名空间中的优先级机制
1)QoS中优先级(从低到高):BestEffort、Burstable、Guarantedd
//当因竞争资源需关闭Pod时,优先关闭低优先级的Pod
(1)BestEffort(最低优先级)
Pod特征 |
---|
无requests和limits字段的Pod; |
1)该优先级的Pod没任何资源保证,优先“牺牲”以保证高优先级Pod的正常运行(但当资源充足时,可使用任意多的资源);
(2)Burstable
Pod特征 |
---|
requests字段和limits字段不相同的Pod |
仅定义requests字段的Pod |
(3)Guaranteed(最高优先级)
Pod特征 |
---|
CPU和内存均设置requests字段和limits字段 |
requests字段和limits字段相同 |
若存在多个容器,每个容器均满足以上两个条件 |
1)若存在一个容器不满足以上两个条件,则该Pod优先级为Burstable;
OOM分数:决定同优先级Pod的关闭顺序
1)Kubelet通过对比OOM分数,将OOM分数较高者先关闭;
2)OOM分数依靠以下两个参数计算:
参数 |
---|
容器的进程实际使用内存占申请内存的百分比 |
基于Pod的QoS优先级和容器内存申请量固定的OOM分数调节因子 |
LimitRange
LimitRange:实现单个Pod的资源管理
1)LimitRange属于Kubernetes的一种资源类型;
2)LimitRange资源通过LimitRange准入控制插件实现单个Pod的资源管理;
3)若命名空间中存在多个LimitRange,在校验Pod时会同时作用;
//新创建的LimitRange只会对之后创建Pod有影响(已存在的无影响)
创建LimitRange
创建LimitRange的格式:
apiVersion: v1
kind: LimitRange
metadata:
name: 名称
spec:
limits:
- type: 资源类型
defaultRequest:
资源要求1: 要求量1
资源要求N: 要求量N
default:
资源限制1: 限制量1
资源限制N: 限制量N
min:
资源要求1: 要求量1
资源要求N: 要求量N
max:
资源限制1: 限制量1
资源限制N: 限制量N
maxLimitRequestRatio:
资源要求量比限制量的最大比值1: 数值1
资源要求量比限制量的最大比值N: 数值N
1)可通过指定多个type字段实现对Pod的多个资源类型的管理;
2)defalutRequest和default分别指定Pod的request和limits的默认值;
3)limits字段中的min和max等效于Pod中requests和limits字段;
4)maxLimitRequestRatio字段限制子要要求量超过限制量的最大值;
如:在默认命名空间中创建LimitRange以限制创建的Pod
1)编写YAML文件;
2)创建LimitRange,并验证
ResourceQuota
ResourceQuota:限制命名空间中可用于分配的资源总量
1)ResourceQuota属于Kubernetes的一种资源类型;
2)ResourceQuota同时可限制在命名空间中创建的对象数量;
3)若通过ResourceQuota限制某一资源,则在创建Pod时必须指定该资源类型的requests或limits字段(否则API
Server会拒绝操作);
//新创建的ResourceQuota只会对之后创建Pod有影响(已存在的无影响)
创建ResourceQuota
创建ResourceQuota的格式:
apiVersion: v1
kind: ResourceQuota
metadata:
name: 名称
spec:
scopes:
- 范围1
- 范围N
hard:
request.资源类型: 要求量
limits.资源类型: 限制量
资源类型s: 数值N
1)若省略scopes字段,则默认应用于所有范围;
2)scopes字段中的范围分为以下4种:
范围名 | 说明 |
---|---|
BestEffort | 仅应用于QoS为BestEffot的Pod |
NotBestEffort | 仅应用于QoS不为BestEffort的Pod |
Termination | 仅应用于Pod指定activeDeadlineSeconds字段的Pod |
NotTerminating | 仅应用于Pod没指定activeDeadlineSeconds字段的Pod |
//spec.activeDeadlineSeconds字段指定Pod关闭前还可运行多长时间(单位:s)
如:创建ResourceQuota
更多推荐
所有评论(0)