Docker容器之cgroup搭建

一、知识剖析

  1. 什么是cgroup
  • Cgroups 是 control groups 的缩写,是 Linux 内核提供的一种可以限制、记录、隔离进程组(process groups)所使用的物理资源(如:cpu,memory,IO等等)的机制。最初由 google 的工程师提出,后来被整合进 Linux 内核。Cgroups 也是 LXC 为实现虚拟化所使用的资源管理手段,可以说没有cgroups就没有LXC。
  1. cgroup可以干什么
  • 限制进程组可以使用的资源数量(Resource limiting )。比如:memory子系统可以为进程组设定一个memory使用上限,一旦进程组使用的内存达到限额再申请内存,就会出发OOM(out of memory)。

  • 进程组的优先级控制(Prioritization )。比如:可以使用cpu子系统为某个进程组分配特定cpu share。

  • 记录进程组使用的资源数量(Accounting )。比如:可以使用cpuacct子系统记录某个进程组使用的cpu时间

  • 进程组隔离(Isolation)。比如:使用ns子系统可以使不同的进程组使用不同的namespace,以达到隔离的目的,不同的进程组有各自的进程、网络、文件系统挂载空间。

  • 进程组控制(Control)。比如:使用freezer子系统可以将进程组挂起和恢复。

  1. cgroup中需要了解的四个概念
  • Subsystems: 称之为子系统,一个子系统就是一个资源控制器,比如 cpu子系统就是控制cpu时间分配的一个控制器。
  • Hierarchies: 可以称之为层次体系也可以称之为继承体系,指的是Control Groups是按照层次体系的关系进行组织的。
  • Control Groups: 一组按照某种标准划分的进程。进程可以从一个Control Groups迁移到另外一个Control Groups中,同时Control Groups中的进程也会受到这个组的资源限制。
  • Tasks: 在cgroups中,Tasks就是系统的一个进程。

二、cgroup的部署

  • 此实验是基于docker已经安装好的基础上,且使用的系统是rhel7.3
  • 对cpu内存的限制
  1. 打开docker并检测cgroup是否开启
[root@foundation19 ~]# systemctl start docker
[root@foundation19 ~]# mount -t cgroup    ##都显示on即可
  1. 查看cgroup子系统的层级路径
[root@foundation19 ~]# cd /sys/fs/cgroup/
[root@foundation19 cgroup]# ll
total 0
drwxr-xr-x. 5 root root  0 Mar 23 08:57 blkio
lrwxrwxrwx. 1 root root 11 Mar 23 08:57 cpu -> cpu,cpuacct
lrwxrwxrwx. 1 root root 11 Mar 23 08:57 cpuacct -> cpu,cpuacct
drwxr-xr-x. 5 root root  0 Mar 23 08:57 cpu,cpuacct
drwxr-xr-x. 3 root root  0 Mar 23 08:57 cpuset
drwxr-xr-x. 5 root root  0 Mar 23 08:57 devices
drwxr-xr-x. 3 root root  0 Mar 23 08:57 freezer
drwxr-xr-x. 3 root root  0 Mar 23 08:57 hugetlb
drwxr-xr-x. 5 root root  0 Mar 23 08:57 memory
lrwxrwxrwx. 1 root root 16 Mar 23 08:57 net_cls -> net_cls,net_prio
drwxr-xr-x. 3 root root  0 Mar 23 08:57 net_cls,net_prio
lrwxrwxrwx. 1 root root 16 Mar 23 08:57 net_prio -> net_cls,net_prio
drwxr-xr-x. 3 root root  0 Mar 23 08:57 perf_event
drwxr-xr-x. 3 root root  0 Mar 23 08:57 pids
drwxr-xr-x. 5 root root  0 Mar 23 08:57 systemd
  1. 建立一个CPU控制族群
  • 首先进入cpu子系统对应的层级路径下:cd /sys/fs/cgroup/cpu
  • 通过新建文件夹创建一个cpu控制族群:mkdir x1,即新建了一个cpu控制族群:x1
  • 新建x1之后,可以看到目录下自动建立了相关的文件,这些文件是伪文件。
