限制内存资源

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

    对轻量级虚拟机的MEM资源配置即虚拟机运行的内存进行配置,安全容器使用—annotation com.github.containers.virtcontainers.sandbox_mem配置轻量级虚拟机运行MEM资源,该参数仅可配置在pause容器上:

    1. docker run -tid --runtime kata-runtime --network none --annotation io.kubernetes.docker.type=podsandbox --annotation com.github.containers.virtcontainers.sandbox_mem=<memory-size> <pause-image> <command>

    举例:

    1. # 启动一个pause容器,通过--annotation com.github.containers.virtcontainers.sandbox_mem=4G为轻量级虚机分配4G内存
    2. docker run -tid --runtime kata-runtime --network none --annotation io.kubernetes.docker.type=podsandbox --annotation com.github.containers.virtcontainers.sandbox_mem=4G ubuntu-arm64 bash
    3. 1532c3e59e7a45cd6b419aa1db07dd0069b0cdd93097f8944177a25e457e4297
    4. # 查看轻量级虚机中内存信息,查看内存大小是否与com.github.containers.virtcontainers.sandbox_mem配置的内存大小相等
    5. docker exec 1532c3e free -m
    6. total used free shared buff/cache available
    7. Mem: 3950 20 3874 41 55 3858
    8. Swap: 0 0 0

    限制内存资源 - 图1 说明:

    • 如果没有通过—annotation com.github.containers.virtcontainers.sandbox_mem显示地设置轻量级虚机的内存大小,则轻量级虚机默认使用的内存大小为1GB。
    • 安全容器一个Pod的最小内存规格是1GB,支持的最大内存规格是256GB。如果用户分配的内存规格超过256GB,可能会出现未定义的错误,安全容器暂不支持超过256GB的大内存场景。
  2. 配置容器MEM运行资源

    配置容器MEM运行资源与开源docker容器配置MEM运行资源的方式相同,可以通过docker run命令中MEM资源限制相关的参数进行配置:

    参数

    含义

    -m/—memory

    设置容器进程可以使用的内存大小。

    说明:
    • 当内存热插拔开关关闭时,-m的取值要小于等于轻量级虚机启动时分配的内存大小。
  3. 配置MEM热插功能

    同配置CPU热插拔功能一样,MEM的热插功能也是由kata-runtime配置文件config.toml中enable_cpu_memory_hotplug选项配置,用法参见3

    限制内存资源 - 图2 说明:
    内存资源当前只支持热插,不支持内存热拔。

    kata-runtime中复用了-m选项实现了MEM热插的功能,通过统计Pod中所有容器的-m选项的和,然后确定需要热插多少内存到轻量级虚机中,例如,

    举例:

    1. # 启动一个pause容器,轻量级虚机默认分配了1GB内存
    2. docker run -tid --runtime kata-runtime --network none --annotation io.kubernetes.docker.type=podsandbox ubuntu bash
    3. 99b78508ada3fa7dcbac457bb0f6e3784e64e7f7131809344c5496957931119f
    4. # 查看启动完pause容器后轻量级虚机中的内存大小
    5. docker exec 99b78508ada free -m
    6. total used free shared buff/cache available
    7. Mem: 983 18 914 36 50 908
    8. Swap: 0 0 0
    9. # 在同一个Pod中启动新的容器并通过-m设置容器需要的内存大小为4G
    10. docker run -tid --runtime kata-runtime --network none -m 4G --annotation io.kubernetes.docker.type=container --annotation io.kubernetes.sandbox.id=99b78508ada3fa7dcbac457bb0f6e3784e64e7f7131809344c5496957931119f ubuntu bash
    11. c49461745a712b2ef3127fdf43b2cbb034b7614e6060b13db12b7a5ff3c830c8
    12. # 查看当前轻量级虚机中内存的大小
    13. docker exec c49461745 free -m
    14. total used free shared buff/cache available
    15. Mem: 4055 69 3928 36 57 3891
    16. Swap: 0 0 0
    17. # 删除热插了CPU的容器后,查看轻量级虚机中内存的大小
    18. docker rm -f c49461745
    19. c49461745
    20. # 因为热插的内存暂不支持热拔功能,所以轻量级虚机中在删除热插内存容器之后还是拥有4GB的内存
    21. docker exec 99b78508ada free -m
    22. total used free shared buff/cache available
    23. Mem: 4055 69 3934 36 52 3894
    24. Swap: 0 0 0

    限制内存资源 - 图3 说明:
    由于pause容器只是一个占位容器没有工作负载,所以轻量级虚机启动时分配的内存可以被其它容器共享使用,因此上面例子中启动的新容器只需要再热插3GB的内存到轻量级虚机中即可。