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