[root@foundation19 cgroup]# cd cpu
[root@foundation19 cpu]# ls
cgroup.clone_children  cpuacct.usage         cpu.rt_runtime_us  release_agent
cgroup.event_control   cpuacct.usage_percpu  cpu.shares         system.slice
cgroup.procs           cpu.cfs_period_us     cpu.stat           tasks
cgroup.sane_behavior   cpu.cfs_quota_us      docker             user.slice
cpuacct.stat           cpu.rt_period_us      notify_on_release  
[root@foundation19 cpu]# mkdir x1
[root@foundation19 cpu]# cd x1/
[root@foundation19 x1]# ll
total 0
-rw-r--r--. 1 root root 0 Mar 23 10:18 cgroup.clone_children
--w--w--w-. 1 root root 0 Mar 23 10:18 cgroup.event_control
-rw-r--r--. 1 root root 0 Mar 23 10:18 cgroup.procs
-r--r--r--. 1 root root 0 Mar 23 10:18 cpuacct.stat
-rw-r--r--. 1 root root 0 Mar 23 10:18 cpuacct.usage
-r--r--r--. 1 root root 0 Mar 23 10:18 cpuacct.usage_percpu
-rw-r--r--. 1 root root 0 Mar 23 10:18 cpu.cfs_period_us
-rw-r--r--. 1 root root 0 Mar 23 10:18 cpu.cfs_quota_us
-rw-r--r--. 1 root root 0 Mar 23 10:18 cpu.rt_period_us
-rw-r--r--. 1 root root 0 Mar 23 10:18 cpu.rt_runtime_us
-rw-r--r--. 1 root root 0 Mar 23 10:18 cpu.shares
-r--r--r--. 1 root root 0 Mar 23 10:18 cpu.stat
-rw-r--r--. 1 root root 0 Mar 23 10:18 notify_on_release
-rw-r--r--. 1 root root 0 Mar 23 10:18 tasks
  1. 测试限制cpu的使用
  • 我们的测试示例主要用到cpu.cfs_period_us和cpu.cfs_quota_us两个文件。
  • cpu.cfs_period_us:cpu分配的周期(微秒),默认为100000。
  • cpu.cfs_quota_us:表示该control group限制占用的时间(微秒),默认为-1,表示不限制。如果设为20000,表示占用20000/100000=20%的CPU。
[root@foundation19 x1]# cat cpu.cfs_period_us
100000
[root@foundation19 x1]# cat cpu.cfs_quota_us  ##默认为-1,表示不限制
-1

[root@foundation19 x1]# echo 20000 > cpu.cfs_quota_us
[root@foundation19 x1]# cat cpu.cfs_quota_us
20000
[root@foundation19 x1]# dd if=/dev/zero of=/dev/null &
[1] 5548
  1. 此时用top查看
  • 查看占用了百分之100
    在这里插入图片描述
  • 按1查看
    在这里插入图片描述
  1. 创建一个容器,并限制cpu的使用
[root@foundation19 x1]# echo 5548 > tasks 
[root@foundation19 x1]# fg
dd if=/dev/zero of=/dev/null
^C456424541+0 records in
456424541+0 records out
233689364992 bytes (234 GB) copied, 201.225 s, 1.2 GB/s

[root@foundation19 x1]# docker rm  vm1
vm1
[root@foundation19 x1]# docker run -it --name vm1 --cpu-quota=20000 ubuntu
root@59cc642e2e74:/# dd if=/dev/zero of=/dev/null
  • 再开一个shell查看 top > cpu 使用率20%
    在这里插入图片描述
  • 不做限制则为100%
[root@foundation19 x1]# docker run -it --name vm1  ubuntu
root@b57de623c536:/# dd if=/dev/zero of=/dev/null 

在这里插入图片描述

[root@foundation19 cpu]# pwd
/sys/fs/cgroup/cpu
[root@foundation19 cpu]# cd docker
[root@foundation19 docker]# ls
40036f2187cf8787924db508068bdfb10955d31e5c2cb6baa622afc80adba20a
[root@foundation19 docker]# cd 40036f2187cf8787924db508068bdfb10955d31e5c2cb6baa622afc80adba20a
[root@foundation19 40036f2187cf8787924db508068bdfb10955d31e5c2cb6baa622afc80adba20a]# cat cpu.cfs_quota_us 
20000      ##显示刚才所设置的大小
  • 限制写入速度
  1. 首先可以查看一下分区
[root@foundation19 ~]# docker run -it --rm --privileged=true ubuntu
root@0dacba0df90d:/# fdisk -l

Disk /dev/sda: 320.1 GB, 320072933376 bytes
255 heads, 63 sectors/track, 38913 cylinders, total 625142448 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00023675

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *        2048   613081087   306539520   83  Linux
/dev/sda2       613081088   625141759     6030336   82  Linux swap / Solaris
  1. 测试
