K8s核心资源对象-Pod(资源配额与cgroup)
K8s核心资源对象-Pod(资源配额与cgroup)
基于1.25
Pod的资源配额
Pod主要通过requetsts和limits设置配额:
requests.cpu=250m后,实际上是把
cgroup
的cpu.shares
的值设置了(250/1000)*1024,默认值是1024limits.cpu=500m,实际上把
cgroup
的cpu.cfs_quota_us
的值设置为(500/1000)*100ms,而cpu.cfs_period_us
始终是100mslimits.memory=128Mi,相当于
cgroup
的memory.limit_in_bytes
设置为128 * 1024 * 1024,调度时,只会使用requests.memory=64Mi判断如果值设置了limits,没指定requests,没有应用准入时机制,requests的值同样会设置limits
生成cgroup资源的流程如下:
- 初始化Pause容器和其他容器都用调用calculateLinux Resource Func来计算最终资源
- 生成Linux的容器资源配额LinuxContainer Resource
LinuxContainer Resource字段
CpuPeriod:容器CPU时间长度,单位是微秒
CpuQuota:容器可以使用的CPU的时间量,单位微秒
- 不设置CpuQuota,容器可以允许使用全部时间的CPU时间
- CpuQuota小于CpuPeriod,则容器CPU资源将设置为CpuQuota/CpuPeriod比例
CpuShares:容器的CPU资源共享时间。CpuShares表示对CPU时间的相对访问权,而不是实际的时间片数。所有容器的CPU时间如果已经分配完,则CpuShares越大,获得CPU时间越多
MermoryLimtitInBytes:对容器内存使用的硬限制,单位为Bytes。容器无法使用超过此限制,超过容器困难强制退出
OomScoreAdj:设置内核Out-Of-Memory killer规则的一种机制,在内存资源紧张,终止系统的一些进程,释放更多内存资源
- 通过调试此值,可以提供容器被警告和终止的风险
- 默认0.无限制
CpusetCpus:容器能使用的CPU ID列表。”0-2,5,7“ 容器可以使用0,1,2 ,5,7 号CPU
CpusetMems:容器能使用的内存节点列表
HugepageLimits:容器对Hugepage的大小个数量限制
Unified:Linux cgroup v2参数,键值对表示参数名和值
MemeorySwapLimitInBytes:对容器使用swap的硬限制,单位为字节
- 不设置,默认2倍MermoryLimtitInBytes
// LinuxContainerResources specifies Linux specific configuration for |
计算资源配额
主要通过applySandboxResources func实现
- 计算Init容器和普通容器配额
- 计算Overhead指定的资源
- 初始化通用容器的配置
计算cgroup资源限制
calculateLinuxResources 会把用户指定的参数转换为 Linux参数
// calculateLinuxResources will create the linuxContainerResources type based on the provided CPU and memory resource requests, limits |
调度器计算资源的公式
// resourceRequest = max(sum(podSpec.Containers), podSpec.InitContainers) + overHead |
使用Describe命令查看资源数据的计算方法
累加使用普通容器(pod.Spec.Cotainers)中的资源
取所有Init容器的最大资源(pod.Spec.InitContainers)
如果配置了Pod开销(Overhead),则Pod开销添加到容器的总资源具有非0数量的总容器限制
// PodRequestsAndLimits returns a dictionary of all defined resources summed up for all |