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 使用为例。

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

被折叠的 条评论
为什么被折叠?



