Featured image of post K8S的容器执行kill命令怎么让重启容器

K8S的容器执行kill命令怎么让重启容器

K8S中限制容器的CPU

k8s 的一个资源清单:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
apiVersion: v1
kind: Pod
metadata:
  name: cpu-memory-demo
spec:
  containers:
  - name: cpu-memory-demo
    image: stress
    resources:
      requests:
        memory: 50Mi
        cpu: 1
      limits:
        memory: 300Mi
        cpu: 3

容器就是 Namespace 和 Cgroup,Namespace 做隔离、Cgroup 做资源限制。所以Cgroup下有一个 CPU Cgroup 来限制容器的使用的 CPU。

Linux 中普遍的调度算法是 CFS (Completely Fair Scheduler,完成公平调度),在CPU Cgroup中有两个跟CFS有关的参数:

  • cpu.cfs_period_us:是 CFS 算法的一个调度周期,一般它的值是 100000,以 microseconds 为单位,也就 100ms。

  • cpu.cfs_quota_us:表示 CFS 算法中,在一个调度周期里这个控制组被允许的运行时间,比如这个值为 50000 时,就是 50ms。

  • cpu.shares:表示在机器CPU被占满了的时候,各 CPU Cgroup 的分配比例。例如:有group1的cpu.shares=1024和group2的cpu.shares=3072,服务器一共4个CPU,group1:group2=1:3,即group1只能占用1个CPU,而group3能够占用3个CPU。

cpu.cfs_period_us/cpu.cfs_quota_us占用的CPU,如:50ms/100ms=0.5个CPU。一般cpu.cfs_period_us是固定的不修改,都是通过修改cpu.cfs_quota_us来限制CPU占用。

这些存放在/sys/fs/cgroup/cpu,如/sys/fs/cgroup/cpu/group1/sys/fs/cgroup/cpu/group2文件目录下写入文件:

  • cgroup.procs文件:该cgroup控制的pid

  • cpu.cfs_quota_us: 150000。限制为 1.5 CPU

  • cpu.shares:1024

requests.cpu 和 limits.cpu

requests.cpu 就是 cpu.share的值,它是确保即使在CPU满载的情况下,PID仍能获取到的CPU。

limits.cpu 就是 cpu.cfs_period_us/cpu.cfs_quota_us 的值,最大能获取的 CPU 。

假如服务有4个CPU:

1、在单独启动如下的容器时,该容器能占用的CPU为300%,即3个CPU。

1
2
3
4
5
6
      requests:
        memory: 50Mi
        cpu: 1
      limits:
        memory: 300Mi
        cpu: 3

2、如果再启动一个容器,下面这个容器能占用 3 个CPU,上面的容器占用的 CPU 就会被降为 1 个CPU

1
2
3
4
5
6
      requests:
        memory: 50Mi
        cpu: 3
      limits:
        memory: 300Mi
        cpu: 3

Request CPU 就是无论其他容器申请了多少 CPU ,即使运行时整个节点都被沾满的情况下,我的这个容器还是可以保证获取到需要的 CPU 数目。Limit CPU 就是限制容器能够申请的 CPU 上限。

解释:

服务器有4个CPU,在不考虑Limit CPU的情况下,而且都设置了cpu.shares。group2 运行的容器有四个线程运行的时候可以四个CPU。group1 有 2 个线程,当 group1 的容器也运行起来的时候,2个线程最大可以消耗2个CPU。由于group2的cpu.shares的设置,保证了group2可以占用3个CPU,而分配给group1的只有1个CPU。

Licensed under CC BY-NC-SA 4.0