在 kubelet 上禁用交换

Disable swap on a kubelet

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

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

根据 this issue,这是一个已修复的问题,但它仍然出现在 Kubernetes 1.2.0 中。如果我用 docker inspect 检查 运行 容器,那么我可以看到 MemorySwap = -1MemorySwappiness = -1。如果我启动内存限制较低的 pod,它几乎会立即开始交换。

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

如何防止容器开始交换?

如果您只是随便玩玩,则无需费心关闭交换。东西仍然 运行 但资源隔离将无法正常工作。如果您认真使用 Kubernetes 以致需要资源隔离,那么您不应该 运行 在机器上安装其他东西。

Kubernetes,特别是 kubeletfails if swap is enabled on Linux since version 1.8 (flag --fail-swap-on=true), as 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 中增加了刷新输出:

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