关于容器技术

容器技术主要包括Namespace和Cgroup这两个内核特性

Namespace又称为命名空间(也可翻译为名字空间),它主要做访问隔离,其原理是针对一类资源进行抽象,并将其封装在一起提供一个容器使用,对于这类资源,因为每个容器都有自己的抽象,而它们彼此之间是不可见的,所以就可以做到访问隔离。

Cgroup是contrl group简称,又称为控制组,它主是要做资源控制,其原理是将一组进程放在一个控制组里,通过给这个控制组分配指定的可用资源,达到控制这一组进程可用资源的目的。

容器组成

容器=cgroup+namespace+rootfs+容器引擎(用户太工具)

Cgroup:资源控制

Namesapce:访问隔离

rootfs:文件系统隔离

容器引擎:生命令周期控制

Cgroup介绍

Cgroup中实现的子系统及其作用如下

devices:设备权限控制

cpuset:分配指定的CPU和内存节点

cpu:控制CPU占用率

cpuacct:统计CPU使用情况

memory:限制内存的使用上限

freezer:冻结(暂停)Cgroup中的进程

net_cls:配合tc(traffic controller)限制网络带宽

net_prio:设置进程的网络流量优先级

huge_tlb:限HugeTLB的使用

perf_event:允许Perf工具基于Cgroup分组做性能监测

Cgroup的接口和使用

挂载cgroupfs

[root@localhost ~]# mount -t cgroup -o cpuset cpuset /sys/fs/cgroup/cpuset/

查看cgroupfs

[root@localhost etc]# ls /sys/fs/cgroup/cpuset/
cgroup.clone_children cpuset.cpu_exclusive cpuset.mem_exclusive cpuset.memory_pressure_enabled cpuset.sched_load_balance tasks
cgroup.event_control cpuset.cpus cpuset.mem_hardwall cpuset.memory_spread_page cpuset.sched_relax_domain_level
cgroup.procs cpuset.effective_cpus cpuset.memory_migrate cpuset.memory_spread_slab notify_on_release
cgroup.sane_behavior cpuset.effective_mems cpuset.memory_pressure cpuset.mems release_agent

创建cgroup

[root@localhost ~]# mkdir /sys/fs/cgroup/cpuset/child

通过mkdir创建一个新的目录,也创建了一个新的Cgroup

配置Cgroup

[root@localhost ~]# echo 0 > /sys/fs/cgroup/cpuset/child/cpuset.cpus
[root@localhost ~]# echo 0 > /sys/fs/cgroup/cpuset/child/cpuset.mems

 

使用能Cgroup
[root@localhost ~]# echo $$ > /sys/fs/cgroup/cpuset/child/tasks 

通过将进程ID写入tasks文件就可以把进程移动到这个Cgroup中,并且这个进程产生的所有子进程也会自动放在Cgroup里,这时Cgroup才真正起作用了,

Cgroup子系统介绍

cpuset子系统可以为一组进程分配指定的CPU和内存节点。

cpuset的主要接口如下

cpuset.cpus:允许进程使用的CPU列表(例如0~4,9)

cpuset.mems:允许进程使用的内存节点列表(例如0~1)

cpu子系统用于限制进程的CPU利用率

CPU比重分配:这个特性使用的接口是cpu.shares.

CPU带宽限制:这个特性使用的接口是cpu.cfs.period_us和cpu.cfg_quota_us

实时进程的CPU带宽限制

 cpuacct子系统

用来统计各个Cgroup的CPU使用情况

cpuacct.stat :报告这个Cgroup分别在用户态和内核态消耗的CPU时间,音位是USER_HZ,USER_HZ在x86上一般是100,即1USER_HZ等于0.01秒。

cpuacct.usage:报告这个Cgroup消耗的总CPU时间,单位是纳秒。

cpuacct.usage_percpu:报告这个Cgroup在各个CPU上消耗的CPU时间,总和也就是cpuacct.usage的值。

memory子系统

memory子系统用来限制Cgroup所能使用的内存上限

memory.limit_in_bytes:设定内存上限单位是字节,也可以使用k/K,m/M或者g/G表示要设置数值的单位,例如:#echo 1G > memory.limit_in_bytes

memory.memsw.limit_in_bytes:设定内在加上交换分区的使用总量,通过设置这个值可以防止进程把交换分区用光。

