k8s下cgroups管理
k8s对cgroups的管理是通过kubelet组件完成的,涉及的cgroups分类如下:
- 组件级
cgroups: - 容器运行时控制组:
--runtime-cgroups
1.组件级cgroups
容器级资源控制
默认情况下,容器可以无限制地使用主机的cpu资源,可以通过设置参数来进行限制。一般都采用Linux默认的CFS调度法,当然也可以使用实时调度。CFS调度可以使用如下参数来进行限制:
常用指标:
cpu.cfs_period_us:指定cpu CFS的周期,通常和--cpu-quota一起使用,单位是us,默认值是100毫秒cpu.cfs_quota_us:指定容器在一个cpu CFS调度周期中可以使用cpu的时间,单位是us。默认不限制memory.limit_in_bytes: 内存使用量,默认不限制
pod级资源控制
pod级cgroup + QoS
- Guaranteed (该策略下,设置的requests 等于 limits)
- Burstable(该策略下,设置的requests 小于 limits)
- BestEffort(该策略下,没有设置requests 、 limits)
当某个node内存被严重消耗时,BestEffort策略的pod会最先被kubelet杀死, 其次Burstable(该策略的pods如有多个,也是按照内存使用率来由高到低地终止), 再其次Guaranteed。
Node级别资源控制
kubelet会将所有的pod都创建一个kubepods的cgroup下,通过该cgroup来限制node上运行的pod最大可以使用的资源
如:/sys/fs/cgroup/cpu/kubepods.slice/
该cgroup的资源限制取值为: ${Node Capacity} - ${Kube-Reserved} - ${System-Reserved}, 即:节点总配额 - K8s预留 - 系统服务预留
${Allocatable} = ${Node Capacity} - ${Kube-Reserved} - ${System-Reserved} - ${Hard-Eviction-Threshold}
即:pod可申请资源配额 = 节点总配额 - K8s预留 - 系统服务预留 - 驱逐低优先级pod的阈值
其中kube-reserved是为kubernetes组件提供的资源预留,system-reserved是为系统组件预留的资源, 分别通过--kube-reserved, --system-reserved来指定,例如--kube-reserved=cpu=100m,memory=100Mi
{Hard-Eviction-Threshold}为在资源紧张的时候kubelet主动驱逐低优先级pod的阈值