资源管理

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时还基于两个要求量优先级排序函数,如下:

优先级排序函数说明
LeastRequestedPriorityPod优先调度到拥有更多未分配资源量的节点
MostRequestedPriorityPod优先调度到拥有更少未分配资源量的节点

//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
在这里插入图片描述

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