为安全容器配置资源

安全容器运行于虚拟化隔离的轻量级虚拟机内,因此资源的配置应分为两部分:对轻量级虚拟机的资源配置,即Host资源配置;对虚拟机内容器的配置,即Guest容器资源配置。以下资源配置均分为这两部分。

资源共享

由于安全容器运行于虚拟化隔离的轻量虚拟机内,故无法访问Host上某些namespace下的资源,因此启动时不支持—net host,—ipc host,—pid host,—uts host。

当启动一个Pod时,同一个Pod中的所有容器默认共享同一个net namespace和ipc namespace。如果同一个Pod中的容器需要共享pid namespace,则可以通过Kubernetes进行配置,Kubernetes 1.11版本该值为默认关闭。

限制Blkio资源

  1. 配置轻量级虚拟机Blkio运行资源

    对轻量级虚拟机的BlkIio资源配置,安全容器使用—annotation com.github.containers.virtcontainers.blkio_cgroup配置轻量级虚拟机使用的块设备的blkio资源,该参数仅可配置在pause容器上:

    1. docker run -tid --runtime --network none --annotation io.kubernetes.docker.type=podsandbox --annotation com.github.containers.virtcontainers.blkio_cgroup=<blkio json格式字符串> <pause-image> <command>

    其中—annotation com.github.containers.virtcontainers.blkio_cgroup的取值要符合下面BlkioCgroup结构体的定义:

    1. // BlkioCgroup for Linux cgroup 'blkio' data exchange
    2. type BlkioCgroup struct {
    3. // Items specifies per cgroup values
    4. Items []BlockIOCgroupItem `json:"blkiocgroup,omitempty"`
    5. }
    6. type BlockIOCgroupItem struct {
    7. // Path represent path of blkio device
    8. Path string `json:"path,omitempty"`
    9. // Limits specifies the blkio type and value
    10. Limits []IOLimit `json:"limits,omitempty"`
    11. }
    12. type IOLimit struct {
    13. // Type specifies IO type
    14. Type string `json:"type,omitempty"`
    15. // Value specifies rate or weight value
    16. Value uint64 `json:"value,omitempty"`
    17. }

    IOLimit结构体中Type字段取值列表为:

    1. // BlkioThrottleReadBps is the key to fetch throttle_read_bps
    2. BlkioThrottleReadBps = "throttle_read_bps"
    3. // BlkioThrottleWriteBps is the key to fetch throttle_write_bps
    4. BlkioThrottleWriteBps = "throttle_write_bps"
    5. // BlkioThrottleReadIOPS is the key to fetch throttle_read_iops
    6. BlkioThrottleReadIOPS = "throttle_read_iops"
    7. // BlkioThrottleWriteIOPS is the key to fetch throttle_write_iops
    8. BlkioThrottleWriteIOPS = "throttle_write_iops"
    9. // BlkioWeight is the key to fetch blkio_weight
    10. BlkioWeight = "blkio_weight"
    11. // BlkioLeafWeight is the key to fetch blkio_leaf_weight
    12. BlkioLeafWeight = "blkio_leaf_weight"

    举例:

    1. docker run -tid --runtime kata-runtime --network none --annotation com.github.containers.virtcontainers.blkio_cgroup='{"blkiocgroup":[{"path":"/dev/sda","limits":[{"type":"throttle_read_bps","value":400},{"type":"throttle_write_bps","value":400},{"type":"throttle_read_iops","value":700},{"type":"throttle_write_iops","value":699}]},{"limits":[{"type":"blkio_weight","value":78}]}]}' busybox sleep 999999

    上面命令表示对启动的安全容器所使用的/dev/sda磁盘进行blkio限流,分别将throttle_read_bps限速为400bps,throttle_write_bps限速为400bps,throttle_read_iops限速为700次/秒,throttle_write_iops限速为699次/秒,以及所在blkio cgroup组的权重值设置为78。

限制文件描述符资源

为了避免在容器中打开大量9p共享目录中的文件导致主机上文件描述符资源耗尽,使得安全容器无法正常提供服务,安全容器支持自定义配置安全容器qemu进程最多可以打开的文件描述符数量限制。

安全容器通过复用docker run命令中的—files-limit选项来设置安全容器qemu进程最多可以打开文件描述符,该参数仅可配置在pause容器上,使用方法如下所示:

  1. docker run -tid --runtime kata-runtime --network none --annotation io.kubernetes.docker.type=podsandbox --files-limit <max-open-files> <pause-image> bash

为安全容器配置资源 - 图1 说明:

  • 如果—files-limit选项的取值小于安全容器默认设置的最小值1024且不为0时,安全容器qemu进程最多可以打开的文件描述符数量会被设置为最小值1024。
  • 如果—files-limit选项的取值为0时,安全容器qemu进程最多可以打开的文件描述符数量为系统可以打开文件描述符的最大值/proc/sys/fs/file-max除以400后得到的默认值。
  • 如果启动安全容器时没有显示指定—files-limit可以打开的文件描述符的上限,安全容器qemu进程可以打开的文件描述符数量的上限和系统默认值保持一致。