Cgroup(资源控制)/添加磁盘

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
1、#docker如何做资源限制的(比如说内存的限制)
docker run -m 去限制内存

2、#原理是什么
-m指定限制内存的数量,docker通过内核参数,也就是Cgroup对资源进行限制


3、#Cgroup的作用
在操作系统解决了资源相与隔离的问题以后,还需要解决资源限制的问题,也就是避免在同一个操作系统中,防止有些资源消耗较大的容器,将整个物理机器(宿主机)的硬件资源(CPU,Memory)占满。


在Linux 系统中能够控制的资源列表如下
memory #内存限制
hugetlb #huge pages 使用量
cpu #限制CPU使用率
cpuacct #统计cgroups中的进程的CPU使用报告
cpuset #绑定cgroups到指定 CPUs和 NUMA节点
innodb_lock_wait_timeout #block设备的I0速度
not_cls #网络接口设置优先级
devices #mknode访问设备权限
freezer #suspend和restore cgroups 进程
perf_event #性能监控
pids #限制子树 cgroups 总进程数

4、#容器与容器之间的资源如何隔离?
Namespace 名称空间隔离

5、#为什么容器之间的资源可以通过ns进行隔离?
因为docker容器运行起来是一个进程,每一个容器都是一个进程,进程之间用来资源隔离的就是Namespace

查看系统实现的限制资源

1
2
3
4
5
6
7
8
9
10
11
12
13
14
[root@docker01 node]# cat /proc/cgroups 
#subsys_name hierarchy num_cgroups enabled
cpuset 11 7 1
cpu 3 77 1
cpuacct 3 77 1
memory 7 77 1
devices 5 77 1
freezer 10 7 1
net_cls 2 7 1
blkio 9 77 1
perf_event 4 7 1
hugetlb 6 7 1
pids 8 77 1
net_prio 2 7 1

1、案例:限制SSH内存使用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
1、限制系统服务内存
[root@docker01 node]# cd /sys/fs/cgroup/memory/system.slice/sshd.service/

2、查看内存服务限制(byte)
[root@docker01 sshd.service]# cat memory.limit_in_bytes
9223372036854771712

3、计算一下,大概是7G,这个是默认值,不管系统内存多大,每个进程默认最大使用7G,这样就相当于没有做任何限制·
[root@docker01 sshd.service]# python
>>> 9223372036854771712/1024/1024/1024/1024/1024/1024
7

4、ssh服务不是拿容器起起来的,如果想给他限制,就需要改文件里面的数字大小
设置限制内存
[root@docker01 sshd.service]# echo 64K > memory.limit_in_bytes
执行之后,ssh就立马端口连接了,只写1个字节,根本就连不上ssh

5、到虚拟机里面查看日志
tailf /var/log/messages

6、可以发现,远程连接时,会杀进程,因为远程连接会产生一个进程,但是ssh被做了限制
,会杀掉连接的进程

Cgroup调用内核参数,如果做限制,就改memory.limit_in_bytes文件,内核来读取这个文件来进行限制

image-20240912151039561

1
2
3
4
[root@docker01 sshd.service]# echo 9223372036854771712 > memory.limit_in_bytes

[root@docker01 sshd.service]# cat memory.limit_in_bytes
9223372036854771712

2、OverlayFS

OverlayFS 实现方式

OverlayFS通过三个目录:lower目录、upper目录、以及work目录实现,其中lower目录可以是多个,upper目录为可以进行读写操作的目录, work目录为工作基础目录,挂载后内容会被清空,且在使用过程中其内容用户不可见,最后联合挂载完成给用户呈现的统一视图称为merged目录。

image-20240913170119816

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#模拟overlayfs存储方式
1.创建文件
[root@k8s01 ~]# mkdir /lower{1..3}
[root@k8s01 ~]# mkdir /upper /work /merged

2.挂载文件系统
[root@k8s01 ~]# mount -t overlay overlay -o
lowerdir=/lower1:/lower2:/lower3,upperdir=/upper,workdir=/work /merged

3.查看挂载
[root@k8s01 ~]# mount | grep merged

4.在/upper 目录中写入文件,在merged中可以显示
[root@k8s01 /]# touch /upper/upper.txt
[root@k8s01 /]# ll /merged/
-rw-r--r-- 1 root root 0 Mar 14 02:17 upper.txt

