kubernetes资源实现解密

背景:

k8s调度的基本单元是pod,但是对资源的限制是在容器粒度上的

k8s对资源的限制设置,最终原理是赋值到docker使用linux 的cgroup 的cpuset来实现

k8s ---> docker ---> linux cgroup

k8s的设置参数主要有:

Limits:

cpu: 16

memory: 20Gi

Requests:

cpu: 10m

memory: 10Mi

docker的参数主要有:

v1.13以后

  • –cpus 指定容器所需的cpu核数;其实现方式只是指定的对应cpu核心数相对的资源总量,容器可能会在多个核心上运行,可能涉及到上下文切换的消耗;
  • –cpu-shares 指定多个容器抢占有限的资源时能够分配到cpu资源的权重;需要搭配着其他两个命令一起使用,单纯使用该命令,或在没有资源抢占的情况下使用该命令没有意义;
  • –cpuset-cpus 指定容器绑定到具体哪些cpu核上运行;资源隔离相对较好,但也可能存在多个容器同时被绑定到同一个核上的情况。 宿主机上有4core:

v1.13之前 @hxx 云搜的版本是1.12 转化成下面两个参数

--cpu-period 用来指定容器对CPU的使用要在多长时间内做一次重新分配; @hxx 理解为cpu运行的时间周期,当某个进程占用的cpu时间=2*cpu-period ,则这个进程占用200%cpu

--cpu-quota 用来指定在这个周期内,最多可以有多少时间用来跑这个容器。跟–cpu-shares不同的是这种配置是指定一个绝对值,而且没有弹性在里面,容器对CPU资源的使用绝对不会超过配置的值。

 

k8s到docker 如何转换?

request 被转化为 —cpu-share 参数

  • 如果request=0 && limit !=0, —cpu-shares=limit

你可能感兴趣的:(kubernetes资源实现解密)