首页 > 其他分享 >4-3 docker隔离机制-cgroups

4-3 docker隔离机制-cgroups

时间:2024-04-09 22:38:01浏览次数:21  
标签:容器 cgroups 隔离 cgroup memory docker CPU 资源

Control Group  控制组群
使用CGroups限制这个环境的资源使用情况

cgroup:
比如一台16核32GB的机器上只让容器使用2核4GB。使用CGroups还可以为资源设置权重,计算使用量,操控任务(进程或线程)启停等;
在/sys/fs/cgroup下面有很多如cpu、memory这样的子目录,也叫子系统,这些都是这台机器当前可以被Cgroup进行限制的资源种类,而在子系统对应的资源种类下,你就可以看到该类资源具体可以被限制的方法
Cgroups也有不完善的地方,最大的缺点就是/proc文件系统(存储记录当前内核运行状态的一系列特殊文件)的问题。

cgroup是Linux内核主要用于限制和隔离一组进程对系统资源的使用,也就是做资源QoS。可控制的资源主要包括CPU、内存、block I/O、网络带宽等等。cgroup 是将任意进程进行分组化管理的 linux 内核功能,cgroup 本身是提供将进程进行分组化管理的功能和接口的基础结构(各自的细节资源管控下的tasks文件记录了这个Cgroup的所有进程(包括线程))
现在的cgroups适用于多种应用场景,从单个进程的资源控制,到实现操作系统层次的虚拟化;
Cgroups是透过阶层式的方式来管理的,和程序、子群组相同,都会由它们的 parent 继承部份属性。然而,这两个模型之间有所不同
由于k8s官网推荐使用systmed(docker默认安装也是systemd)

cgroups是Linux的另外一个强大的内核工具,有了cgroups,不仅可以限制被namespace隔离起来的资源,还可以为资源设置权重、计算使用量、操控任务(进程或县城)启停等。
即:cgroups可以限制、记录任务组所使用的物理资源(包括CPU,Memory,IO等),是构建Docker等一系列虚拟化管理工具的基石。
cgroups为不同用户层面的资源管理提供了一个统一接口,从单个的资源控制到操作系统层面的虚拟化,cgroups提供了4大功能。
1 资源限制
cgroups可以对任务使用的资源总额进行限制。如设定应用运行时使用的内存上限,一旦超过配额就发出OOM提示。
2 优先级分配
通过分配的CPU时间片数量以及磁盘IO带宽大小,实际上就相当于控制了任务运行的优先级。
3 资源统计
cgroups可以统计系统的资源使用量。如CPU使用时长,内存用量等,这个功能非常适用于计费。
4 任务控制
cgroups可以对任务进行挂起、恢复等操作。

在容器里该如何获取实例资源使用情况呢 --从CGroups中读取
Docker在1.8版本以后会将分配给容器的CGroups信息挂载进容器内部,容器里面的程序可以通过解析CGroups信息获取到容器资源信息。
在容器里面可以运行mount -t cgroups命令查看这些挂载记录。
对容器CGroups都做了哪些支持:
- 当为Pod指定了requests,其中 requests.cpu 会作为--cpu-shares 参数值传递给 docker run 命令,当一个宿主机上有多个容器发生CPU资源竞争时这个参数就会生效,参数值越大,越容易被分配到CPU,requests.memory 不会作为参数传递给Docker,这个参数在Kubernetes的资源QoS管理时使用;
- 当为Pod指定了limits,其中 limits.cpu 会作为 --cpu-quota 参数的值传递给 docker run 命令,docker run 命令中另外一个参数 --cpu-period 默认设置为100000,通过这两个参数限制容器最多能够使用的CPU核数,limits.memory 会作为 --memory 参数传递给docker run 命令,用来限制容器内存,目前Kubernetes不支持限制Swap大小,建议在部署Kubernetes时候禁用Swap。
https://access.redhat.com/documentation/zh-cn/red_hat_enterprise_linux/7/html/resource_management_guide/sec-cpu
Kubernetes 1.10 以后支持为Pod指定固定CPU编号。以常规的计算资源管理为主,以Kubernetes作为编排引擎,容器的CGroups资源限制情况计算:
1、读取容器CPU核数
#这个值除以100000得到的就是容器核数
# cat  /sys/fs/cgroup/cpu/cpu.cfs_quota_us

2、获取容器内存使用情况(USAGE / LIMIT)
# cat /sys/fs/cgroup/memory/memory.usage_in_bytes
# cat /sys/fs/cgroup/memory/memory.limit_in_bytes
将这两个值相除得到的就是内存使用百分比。

3、获取容器是否被设置了OOM,是否发生过OOM
# cat /sys/fs/cgroup/memory/memory.oom_control
oom_kill_disable 0
under_oom 0
#解释:
oom_kill_disable默认为0,表示打开了oom killer,就是当内存超时会触发kill进程。可以在使用docker run时候指定disable oom,将此值设置为1,关闭oom killer;
under_oom 这个值仅仅是用来看的,表示当前的CGroups的状态是不是已经oom了,如果是,这个值将显示为1。

