K8S QOS

对于一个 pod 来说,服务质量体现在两个具体的指标:CPU 和内存。当节点上内存资源紧张时,kubernetes 会根据预先设置的不同 QoS 类别进行相应处理。

  • guaranteed (有保证的)
  • burstable (不稳定的)
  • Best-Effort (尽力而为)

Guaranteed

  • Pod中的所有容器都且仅设置了 CPU 和内存的 limits
  • pod中的所有容器都设置了 CPU 和内存的 requests 和 limits ,且单个容器内的requests==limits(requests不等于0)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#### set limit
containers:
name: xiemx1
resources:
limits:
cpu: "10m"
memory: "1Gi"
name: xiemx2
resources:
limits:
cpu: "100m"
memory: "100Mi"

#### request=limit
containers:
name: xiemx1
resources:
limits:
cpu: "10m"
memory: "1Gi"
requests:
cpu: "10m"
memory: "1Gi"

name: xiemx2
resources:
limits:
cpu: "100m"
memory: "100Mi"
requests:
cpu: "100m"
memory: "100Mi"

Burstable

  • pod中只要有一个容器的requests和limits的设置不相同
  • pod中只要有一个容器的cpu or memory 没有设置limits
1
2
3
4
5
6
7
8
9
10
containers:
name: xiemx1
resources:
limits:
memory: "1Gi"

name: xiemx2
resources:
limits:
cpu: "100m"

Best-Effort

  • Pod中所有容器的resources均未设置requests与limits
1
2
3
4
5
containers:
name: xiemx1
resources:
name: xiemx2
resources:

不同策略的QOS回收策略实现

Kubernetes 通过cgroup给pod设置QoS级别,当资源不足时先kill优先级低的pod,通过OOM_ADJ参数计算分数值来实现,OOM分数值范围为0-1000。计算出来的OOM分数越高,表明该pod优先级就越低,当出现资源竞争时会越早被kill掉

  • Guaranteed级别的 Pod,OOM_ADJ参数设置成了-998
  • Best-Effort级别的 Pod,OOM_ADJ参数设置成了1000
  • 对于Burstable级别的 Pod,OOM_ADJ参数取值从2到999
  • kuberntes 保留资源,比如kubelet,docker,OOM_ADJ参数设置成了-999,表示不会被OOM kill掉

QoS pods被kill掉场景与顺序

  • Best-Effort pods:系统用完了全部内存时,该类型 pods 会最先被kill掉。
  • Burstable pods:系统用完了全部内存,且没有 Best-Effort 类型的容器可以被 kill 时,该类型的 pods 会被 kill 掉。
  • Guaranteed pods:系统用完了全部内存,且没有 Burstable 与 Best-Effort 类型的容器可以被 kill 时,该类型的 pods 会被 kill 掉。

参考:https://www.qikqiak.com/post/kubernetes-qos-usage/