K8S QoS
Kubernetes QoS 介绍
QoS 指 服务质量保证,k8s 提供了 requests 和 limits 两种类型对资源进行分配和使用限制。对于一个 pod 来说,服务质量体现在两个为 2 个具体的指标,
Cpu 与 Memory。实际过程中,当某个 Node 节点上内存资源紧张时,k8s 会根据预先设置的不同 QoS 类别进行相应处理。
Kubernetes Qos 分类
Guarantee
Pod 中所有容器都必须对 cpu 和 memory 同时设置 limits。如果任何一个容器设置了 requests ,则所以其他容器必须设置 requests 配置,同时需要设置与
requests 相同值对 limits 配置。# 例 1:只设置 limits 则 request 值等于 limits resources: limits: cpu: "100m" memory: "32Mi" # 例 2:同时设置相等的 requests 与 limits resources: requests: cpu: "100m" memory: "32Mi" limits: cpu: "100m" memory: "32Mi"
Burstable
Pod 中有任何一个容器的 requests 与 limits 不相等。# 例 1:有任何一个容器没有指定 resoureces containers: name: c1 resources: requests: cpu: "100m" memory: "32Mi" limits: cpu: "200m" memory: "128Mi" --- containers: name: c2 # 例 2:有任何一个容器没有指定 cpu 或 memory 的 requests 或 limits 的值 containers: name: c1 resources: limits: cpu: "200m" --- containers: name: c2 resources: limits: memory: "128Mi" # 例 3:有任何一个容器配置不匹配,c1 未设置 limits,c2 未设置 limits、requests containers: name: c1 resources: requests: cpu: "200m" memory: "128Mi" --- containers: name: c2
Best-Effort
Pod 中所有容器都没设置 requests、limits,而使用默认值。containers: name: c1 --- containers: name: c2 --- containers: name: c3
Kubernetes QoS 优先级
- qos 三种类型的优先级如下:
Kubernetes QoS 终止顺序
当 k8s 中的 Node 节点的资源耗尽时,会对某些 Pods 进行资源回收(杀死 Pods),回收顺序根据 Qos 类型决定。
- Best-Effort: 资源耗尽时,这个类型的 Pods 会优先被杀死。
- Burstable: 资源耗尽时,如果没有 Best-Effort 类型的 Pods 时,这个类型的 Pods 会被杀死。
- Guaranteed: 资源耗尽时,如果没有 Best-Effort 或 Burstable 类型的 Pods 时,这个类型的 Pods 会被杀死。
Kubernetes QoS 配置建议
- 资源充足时:建议使用 Guaranteed 类型的 QoS 配置。可以保证 Pods 中容器可以持续、稳定的获得需要的资源。
- 资源有限时:建议使用 Burstable 类型的 Qos 配置。可以有效的保证资源利用率。
假设场景:应对 JVM 预热问题
- JVM 在预热开始时,需要更多的 CPU(3 个)来进行预热;
- JVM 在预热结束后,需要少数的 CPU(1 个)来保证程序运行;
可以使用如下配置,保证预热和运行阶段都有充足的资源保证 pod 运行:resoures: requests: cpu: 1000m memory: 1000Mi limits: cpu: 3000m memory: 1000Mi 由于 Kubernetes 使用 request 中指定的值来调度 Pod,它会找到具有 1000m CPU 容量的节点来调度这个 Pod。但是由于 3000m 的 limits 要高得多,如果应用程序在任何时候都需要超过 1000m 的 CPU,并且该节点上有空闲的 CPU 容量,那么就不会在 CPU 上限制应用程序。 如果可用,它最多可以使用 3000m。
参考资料:
Kubernetes-Qos 之 Guaranteed, Burstable,Best-Effor
Java 服务启动慢,JVM 预热的问题,我在 k8s 上改进了
本博客所有文章除特别声明外,均采用 CC BY-SA 3.0协议 。转载请注明出处!