4、获取容器磁盘I/O
# cat /sys/fs/cgroup/blkio/blkio.throttle.io_service_bytes
253:16 Read 20015124480
253:16 Write 24235769856
253:16 Sync 0
253:16 Async 44250894336
253:16 Total 44250894336
Total 44250894336

5、获取容器虚拟网卡入/出流量
# cat /sys/class/net/eth0/statistics/rx_bytes
# cat /sys/class/net/eth0/statistics/tx_bytes

3、docker隔离依然存在的问题
3.1 存在的问题
Docker是利用CGroups实现资源限制的,只能限制资源消耗的最大值,而不能隔绝其他程序占用自己的资源;
Namespace的6项隔离看似完整,实际上依旧没有完全隔离Linux资源。
如/proc 、/sys 、/dev/sd*等目录未完全隔离,SELinux、time、syslog等信息都未隔离。
3.2 示例
在Docker容器中执行top、free等命令,会发现看到的资源使用情况都是宿主机的资源情况,而我们需要的是这个容器被限制了多少CPU,内存,当前容器内的进程使用了多少;
在容器里修改/etc/sysctl.conf,会收到提示”sysctl: error setting key ‘net.ipv4….’: Read-only file system”;
程序运行在容器里面,调用API获取系统内存、CPU,取到的是宿主机的资源大小;
对于多进程程序,一般都可以将worker数量设置成auto,自适应系统CPU核数,但在容器里面这么设置,取到的CPU核数是不正确的,例如Nginx,其他应用取到的可能也不正确,需要进行测试。
 
  

 

标签:容器,cgroups,隔离,cgroup,memory,docker,CPU,资源
From: https://www.cnblogs.com/skyzy/p/18125007

相关文章

  • 4-2 docker隔离机制-namespace
    1、使用Namespaces实现了系统环境的隔离Docker实际上是在创建容器进程时,指定了这个进程所需要启用的一组Namespace参数,这样容器就只能看到当前Namespace所限定的资源、文件、设备、状态。而对于宿主机以及其他不相干的程序,就完全看不见了http://www.dockone.io/article/8148常......
  • 4-1 Docker容器实现原理
    Docker容器实现原理主要是namespace和cgroup控制资源的隔离。虽然Docker可透过Namespace的方式分隔出看似是独立的空间,然而Linux内核(Kernel)却不能Namespace,所以即使有多个Container,所有的systemcall其实都是通过主机的内核处理,这便为Docker留下了不可否认的安全问题。虚拟机......
  • 2-3、dockerfile之wordpress
    wordpress:4.2#cddocker-training/wordpress/#ls-a.license.txtwp-config-sample.phpwp-login.php..readme.htmlwp-contentwp-mail.phpDockerfilewp-activate.phpwp-cron.php......
  • 2-2、dockerfile之php-fpm,mysql
    dockerfile之php-fpm#cddocker-training/php-fpm/#lsDockerfilenginx_nginx.confsupervisor_nginx.confnginx_default.confphp_www.confsupervisor_php-fpm.conf各文件解释:nginx_nginx.conf替换默认的nginx.conf文件nginx_default.conf替换默......
  • 1-1、Docker命令详解
    Docker命令详解#docker--helpUsage:docker[OPTIONS]COMMAND[arg...]dockerdaemon[--help|...]docker[-h|--help|-v|--version]Aself-sufficientruntimeforcontainers.主要选项:-d:以后台进行方式运行容器-t:提供一个伪终端-......
  • 1-2、docker命令
    docker命令1run主要选项:-d:以后台进行方式运行容器-t:提供一个伪终端-i:提供交互输入,一般与“-t”一起使用,如果只提供“-i”选项,则容器启动后是无法退出的-v:映射一个volume给容器,如:-p/data/www:/var/www/html-p:将容器的端口映射给宿主机(指定映射出的端口),......
  • 2-1、dockerfile之centos7
    docker基础及dockerfile1、docker组件(C/S)dockerclient:docker客户端dockerserver:dockerdaemon的主要组成部分,接受用户通过dockerclient发送的请求,并按照相应的路由规则实现路由分发docker镜像:docker镜像运行之后变成容器(dockerrun)dockerregistry:镜像仓库,registry......
  • 1-0 docker介绍
    dockerdocker与传统的虚拟化方式相比:docker的启动在秒级;docker对系统资源利用率高,一台主机可以同时运行多个docker容器;docker基本不消耗系统资源,使得运行在docker里面的应用的性能很高;更快的支付和部署:开发者可以使用一个标准的镜像来构建一套开发容器,开发完成后,运维人员可......
  • 【Linux】虚拟化技术docker搭建SuitoCRM系统及汉化
    CRM系统CRM(CustomerRelationshipManagement,客户关系管理)系统是一种用于管理和优化企业与客户关系的软件工具。在商业竞争激烈的现代社会中,CRM系统已成为许多企业提高销售、增强客户满意度和实现持续增长的重要工具。本文将介绍CRM系统的概念、功能以及其在企业中的重要性......
  • docker ——网络配置和管理
    docker网络基础了解docker网络两种docker网络单主机与多主机的docker网络网络驱动网络驱动介绍bridge桥接网络,这是默认的网络驱动程序host主机网络overlay覆盖网络macvlan将mac地址分配给容器,使容器作为网络上的物理设备none表示关闭容器的所有......