[root@foundation19 ~]# docker run -it --rm --device-write-bps /dev/sda:30M ubuntu        ##写入速度为每秒30M
root@9810eb110add:/# dd if=/dev/zero of=file bs=1M count=300  

在这里插入图片描述

  • 限制内存的占用
  • 此实验是新开了一个虚拟机,不想对物理机做过多的更改
  1. 虚拟机安装docker并开启,下载软件
[root@docker1 ~]# systemctl start docker
[root@docker1 ~]# yum install -y lxcfs-2.0.5-3.el7.centos.x86_64.rpm
[root@docker1 ~]# cd /var/lib/lxcfs/
[root@docker1 lxcfs]# ls
[root@docker1 lxcfs]# cd 
[root@docker1 ~]# lxcfs /var/lib/lxcfs/ &
[1] 1197
[root@docker1 ~]# hierarchies:
  0: fd:   5: perf_event
  1: fd:   6: devices
  2: fd:   7: freezer
  3: fd:   8: net_prio,net_cls
  4: fd:   9: cpuset
  5: fd:  10: pids
  6: fd:  11: hugetlb
  7: fd:  12: memory
  8: fd:  13: cpuacct,cpu
  9: fd:  14: blkio
 10: fd:  15: name=systemd
  1. 测试
  • 查看初始状态
[root@docker1 ~]# cd /var/lib/lxcfs/
[root@docker1 lxcfs]# ls
cgroup  proc
[root@docker1 lxcfs]# cd proc/
[root@docker1 proc]# ls
cpuinfo  diskstats  meminfo  stat  swaps  uptime

##不设置的时候和虚拟机的内存是一样的
[root@docker1 proc]# free -m
              total        used        free      shared  buff/cache   available
Mem:            992         124         543           6         325         713
Swap:          2047           0        2047

[root@docker1 proc]# docker run -it --name vm1 ubuntu
root@20f6cdfa82f1:/# free -m
             total       used       free     shared    buffers     cached
Mem:           992        460        532          6          0        290
-/+ buffers/cache:        169        823
Swap:         2047          0       2047

在这里插入图片描述

  • 设置内存占用为200m
[root@docker1 proc]# docker run -it --name vm1 -m 200m -v /var/lib/lxcfs/proc/cpuinfo:/proc/cpuinfo \
> -v /var/lib/lxcfs/proc/diskstats:/proc/diskstats \
> -v /var/lib/lxcfs/proc/meminfo:/proc/meminfo \
> -v /var/lib/lxcfs/proc/stat:/proc/stat \
> -v /var/lib/lxcfs/proc/swaps:/proc/swaps \
> -v /var/lib/lxcfs/proc/uptime:/proc/uptime \
> ubuntu
root@322f87592f39:/# free -m

在这里插入图片描述

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Docker容器云平台搭建可以通过使用Kubernetes来实现。Kubernetes是一个开源的容器编排平台,它可以帮助我们管理和调度大规模的Docker容器集群。下面是搭建Docker容器云平台的步骤: 1. 安装Docker和Kubernetes:首先,需要在所有的节点上安装Docker和Kubernetes。可以按照官方文档提供的步骤进行安装。 2. 初始化Kubernetes集群:在主节点上运行以下命令来初始化Kubernetes集群: ```shell kubeadm init ``` 3. 配置Kubernetes网络:Kubernetes需要一个网络插件来实现容器之间的通信。常用的网络插件有Flannel、Calico等。选择一个适合你的网络插件,并按照其文档进行配置。 4. 加入工作节点:在工作节点上运行以下命令,将其加入到Kubernetes集群中: ```shell kubeadm join <master-node-ip>:<master-node-port> --token <token> --discovery-token-ca-cert-hash <hash> ``` 5. 部署容器云平台:使用Kubernetes的资源配置文件(YAML文件)来部署容器云平台的各个组件,如Master节点、Worker节点、网络插件、存储等。可以使用kubectl命令来创建和管理这些资源。 6. 部署应用程序:使用kubectl命令或Kubernetes Dashboard来部署和管理应用程序。可以通过创建Deployment、Service等资源来定义和管理应用程序的运行。 7. 监控和扩展:使用Kubernetes提供的监控和扩展功能来监控和管理容器云平台。可以使用Prometheus、Grafana等工具来监控集群的状态,并使用Horizontal Pod Autoscaler来自动扩展应用程序的副本数量。 请注意,以上步骤只是一个简单的概述,实际搭建过程可能会更加复杂,具体的步骤和配置取决于你的需求和环境。建议参考Kubernetes官方文档和相关教程来获取更详细的指导。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值