cgroup, docker,和kubernetes

原创
2017/03/27 11:01
阅读数 4.2K

0. cgroups

跑一个耗cpu的脚本

x=0
while [ True ];do
    x=$x+1
done;

top可以看到这个脚本基本占了100%的cpu资源

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND          
30142 root      20   0  104m 2520 1024 R 99.7  0.1  14:38.97 sh

下面用cgroups控制这个进程的cpu资源

mkdir -p /cgroup/cpu/foo/ #新建一个控制组foo

echo 50000 > /cgroup/cpu/foo/cpu.cfs_quota_us  #将cpu.cfs_quota_us设为50000,相对于cpu.cfs_period_us的100000是50%
echo 30142 > /cgroup/cpu/foo/tasks

然后top的实时统计数据如下,cpu占用率将近50%,看来cgroups关于cpu的控制起了效果

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND                                                                                         30142 root      20   0  105m 2884 1024 R 49.4  0.2  23:32.53 sh 

cpu控制组foo下面还有其他的控制,还可以做更多其他的关于cpu的控制

[root@localhost ~]# ls /cgroup/cpu/foo/
cgroup.event_control  cgroup.procs  cpu.cfs_period_us  cpu.cfs_quota_us  cpu.rt_period_us  cpu.rt_runtime_us  cpu.shares  cpu.stat  notify_on_release  tasks

1. docker

docker run --help | grep cgroup 
      --cgroup-parent string                  Optional parent cgroup for the container

这个参数指定的cgroup的配置文件的位置,指定位置run后


# docker run --cgroup-parent "/" nginx


localhost:/sys/fs/cgroup/cpu # ls
cgroup.clone_children  cpuacct.stat          cpu.cfs_quota_us   cpu.stat                                                          notify_on_release  user.slice
cgroup.event_control   cpuacct.usage         cpu.rt_period_us   docker                                                            release_agent
cgroup.procs           cpuacct.usage_percpu  cpu.rt_runtime_us  f296b0316c259262e78110174f3b4a7329b026af99a14730f11cc0f215be9741  system.slice
cgroup.sane_behavior   cpu.cfs_period_us     cpu.shares         foo                                                               tasks


localhost:/sys/fs/cgroup/cpu # docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
f296b0316c25        nginx               "/entrypoint.sh"    2 minutes ago       Up 2 minutes                            berserk_mclean


其中 f296b0316c25这个目录就是创建的这个容器的cgroup控制目录

如果--cgroup-parent没有设置为/, 那么控制目录应该在 /sys/fs/cgroup/cpu/docker/

2. kubernetes控制

kubelet也提供了这个参数,用于定义pod的容器启动的cgroup控制

定义pod

localhost:/tmp/manifest # cat aa.manifest 
# Copy of pod.yaml without file extension for test
apiVersion: v1
kind: Pod
metadata:
  name: nginx
  labels:
    name: nginx
spec:
  containers:
  - name: nginx
    image: nginx
    ports:
    - containerPort: 80

用kubelet裸启动

kubelet --cgroup-root=/ --config /tmp/manifest/

localhost:/sys/fs/cgroup/cpu/docker # docker ps
CONTAINER ID        IMAGE                                      COMMAND                  CREATED             STATUS                  PORTS               NAMES
1adc2179227f        nginx                                      "nginx -g 'daemon off"   1 seconds ago       Up Less than a second                       k8s_nginx.156efd59_nginx-localhost_default_0539f3e7389c317750cd6a23a5509685_8a29cc5d
902c8aa23657        gcr.io/google_containers/pause-amd64:3.0   "/pause"                 4 seconds ago       Up 3 seconds                                k8s_POD.b2390301_nginx-localhost_default_0539f3e7389c317750cd6a23a5509685_24406b11

观察cgroup的根目录位置

localhost:/sys/fs/cgroup/cpu # ls
1adc2179227fa461ac349357b7fde73fdd47636b868aa5403875d79ca33d584b  cgroup.procs          cpuacct.usage_percpu  cpu.rt_runtime_us  foo                tasks
902c8aa236578d11bc8d97f4a7cfb72465fad1fdca0a6752735191d5638b5460  cgroup.sane_behavior  cpu.cfs_period_us     cpu.shares         notify_on_release  user.slice
cgroup.clone_children                                             cpuacct.stat          cpu.cfs_quota_us      cpu.stat           release_agent
cgroup.event_control                                              cpuacct.usage         cpu.rt_period_us      docker             system.slice

看到1adc了,同时也可以 pause容器的ID, 证明了这个选项起作用了。

展开阅读全文
打赏
0
1 收藏
分享
加载中
更多评论
打赏
0 评论
1 收藏
0
分享
返回顶部
顶部