资源类型
- 可压缩资源(compressible resources): 当可压缩资源不足时, Pod 只会“饥饿”,但不会退出。比如 CPU
- 不可压缩资源(compressible resources): 当不可压缩资源不足时,Pod 就会因为 OOM (Out-Of-Memory) 被内核杀掉。
kubernetes 里 Pod 的 CPU 和内存资源,实际上还要分为 limits 和 requests 两种情况。在调度时,kube-scheduler 只会按照 requests 的值进行计算,而在真正设置 cgroup 限制的时候,kubelet 则会按照 limits 的值进行设置。
在对内存调度时,如果设置 limits.memory = 128 Mi,则在 Cgroups 的 memory.limit_in_bytes 为 12810241024,而调度器只会使用 requests.memory=64Mi 来进行判断。
这样操作的目的是为了作业时,减小它的资源额度,以便容纳更多的作业,提升资源利用率。而当作业资源使用量增加到一定阈值时,则会快速恢复原有设置。
QOS 模型
Kubernetes 通过 requests 和 limits 来实现资源配置。当调度的时候,参考 requests 的值设置,当设置 Cgroup 时,用 limits 的设置。
在 kubernetes 中,不同的 requests 和 limits 的设置方法,会将这个 Pod 划分到不同的 QoS 当中。
- Guaranteed:当 Pod 里的每一个 Container 都同时设置了 requests 和 limits 时,且两个值相等。如果 Pod 只是设置了 limits 但是 requests 没有写, kubernetes 会自动为它设置与 limits 相同的 requests 值。
- Burstable :当 Pod 不满足 Guaranteed 的条件,但至少有一个 Container 设置了 requests。
- BestEffort:如果一个 Pod 既没有设置 requests,也没有设置 limits。
当资源紧张的时候,Kubelete 对 Pod 进行 Eviction(资源回收)时需要用到的。Eviction 也分为Soft 和 hard 两种模式,Soft 模式下通过设置一段 available 时间,延长 Eviction 启动时间。
在资源紧张的情况下,kubelet 先删除 BestEffort ,其次时 Burstable,最后是 Guaranteed 类别
cpuset 用于设置 CPU 的亲和性,可以限制 cgroup 中的进程只能在指定的 CPU 上运行,或者不能再指定的 CPU 上运行。在 kubernetes 中,需要做到两点就可以:
- Pod 必须是 Guaranteed 的 QoS 类型;
- Pod 的 CPU 资源 requests 和 limits 设置为同一个相等的整数值即可。
