长期支持版本

    社区创新版本

      容器资源管理

      描述

      可以通过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

      指定要共享的pid namespace

      [none, host, container:<containerID>],none表示不共享,host表示与host共用namespace,container:<containerID>表示与容器containerID共享同一个namespace

      --net

      指定要共享的net namespace

      [none, host, container:<containerID>],none表示不共享,host表示与host共用namespace,container:<containerID>表示与容器containerID共享同一个namespace

      --ipc

      指定要共享的ipc namespace

      [none, host, container:<containerID>],none表示不共享,host表示与host共用namespace,container:<containerID>表示与容器containerID共享同一个namespace

      --uts

      指定要共享的uts namespace

      [none, host, container:<containerID>],none表示不共享,host表示与host共用namespace,container:<containerID>表示与容器containerID共享同一个namespace

      示例

      如果两个容器需要共享同一个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-period

      限制容器中cpu cfs(完全公平调度)周期

      64位整数(int64)

      --cpu-quota

      限制容器中cpu cfs(完全公平调度) 的配额

      64位整数(int64)

      --cpu-shares

      限制容器中cpu相对权重

      64位整数(int64)

      --cpu-rt-period

      限制容器中cpu实时周期(以微秒为单位)

      64位整数(int64)

      --cpu-rt-runtime

      限制容器中cpu实时运行时间(以微秒为单位)

      64位整数(int64)

      --cpuset-cpus

      限制容器中使用cpu节点

      字符串。值为要设置的cpu编号,有效范围为主机上的cpu数量,例如可以设置0-3或者0,1.

      --cpuset-mems

      限制容器中cpuset使用的mem节点

      字符串。值为要设置的cpu编号,有效范围为主机上的cpu数量,例如可以设置0-3或者0,1.

      示例

      如果需要限制容器只是用特定的cpu,在运行容器时,直接加上--cpuset-cpus number 即可,如:

      isula run -tid --cpuset-cpus 0,2-3 busybox sh
      

      说明:
      是否设置成功,请参见“查询单个容器信息”章节。

      限制运行时的内存

      描述

      可以通过参数限制容器的各项内存值上限。

      用法

      isula create/run时使用内存相关的参数限制容器的各项内存使用上限,具体参数及取值见下方参数列表。

      参数

      create/run时可以指定下列参数。

      参数项

      参数说明

      取值范围

      是否必选

      --memory

      限制容器中内存使用上限

      64位整数(int64)。值为非负数,0表示不设置(不限制);单位可以为空(byte),KB,MB,GB,TB,PB.

      --memory-reservation

      限制容器中内存的软上限

      64位整数(int64)。值为非负数,0表示不设置(不限制);单位可以为空(byte),KB,MB,GB,TB,PB.

      --memory-swap

      限制容器中交换内存的上限

      64位整数(int64)。值为-1或非负数,-1表示不限制,0表示不设置(不限制);单位可以为空(byte),KB,MB,GB,TB,PB.

      --kernel-memory

      限制容器中内核内存的上限

      64位整数(int64)。值为非负数,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参数。

      参数项

      参数说明

      取值范围

      是否必选

      --device-read-bps/--device-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-read-bps /dev/sda:1mb busybox sh
      

      限制写速度的命令如下:

      isula run -tid --device-write-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值达到限额的目的。

      用法

      1. 环境准备

        文件系统支持Project ID和Project Quota属性,4.19版本内核已经支持,外围包e2fsprogs版本不低于1.43.4-2。

      2. 在容器挂载overlayfs之前,需要对不同容器的upper目录和work目录设置不同的project id,同时设置继承选项,在容器挂载overlayfs之后不允许再修改project id和继承属性。

      3. 配额的设置需要在容器外以特权用户进行。

      4. daemon中增加如下配置

        -s overlay2 --storage-opt overlay2.override_kernel_check=true
        
      5. daemon支持以下选项,用于为容器设置默认的限制,

        --storage-opt overlay2.basesize=128M 指定默认限制的大小,若isula run时也指定 了--storage-opt size选项,则以run时指定来生效,若daemon跟isula run时都不指定大小,则表示不限制。

      6. 需要开启文件系统Project ID和Project Quota属性。

        • 新格式化文件系统并mount

          # mkfs.ext4 -O quota,project /dev/sdb
          # mount -o prjquota /dev/sdb /var/lib/isulad
          

      参数

      create/run时指定--storage-opt参数。

      参数项

      参数说明

      取值范围

      是否必选

      --storage-opt size=${rootfsSize}

      限制容器rootfs存储空间。

      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% /
      / # 
      

      约束

      1. 限额只针对rw层。

        overlay2的限额是针对容器的rw层的,镜像的大小不计算在内。

      2. 内核支持并使能。

        内核必须支持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"
        
      3. 限制额度的说明。

        1. 限制的额度大于isulad的root所在分区的size时,在容器内用df看到的文件系统的额度是isulad的root所在分区的size,而不是设置的限额。
        2. --storage-opt size=0代表不限制,且设置值不能小于4096。size的精度为1个字节,如果指定精度含小数个字节,小数部分被忽略,如指定size=0.1实际等同于size=0不限制。(受计算机存储浮点数精度的限制,即0.999999999999999999999999999与1是等价的,具体的9的个数不同计算机可能存在差异,故设置4095.999999999999999999999999999与4096等价,其他情况类似),注意isula inspect显示原始命令行指定形式,如果含小数字节,需自行忽略小数部分。
        3. 限制的额度过小时,比如--storage-opt size=4k,可能会导致容器无法启动,因为启动容器本身需要创建一些文件。
        4. 上一次启动isulad时,isulad的root所在分区挂载时加了-o prjquota选项,这次启动时不加,那么上一次启动中创建的带quota的容器的设置值不生效。
        5. daemon端配额--storage-opt overlay2.basesize,其取值范围与--storage-opt size相同。
      4. 指定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."
        
      5. 其他说明。

        使用限额功能的isulad切换数据盘时,需要保证被切换的数据盘使用`prjquota`选项挂载,且/var/lib/isulad/storage/overlay2目录的挂载方式与/var/lib/isulad相同。

        说明:
        切换数据盘时需要保证/var/lib/isulad/storage/overlay2的挂载点被卸载。

      限制容器内文件句柄数

      描述

      可以通过参数限制容器中可以打开的文件句柄数。

      用法

      isula create/run时使用--files-limit来限制容器中可以打开的文件句柄数。

      参数

      create/run时指定--files-limit参数。

      参数项

      参数说明

      取值范围

      是否必选

      --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
      

      约束

      1. 使用--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

      限制容器中可以打开的文件句柄数。

      64位整数(int64)。可以为0、负,但不能超过2的63 次方减 1,0、负表示不做限制(max)。

      示例

      在运行容器时,直接加上--pids-limit n 即可,如:

      isula run -ti --pids-limit 1024 busybox bash
      

      约束

      由于创建容器的过程中会临时创建一些进程,所以此值不能设置的太小,不然容器可能起不来,建议大于10。

      配置容器内的ulimit值

      描述

      可以通过参数控制执行程序的资源。

      用法

      在容器create/run时配置--ulimit参数,或通过daemon端配置,控制容器中执行程序的资源。

      参数

      通过两种方法配置ulimit

      1. isula create/run时使用--ulimit <type>=<soft>[:<hard>]来控制shell执行程序的资源。

        参数项

        参数说明

        取值范围

        是否必选

        --ulimit

        限制shell执行程序的资源

        soft/hard是64位整数(int64)。soft取值 <= hard取值,如果仅仅指定了soft的取值,则hard=soft。对于某些类型的资源并不支持负数,详见下表

      2. 通过daemon端参数或配置文件

        详见"(命令行参数说明"与"部署方式"的--default-ulimits相关选项。

        --ulimit可以对以下类型的资源进行限制。

        类型

        说明

        取值范围

        core

        limits the core file size (KB)

        64位整数(INT64),无单位。可以为0、负、其中-1表示UNLIMITED,即不做限制,其余的负数会被强制转换为一个大的正整数。

        cpu

        max CPU time (MIN)

        data

        max data size (KB)

        fsize

        maximum filesize (KB)

        locks

        max number of file locks the user can hold

        memlock

        max locked-in-memory address space (KB)

        msgqueue

        max memory used by POSIX message queues (bytes)

        nice

        nice priority

        nproc

        max number of processes

        rss

        max resident set size (KB)

        rtprio

        max realtime priority

        rttime

        realtime timeout

        sigpending

        max number of pending signals

        stack

        max stack size (KB)

        nofile

        max number of open file descriptors

        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启动会报错。

      文档捉虫

      “有虫”文档片段

      问题描述

      提交类型 issue

      有点复杂...

      找人问问吧。

      PR

      小问题,全程线上修改...

      一键搞定!

      问题类型
      规范和低错类

      ● 错别字或拼写错误;标点符号使用错误;

      ● 链接错误、空单元格、格式错误;

      ● 英文中包含中文字符;

      ● 界面和描述不一致,但不影响操作;

      ● 表述不通顺,但不影响理解;

      ● 版本号不匹配:如软件包名称、界面版本号;

      易用性

      ● 关键步骤错误或缺失,无法指导用户完成任务;

      ● 缺少必要的前提条件、注意事项等;

      ● 图形、表格、文字等晦涩难懂;

      ● 逻辑不清晰,该分类、分项、分步骤的没有给出;

      正确性

      ● 技术原理、功能、规格等描述和软件不一致,存在错误;

      ● 原理图、架构图等存在错误;

      ● 命令、命令参数等错误;

      ● 代码片段错误;

      ● 命令无法完成对应功能;

      ● 界面错误,无法指导操作;

      风险提示

      ● 对重要数据或系统存在风险的操作,缺少安全提示;

      内容合规

      ● 违反法律法规,涉及政治、领土主权等敏感词;

      ● 内容侵权;

      您对文档的总体满意度

      非常不满意
      非常满意
      提交
      根据您的反馈,会自动生成issue模板。您只需点击按钮,创建issue即可。
      文档捉虫
      编组 3备份