QoS in Kubernetes

1.原则

  • 通过limit保证不同pod只能占用指定的资源
  • 集群资源允许被超额分配
  • 为pod划分等级确保不同的QoS,资源不足时,低等级的会被清理

    2.语义

    limits

    系统允许容器运行时可能使用的资源量的最高上限
    最多允许使用的上限,超过时进程会被杀掉

    requests

    K8S调度时能为容器提供的完全可保障的资源量
    最少的资源下限,当node上资源少于该值,pod将不会被调度到此node上

    m=milli unit,表示千分之一
    M=1000

3.资源范围

cpu/mem/gpu/huge-page(v1.14)

1
2
3
resources:
limits:
hugepages-2Mi: 100Mi

4.基于request和limit的调度机制

调度时不看实际的使用资源量,看已运行pod的request总和作为已占用资源的度量

K8S pod资源的特点

分为 完全可靠资源不可靠资源,通过这种机制实现 超卖
完全可靠的资源 = request
不可靠资源 = limit - request

可压缩/不可压缩资源

可压缩资源:CPU

空闲资源按照Request的比例进行分配
pod的cpu使用超过limit时,cgroups会对pod进行限流throttled

不可压缩资源:内存

超过request可能会被杀掉
超过limit时,内核会杀掉容器中使用内存最多的一个,直到不超过limnit为止

5. 服务质量等级QoS Class

优先级递减:Guaranteed > Burstable > BestEffort

Guaranteed

所有容器request=limit(仅设置Limit时也等效)

Burstable

requests不等于limits

BestEffort

所有容器的request和limit都未定义

OOM Score

OOM Score = 内存占用百分比 * 10 + 调整分(OOM_SCORE_ADJ)

OOM_SCORE_ADJ

Guaranteed: -998, BestEffort: 1000,
Busrtable:

  • request > 99.8%内存, 2
  • <,1000 - 内存占用百分比 * 10
  • request=0, 999

    特殊的OOM_SCORE

    kubelet/docker: -998
    不会被杀掉的进程: -999