memory.oom_control:如果设置为0,那么在内存使用量超过上限时,系统不会“杀死”进程,而是阻塞进程直到有内存被告释放量超过使用时,另一方面,系统会向用户态发送事件通知,用户态的监控程序可以根据该事件来做相应的处理,例如提高内存上限等。

memory.stat:汇报内存使用信息。

blkio子系统用来限制Cgroup的block I/O带宽

blkio.weight:设置权重,范围在100到1000之间,这跟cpu.shares类似,是比重分配,而不是绝对带宽的限制,因此只有当不同的Cgroup在争用同一个块设备的带宽时才会起作用。

blkio.weight_device:对具体的设备设置权重值,这个值会覆盖上述的blkio.weight。例如:#echo 8:0 100 > blkio.weight_device。

blkio.throttle.read_bps_device:对具体设备,设置每秒读磁盘的带宽上限。例如对/dev/sda的读取带宽限制在1MB/秒。

    #echo "8:0 1048576" > blkio.throttle.read_bps_device

blkio.throttle.write_bps_device:设置每秒写磁盘的带宽上限,同样需要指定设备。

blkio.throttle.read_iops_device:设置每秒读磁盘的IOPS上限,同样需要指定设备。

blkio.throttle.write_iops_device:设置每秒写磁盘的IOPS上限,同样需要指定设备。

device子系统用来控制Cgroup的进程对哪些设备有访问权限

device.list。只读文件,显示目前允许被访问的设备列表,每个条目都有3个域,分别为:

类型:可以是a,c或b,分别表示所有设备,字符设备和块设备。

设备号:格式为major:minor的设备号。

权限:rwm的组合,分别表示可读,可写,可创建设备结点(mknod)

例如“a *:* rmw",表示所有设备都可以被访问,而“c 1:3 r“,表示对1:3这个字符设备(即/dev/null)只有读权限。

device.allow。只写文件,以上面描述的格式写入该文件,就可以允许相应的设备访问权限

device.deny。只写文件,以上面描述的格式写入该文件,就可以禁止相应的设备访问权限

 Namespace介绍

内核总共有6种Namespace

 IPC:隔离System V IPC和POSIX消息队列。

 Network:隔离网络资源

   Mount:隔离文件系统挂载点

   PID: 隔离进程ID

   UTS:隔离主机名和域名

   User:隔离用户ID和组ID

各个Namespace介绍性

UTS Namespace:用于对主机名和域名进行隔离开

IPC Namespace:进和间通信。

[root@localhost ~]# ipcmk -Q
消息队列 id:32769

[root@localhost ~]# ipcs -q

--------- 消息队列 -----------
键 msqid 拥有者 权限 已用字节数 消息
0x86c8b18f 0 root 644 0 0
0xb10b9ee9 32769 root 644 0 0

PID Namespace:用于隔离进程PID号,不同的Namespace里的进程PID号就可是不一样的了。

Mount Namespace:隔离文件系统挂载点,每个进程能看到的文件系统都记录在/proc/$$/mounts里

[root@localhost ~]# ls /proc/$$/mounts
/proc/8381/mounts

Network Namespace:对网络相关的系统资源隔离,每个Network Namespace都有自己的网络设备,IP地址,路由表,/proc/net/目录,端口号等。

创建一个Network Namespace

[root@localhost ~]# ip netns add net_ns

[root@localhost ~]# ip netns exec net_ns ip link list
1: lo: <LOOPBACK> mtu 65536 qdisc noop state DOWN mode DEFAULT group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00

看到只有lookback这个网络接口,并且它还因处于DOWN状态而不可用

[root@localhost ~]# ip netns exec net_ns ping 127.0.0.1
connect: 网络不可达

[root@localhost ~]# ip netns exec net_ns ip link set dev lo up
[root@localhost ~]# ip netns exec net_ns ping 127.0.0.1
PING 127.0.0.1 (127.0.0.1) 56(84) bytes of data.
64 bytes from 127.0.0.1: icmp_seq=1 ttl=64 time=0.221 ms
64 bytes from 127.0.0.1: icmp_seq=2 ttl=64 time=0.095 ms
64 bytes from 127.0.0.1: icmp_seq=3 ttl=64 time=0.095 ms

[root@localhost ~]# ip netns delete net_ns

 

User Namespace隔离用户和组ID,

 

posted @   星火撩原  阅读(190)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示