容器资源管理
描述
可以通过namespace和cgroup等功能实现对容器的资源管理。isula支持使用cgroup v1和cgroup v2实现对资源的限制,其中 cgroup v2属于实验特性,不支持商用。当系统配置为只支持cgroup v2并将cgroup v2挂载到/sys/fs/cgroup目录时,isula使用 cgroup v2来进行资源管理。无论是cgroup v1还是使用cgroup v2对容器资源进行管理,isula提供给用户实现资源限制的接口是 一致的。
资源共享
描述
容器间或者容器与host之间可以共享namespace信息,包括pid, net, ipc, uts。
说明:
当使用与主机共享namespace信息时,即缺少了对应的namespace隔离机制,在容器中可以查询、操作主机上的信息,存在安全 隐患。比如使用--pid=host共享主机pid namespace时,即可以看到主机上其他进程信息,造成信息泄露,甚至直接kill杀死主机 进程。请在确保安全的场景下,谨慎使用共享主机host namespace功能。
用法
isula create/run时使用namespace相关的参数共享资源,具体参数见下方参数列表。
参数
create/run时可以指定下列参数。
示例
如果两个容器需要共享同一个pid namespace,在运行容器时,直接加上--pid container:<containerID> 即可,如:
isula run -tid --name test_pid busybox sh
isula run -tid --name test --pid container:test_pid busybox sh
限制运行时的CPU资源
描述
可以通过参数限制容器的各项cpu资源值。
用法
isula create/run时使用cpu相关的参数限制容器的各项cpu资源值,具体参数及取值见下方参数列表。
参数
create/run时可以指定下列参数。
示例
如果需要限制容器只是用特定的cpu,在运行容器时,直接加上--cpuset-cpus number 即可,如:
isula run -tid --cpuset-cpus 0,2-3 busybox sh
说明:
是否设置成功,请参见“查询单个容器信息”章节。
限制运行时的内存
描述
可以通过参数限制容器的各项内存值上限。
用法
isula create/run时使用内存相关的参数限制容器的各项内存使用上限,具体参数及取值见下方参数列表。
参数
create/run时可以指定下列参数。
64位整数(int64)。值为-1或非负数,-1表示不限制,0表示不设置(不限制);单位可以为空(byte),KB,MB,GB,TB,PB. | |||
示例
如果需要限制容器内内存的上限,在运行容器时,直接加上--memory <number>[<unit>]即可,如:
isula run -tid --memory 1G busybox sh
限制运行时的IO资源
描述
可以通过参数限制容器中设备读写速度。
用法
isula create/run时使用--device-read-bps/--device-write-bps <device-path>:<number>[<unit>]来限制容器中设备的读写速度。
参数
create/run时指定--device-read/write-bps参数。
64位整数(int64)。值为正整数,可以为0,0表示不设置(不限制);单位可以为空(byte),KB,MB,GB,TB,PB. |
示例
如果需要限制容器内设备的读写速度,在运行容器时,直接加上--device-write-bps/--device-read-bps <device-path>:<number>[<unit>]即可,例如,限制容器busybox内设备/dev/sda的读速度为 1MB 每秒,则命令如下:
isula run -tid --device-write /dev/sda:1mb busybox sh
限制写速度的命令如下:
isula run -tid read-bps /dev/sda:1mb busybox sh
限制容器rootfs存储空间
描述
在ext4上使用overlay2时,可以设置单个容器的文件系统限额,比如设置A容器的限额为5G,B容器为10G。
该特性通过ext4文件系统的project quota功能来实现,在内核支持的前提下,通过系统调用SYS_IOCTL设置某个目录的project ID,再通过系统调用SYS_QUOTACTL设置相应的project ID的hard limit和solft limit值达到限额的目的。
用法
环境准备
文件系统支持Project ID和Project Quota属性,4.19版本内核已经支持,外围包e2fsprogs版本不低于1.43.4-2。
在容器挂载overlayfs之前,需要对不同容器的upper目录和work目录设置不同的project id,同时设置继承选项,在容器挂载overlayfs之后不允许再修改project id和继承属性。
配额的设置需要在容器外以特权用户进行。
daemon中增加如下配置
-s overlay2 --storage-opt overlay2.override_kernel_check=true
daemon支持以下选项,用于为容器设置默认的限制,
--storage-opt overlay2.basesize=128M 指定默认限制的大小,若isula run时也指定 了--storage-opt size选项,则以run时指定来生效,若daemon跟isula run时都不指定大小,则表示不限制。
需要开启文件系统Project ID和Project Quota属性。
新格式化文件系统并mount
# mkfs.ext4 -O quota,project /dev/sdb # mount -o prjquota /dev/sdb /var/lib/isulad
参数
create/run时指定--storage-opt参数。
rootfsSize解析出的大小为int64范围内以字节表示的正数,默认单位为B,也可指定为([kKmMgGtTpP])?[iI]?[bB]?$。(device mapper场景下最小取值为10G) |
示例
在isula run/create命令行上通过已有参数“--storage-opt size=<value>”来设置限额。其中value是一个正数,单位可以是[kKmMgGtTpP]?[iI]?[bB]?,在不带单位的时候默认单位是字节。
# isula run -ti --storage-opt size=10M busybox
/ # df -h
Filesystem Size Used Available Use% Mounted on
overlay 10.0M 48.0K 10.0M 0% /
none 64.0M 0 64.0M 0% /dev
none 10.0M 0 10.0M 0% /sys/fs/cgroup
tmpfs 64.0M 0 64.0M 0% /dev
shm 64.0M 0 64.0M 0% /dev/shm
/dev/mapper/vg--data-ext41
9.8G 51.5M 9.2G 1% /etc/hostname
/dev/mapper/vg--data-ext41
9.8G 51.5M 9.2G 1% /etc/resolv.conf
/dev/mapper/vg--data-ext41
9.8G 51.5M 9.2G 1% /etc/hosts
tmpfs 3.9G 0 3.9G 0% /proc/acpi
tmpfs 64.0M 0 64.0M 0% /proc/kcore
tmpfs 64.0M 0 64.0M 0% /proc/keys
tmpfs 64.0M 0 64.0M 0% /proc/timer_list
tmpfs 64.0M 0 64.0M 0% /proc/sched_debug
tmpfs 3.9G 0 3.9G 0% /proc/scsi
tmpfs 64.0M 0 64.0M 0% /proc/fdthreshold
tmpfs 64.0M 0 64.0M 0% /proc/fdenable
tmpfs 3.9G 0 3.9G 0% /sys/firmware
/ #
/ # dd if=/dev/zero of=/home/img bs=1M count=12 && sync
dm-4: write failed, project block limit reached.
10+0 records in
9+0 records out
10432512 bytes (9.9MB) copied, 0.011782 seconds, 844.4MB/s
/ # df -h | grep overlay
overlay 10.0M 10.0M 0 100% /
/ #
约束
限额只针对rw层。
overlay2的限额是针对容器的rw层的,镜像的大小不计算在内。
内核支持并使能。
内核必须支持ext4的project quota功能,并在mkfs的时候要加上-O quota,project,挂载的时候要加上-o prjquota。任何一个不满足,在使用--storage-opt size=<value>时都将报错。
# isula run -it --storage-opt size=10Mb busybox df -h Error response from daemon: Failed to prepare rootfs with error: time="2019-04-09T05:13:52-04:00" level=fatal msg="error creating read- write layer with ID "a4c0e55e82c55e4ee4b0f4ee07f80cc2261cf31b2c2dfd628fa1fb00db97270f": --storage-opt is supported only for overlay over xfs or ext4 with 'pquota' mount option"
限制额度的说明。
- 限制的额度大于isulad的root所在分区的size时,在容器内用df看到的文件系统的额度是isulad的root所在分区的size,而不是设置的限额。
- --storage-opt size=0代表不限制,且设置值不能小于4096。size的精度为1个字节,如果指定精度含小数个字节,小数部分被忽略,如指定size=0.1实际等同于size=0不限制。(受计算机存储浮点数精度的限制,即0.999999999999999999999999999与1是等价的,具体的9的个数不同计算机可能存在差异,故设置4095.999999999999999999999999999与4096等价,其他情况类似),注意isula inspect显示原始命令行指定形式,如果含小数字节,需自行忽略小数部分。
- 限制的额度过小时,比如--storage-opt size=4k,可能会导致容器无法启动,因为启动容器本身需要创建一些文件。
- 上一次启动isulad时,isulad的root所在分区挂载时加了-o prjquota选项,这次启动时不加,那么上一次启动中创建的带quota的容器的设置值不生效。
- daemon端配额--storage-opt overlay2.basesize,其取值范围与--storage-opt size相同。
指定storage-opt为4k时,轻量级容器启动与docker有差异
使用选项 storage-opt size=4k 和镜像 rnd-dockerhub.huawei.com/official/ubuntu-arm64:latest 运行容器。
docker启动失败。
# docker run -itd --storage-opt size=4k rnd-dockerhub.huawei.com/official/ubuntu-arm64:latest docker: Error response from daemon: symlink /proc/mounts /var/lib/docker/overlay2/e6e12701db1a488636c881b44109a807e187b8db51a50015db34a131294fcf70-init/merged/etc/mtab: disk quota exceeded. See 'docker run --help'.
轻量级容器不报错,正常启动
# isula run -itd --storage-opt size=4k rnd-dockerhub.huawei.com/official/ubuntu-arm64:latest 636480b1fc2cf8ac895f46e77d86439fe2b359a1ff78486ae81c18d089bbd728 # isula ps STATUS PID IMAGE COMMAND EXIT_CODE RESTART_COUNT STARTAT FINISHAT RUNTIME ID NAMES running 17609 rnd-dockerhub.huawei.com/official/ubuntu-arm64:latest /bin/bash 0 0 2 seconds ago - lcr 636480b1fc2c 636480b1fc2cf8ac895f46e77d86439fe2b359a1ff78486ae81c18d089bbd728
在启动容器的过程中,如果需要在容器的rootfs路径下创建文件,若镜像本身占用的大小超过4k,且此时的quota设置为4k,则创建文件必定失败。
docker在启动容器的过程中,会比isulad创建更多的挂载点,用于挂载host上的某些路径到容器中,如/proc/mounts, /dev/shm等,如果镜像内本身不存在这些文件,则会创建,根据上述原因该操作会导致文件创建失败,因而容器启动失败。
轻量级容器在启动容器过程中,使用默认配置时,挂载点较少,如/proc,或/sys等路径不存在时,才会创建。用例中的镜像rnd-dockerhub.huawei.com/official/ubuntu-arm64:latest本身含有/proc, /sys等,因此整个启动容器的过程中,都不会有新文件或路径生成,故轻量级容器启动过程不会报错。为验证这一过程,当把镜像替换为rnd-dockerhub.huawei.com/official/busybox-aarch64:latest时,由于该镜像内无/proc存在,轻量级容器启动一样会报错。
# isula run -itd --storage-opt size=4k rnd-dockerhub.huawei.com/official/busybox-aarch64:latest 8e893ab483310350b8caa3b29eca7cd3c94eae55b48bfc82b350b30b17a0aaf4 Error response from daemon: Start container error: runtime error: 8e893ab483310350b8caa3b29eca7cd3c94eae55b48bfc82b350b30b17a0aaf4:tools/lxc_start.c:main:404 starting container process caused "Failed to setup lxc, please check the config file."
其他说明。
使用限额功能的isulad切换数据盘时,需要保证被切换的数据盘使用`prjquota`选项挂载,且/var/lib/isulad/storage/overlay2目录的挂载方式与/var/lib/isulad相同。
说明:
切换数据盘时需要保证/var/lib/isulad/storage/overlay2的挂载点被卸载。
限制容器内文件句柄数
描述
可以通过参数限制容器中可以打开的文件句柄数。
用法
isula create/run时使用--files-limit来限制容器中可以打开的文件句柄数。
参数
create/run时指定--files-limit参数。
64位整数(int64)。可以为0、负,但不能超过2的63 次方减 1,0、负表示不做限制(max)。 由于创建容器的过程中会临时打开一些句柄,所以此值不能设置的太小,不然容器可能不受files limit的限制(如果设置的数小于当前已经打开的句柄数,会导致cgroup文件写不进去),建议大于30。 |
示例
在运行容器时,直接加上--files-limit n 即可,如:
isula run -ti --files-limit 1024 busybox bash
约束
使用--files-limit参数传入一个很小的值,如1,可能导致容器启动失败。
# isula run -itd --files-limit 1 rnd-dockerhub.huawei.com/official/busybox-aarch64 004858d9f9ef429b624f3d20f8ba12acfbc8a15bb121c4036de4e5745932eff4 Error response from daemon: Start container error: Container is not running:004858d9f9ef429b624f3d20f8ba12acfbc8a15bb121c4036de4e5745932eff4
而docker会启动成功,其files.limit cgroup值为max。
# docker run -itd --files-limit 1 rnd-dockerhub.huawei.com/official/busybox-aarch64 ef9694bf4d8e803a1c7de5c17f5d829db409e41a530a245edc2e5367708dbbab # docker exec -it ef96 cat /sys/fs/cgroup/files/files.limit max
根因是lxc和runc启动过程的原理不一样,lxc创建cgroup子组后先设置files.limit值,再将容器进程的PID写入该子组的cgroup.procs文件,此时该进程已经打开超过1个句柄,因而写入报错导致启动失败。runc创建cgroup子组后先将容器进程的PID写入该子组的cgroup.procs文件,再设置files.limit值,此时由于该子组内的进程已经打开超过1个句柄,因而写入files.limit不会生效,内核也不会报错,容器启动成功。
限制容器内可以创建的进程/线程数
描述
可以通过参数限制容器中能够创建的进程/线程数。
用法
在容器create/run时,使用参数--pids-limit来限制容器中可以创建的进程/线程数。
参数
create/run时指定--pids-limit参数。
示例
在运行容器时,直接加上--pids-limit n 即可,如:
isula run -ti --pids-limit 1024 busybox bash
约束
由于创建容器的过程中会临时创建一些进程,所以此值不能设置的太小,不然容器可能起不来,建议大于10。
配置容器内的ulimit值
描述
可以通过参数控制执行程序的资源。
用法
在容器create/run时配置--ulimit参数,或通过daemon端配置,控制容器中执行程序的资源。
参数
通过两种方法配置ulimit
isula create/run时使用--ulimit <type>=<soft>[:<hard>]来控制shell执行程序的资源。
soft/hard是64位整数(int64)。soft取值 <= hard取值,如果仅仅指定了soft的取值,则hard=soft。对于某些类型的资源并不支持负数,详见下表
通过daemon端参数或配置文件
详见"(命令行参数说明"与"部署方式"的--default-ulimits相关选项。
--ulimit可以对以下类型的资源进行限制。
64位整数(INT64),无单位。可以为0、负、其中-1表示UNLIMITED,即不做限制,其余的负数会被强制转换为一个大的正整数。
64位整数(int64),无单位。不可以为负,负数被强转为大数,设置时会出现Operation not permitted
示例
在容器的创建或者运行时,加上--ulimit <type>=<soft>[:<hard>]即可,如:
isula create/run -tid --ulimit nofile=1024:2048 busybox sh
约束
不能在daemon.json和/etc/sysconfig/iSulad文件(或isulad命令行)中同时配置ulimit限制,否则isulad启动会报错。