14、计算资源管理
资源管理的两个维度
维度 | 说明 | 实质 |
---|---|---|
资源申请(resources.requests) | 声明了该容器对某类资源需求的最小值。 | 1、调度pod时:调度器只关心当前节点上所有pod的资源申请之和是否会超出当前节点的资源总和。 2、资源空余时,调度器根据requests的比例分配空余资源。 |
资源限制(resources.limits) | 声明了该容器使用某类资源的硬限制(其总和允许超过节点资源总和)。 | 当容器内运行的进程申请的不可压缩的资源类型超过limits设定值的时候pod会被Kill掉。 |
资源类型
资源类型 | 是否可压缩 | 说明 |
---|---|---|
cpu | 可压缩 | 可以在不对容器内运行的进程产生不利影响的同时,对其使用量进行分配。 |
memory | 不可压缩 | 系统为某进程分配了一块内存,这块内存在进程主动进行释放之前将无法被回收。 因此对mem进行limits限制意义重大,否则一个进程会吃掉一台机器所有的mem而无法释放 |
自定义资源(如gpu、npu等) | \ | \ |
QoS等级和条件
等级 | 条件 |
---|---|
BestEffort(优先级最低) | 没有给任何容器设置任何requests和limits。 |
Burstable | 其他情况。 |
Guaranteed(优先级最高) | 为每个容器都设置了cpu和mem的requests和limits,且requests和limits相等。 |
通过命名空间管理计算资源
- LimiteRange
- 限制某个命名空间下单个pod、container(cpu+mem)限制默认值和范围限制。
- 限制某个命名空间下单个PVC的存储容量上限和下限。
- ResourceQuota
- 限制命名空间中所有pod允许使用的资源(cpu+mem)总量
- 限制命名空间中所有PVC的总量限制。
- 限制命名空间中K8s资源的对象个数
- 为特定pod状态或特定QoS等级指定配额。
知识点
- pod对资源的请求量和限制量是它所包含的所有容器的请求量和限制量之和。
- 调度器有两种优先级排序算法:
LeastRequestedPriority
和MostRequestedPriority
。 - 重启策略为
Always
或OnFailure
的pod被OOMKilled
的时候会被立即重启,用户几乎察觉不到。但pod持续OOM会导致重启间隔逐渐加大,并处于CrashLoopBackOff
状态。 - 在容器内看到的始终是节点的内存和CPU,而不是容器本身的内存和CPU。如使用top命令。
- limits的弊端
- Java应用不使用
-Xmx
选项指定虚拟机最大堆大小时,JVM会将其设置为主机物理内存的百分百,立刻被k8s给Kill掉。 - 老版本Java即使设置了
-Xmx
也仅仅限制了堆大小,而不管其他的off-heap
内存,新版Java解决了此问题。 - 一些程序通过查询系统CPU核数决定启动工作线程的数量。这在k8s上是不合适的,可以使用
Downward API
将CPU限额传递给容器,也可以让进程通过cgroup系统直接获取配置的CPU限制。
- Java应用不使用
- QoS等级划分可以指定pod的优先级,通过该优先级可以决定关键时刻该Kill哪个pod。当QoS相等时通过比较
OOM分数
来决定Kill哪个Pod,此分数体现了内存实际使用量占比内存申请量的比例。 - kubelet自带的资源监控组件cAdvisor+Heapster只能保存比较短的时间窗内资源使用量数据。
命令
# 创建一个pod并设置资源申请情况
kubectl run pod-xxx --image=xxx --restart Never --requests='cpu=800m,memory=20Mi' -- dd if=/dev/zero of=/dev/null
# 查看当前节点的资源分配情况,其中Capacity为节点资源总量,Allocatable为当前可分配资源总量。
kubectl describe node-xxx
# pod详情的status.qosClass可以查看pod的QoS等级
kubectl describe pod-xxx
# 获取cgroup对CPU的限制
cat /sys/fs/cgroup/cpu/cpu.cfs_quota_us
cat /sys/fs/cgroup/cpu/cpu.cfs_period_us
# 查看资源配额
kubectl describe quota
# 显示某节点实际的cpu和mem使用情况
kubectl top node-xxx
# 显示所有pod的实际的cpu和mem使用情况
kubectl top pod --all-namespaces
TODO
了解Cgroup原理,docker和Cgroup的关系。
Cgroup对CPU的资源管理除了quota、period外还有一个参数。
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 nz_nuaa@163.com