5. 在merged中写入文件, 实际存储到了/uppper
[root@k8s01 /]# touch /merged/d.txt
[root@k8s01 /]# ll /upper/
-rw-r--r-- 1 root root 0 Mar 14 02:19 d.txt


注:如果没有upperdir, merged是只读的
[root@node-2 overlay2]# umount /merged
[root@node-2 overlay2]# mount -t overlay overlay -o lowerdir=/lower1:/lower2 /merged
[root@k8s01 /]# touch /merged/c.txt
touch: cannot touch ‘/merged/c.txt’: Read-only file system

3、扩展添加磁盘和更改docker默认数据目录

1
2
3
1、先关机

2、添加磁盘

image-20240913172422996

image-20240913172442557

image-20240913172500576

image-20240913172538917

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
3、查看添加的磁盘
[root@docker01 ~]# fdisk -l
Disk /dev/sda: 21.5 GB, 21474836480 bytes, 41943040 sectors
......
.....
#/dev/sdb是新添加的磁盘
Disk /dev/sdb: 10.7 GB, 10737418240 bytes, 20971520 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

4、创建分区
[root@docker01 ~]# fdisk /dev/sdb
Command (m for help): n
Partition type: ## 选择主分区还是扩展分区
p primary (0 primary, 0 extended, 4 free)
e extended
Select (default p): p # 主分区
Partition number (1-4, default 1): 1 # 一个分区
First sector (2048-104857599, default 2048): ## 设置开头扇区大小,我选择默认
Last sector, +sectors or +size{K,M,G} (2048-104857599, default 104857599): ## 设置最后扇区大小,我选择默认
Partition 1 of type Linux and of size 50 GiB is set ## 分区成功
Command (m for help): w ## 退出


5、再次查看磁盘
[root@docker01 ~]# fdisk -l
.....
Disk /dev/sdb: 10.7 GB, 10737418240 bytes, 20971520 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 label type: dos
Disk identifier: 0x481c9cdc

Device Boot Start End Blocks Id System
/dev/sdb1 2048 20971519 10484736 83 Linux
#新分区 /dev/sdb1

5、格式化分区
[root@docker01 ~]# mkfs.xfs /dev/sdb1

6、查看分区的UUID
[root@docker01 ~]# blkid /dev/sdb1
/dev/sdb1: UUID="65cdcede-223b-40ad-aa68-6165b7606b71" TYPE="xfs"

7、#设置永久挂载
方法一:这个方法如果写错一个字母,很可能造成系统起不来,所以写完了要仔细检查
[root@docker01 ~]# vim /etc/fstab
#把内容加入最后一行
UUID=65cdcede-223b-40ad-aa68-6165b7606b71 /docker_data xfs defaults 0 0


方法二:写入自启动文件 这个写错了不会造成系统起不来的情况
vim /root/.bashrc
mount -t xfs /dev/sdb1 /docker_data
不要影响文件原先的内容

8、临时挂载
[root@docker01 ~]# mkdir /docker_data
[root@docker01 ~]# mount -a

9、查看磁盘分区
[root@docker01 ~]# df -Th
Filesystem Type Size Used Avail Use% Mounted on
/dev/mapper/centos-root xfs 19G 14G 5.1G 73% /
devtmpfs devtmpfs 1.6G 0 1.6G 0% /dev
tmpfs tmpfs 1.6G 0 1.6G 0% /dev/shm
tmpfs tmpfs 1.6G 12M 1.6G 1% /run
tmpfs tmpfs 1.6G 0 1.6G 0% /sys/fs/cgroup
/dev/sda1 xfs 497M 126M 372M 26% /boot
tmpfs tmpfs 318M 0 318M 0% /run/user/0
/dev/sdb1 xfs 10G 33M 10G 1% /docker_data

如下步骤可以不需要操作,如果不更改docker默认数据目录的话,不需要操作,如果更改了数据目录,之前拉的镜像就需要重新拉取

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#修改docker默认数据目录的操作

1、在配置文件里面添加目录信息
[root@docker01 docker_data]# vim /etc/docker/daemon.json
{
"insecure-registries": ["http://10.0.0.105","http://172.16.1.101:5000"],
"data-root": "/docker_data"
}
[root@docker01 docker_data]# systemctl daemon-reload
[root@docker01 docker_data]# systemctl restart docker

2、查看docker信息
[root@docker01 docker_data]# docker info
Docker Root Dir: /docker_data