容器限速和流量采集01-Namespace和Cgroup

本文详细介绍了在提供容器化PAAS服务的场景下,如何使用Docker和Linux cgroups来限制容器对网络、磁盘、CPU及内存的使用,确保资源隔离。内容包括namespace和cgroups的作用,以及如何通过cgroups限制进程的CPU使用,并展示了docker在资源配置上的使用方法。同时,讨论了cgroup的不同版本和driver,以及在实际操作中的配置示例。

1 应用场景

在提供容器化PAAS服务的场景下,跟公有云场景下对于VM的需求类似,我们需要能够限制容器 对于网络、磁盘、CPU以及内存的使用,避免某个容器对资源的占用过高导致影响其他容器使用的情况。目前直接使用 docker 原生的 cgroup 对磁盘、CPU以及内存资源使用进行限制基本够用。但是对于网络的使用限制,需要自己来实现。容器化PAAS服务需要对宿主机上跑的各个业务容器做宽带限速和宽带流量进行计费。宿主机的网络有单网口和多网口接入两种类型,宿主机上配置的容器的network也需要支持 host和bridge两种模式。

2 docker 容器的隔离性

2.1 linux namespace

Docker 容器使用 linux namespace 来隔离其运行环境,使得容器中的进程看起来就像在一个独立环境中运行一样。linux namespace目的是将某个特定的全局系统资源(global system resource)通过抽象方法使得namespace 中的进程看起来拥有它们自己的隔离的全局系统资源实例。Linux 内核中实现了六种 namespace。

namespace description
Mount namespace中看到不同的文件系统
UTS namespace有自己的hostname 和 domainame
IPC 只有在同一个 IPC namespace 的进程之间才能互相通信
PID 每个 PID namespace 中的进程可以有其独立的 PID
Network 独立的网络设备,IP 地址,IP 路由表
User 独立的user 和 group id

2.2 linux cgroup(controll groups)

namespace提供的是虚拟环境到宿主机的一个映射,但是并没有限制对宿主机资源的使用,要限制宿主机网络、磁盘、CPU以及内存的使用,需要使用 linux cgroup 来实现。

linux cgroup 目前有 v1,v2两个版本,cgroup driver 主要有 cgroupfs、systemd 两种,也就是有使用 systemd 的 linux 系统,cgroup 的配置已经集成到 systemd。systemd是Kubernetes自带的cgroup driver,而docker的cgroup driver默认是cgroupfs。同时运行有两个cgroup控制管理器,当资源有压力的情况时,有可能出现不稳定的情况。

以 cgroupfs cgroupv1版本为例,/sys/fs/cgroup 目录中有若干个子目录,对应受 cgroups 控制的资源,

cgroup description
blkio 对块设备输入输出限制
cpu,cpuacct 对CPU的使用限制
cpuset 多核系统中可以指定使用哪些cpu核
devices 各种访问设备限制
freezer 挂起或恢复任务
hugetlb 对HugeTLB系统大文件系统进行限制
memory 内存使用限制
net_cls,net_prio 网络使用限制以及网络优先级配置

2.3 使用 cgroup 对某个 linux 进程进行资源限制配置

上面 docker 对于 CPU 资源使用限制的配置是基于 linux cgroup 来实现的,我们也可以使用 cgroup 来对某个进程做资源限制配置。还是以显示 CPU 使用为例。

2.3.1 不限制 CPU 使用的情况下运行一个测试程序

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值