docker - 禁用Kubelet上的交换

标签 docker kubernetes swap

我在许多实验室机器上运行Kubernetes 1.2.0。机器已启用交换。由于这些计算机也用于其他目的,因此我无法全局禁用交换。

我观察到以下问题:如果我启动具有内存限制的Pod,则容器在达到内存限制后开始交换。我希望该容器被杀死。

根据this issue的描述,此问题已得到解决,但在Kubernetes 1.2.0中仍然会发生。如果我使用docker inspect检查正在运行的容器,则可以看到MemorySwap = -1MemorySwappiness = -1。如果我启动内存不足的Pod,它将立即开始交换。

我有一些想法,但我不知道该怎么做:

  • 更改Docker中的默认设置,因此不允许任何容器交换
  • 向Kubernetes容器配置添加参数,以便它传递--memory-swappiness=0
  • 与docker's cgroup进行混搭,并禁止交换组

  • 如何防止容器开始交换?

    最佳答案

    Kubernetes,特别是kubeletfails if swap is enabled on Linux since version 1.8 (flag --fail-swap-on=true ),作为Kubernetes can't handle swap。这意味着您可以确保默认情况下在Kubernetes上禁用交换功能。

    要在本地Docker容器set memory-swap == memory 中对其进行测试,例如:
    docker run --memory="10m" --memory-swap="10m" dominikk/swap-test
    我的测试镜像基于this small program以及Docker中的flush输出:

    setvbuf(stdout, NULL, _IONBF, 0);  // flush stdout buffer every time
    

    您也可以使用docker-compose up(only works for version <= 2.x )测试它:

    version: '2'
    services:
      swap-test:
        image: dominikk/swap-test
        mem_limit: 10m
        # memswap_limit:
        #           -1: unlimited swap
        #            0: field unset
        #           >0: mem_limit + swap
        # == mem_limit: swap disabled
        memswap_limit: 10m
    

    关于docker - 禁用Kubelet上的交换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40553541/

    相关文章:

    docker - SaltStack master/minion 来管理我在容器内的数据库

    docker - 如何访问 Airflow 2.0 cli

    kubernetes - 在 kustomize manifest 中创建变量

    kubernetes - 从 kubectl logs -f 的巨大日志中拖尾几行

    c - 在c中交换两个结构

    Javascript数组元素indexOf在通过拼接交换元素位置后为-1

    css - 如何在 div 悬停时更改跨度颜色

    docker - 操作 '-D FOREGROUND' 失败。在使用 docker 构建 apache2 镜像时

    docker - 如何解决 "Could not find token: Ready\. in docker logs"

    kubernetes - 运行 Kubernetes 示例 Controller