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/