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 cpu cpuacct cpuset innodb_lock_wait_timeout not_cls devices freezer perf_event pids 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 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文件,内核来读取这个文件来进行限制
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目录。
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 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 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 ...... ..... 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 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 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