禁用kubelet上的交换

时间:2016-11-11 17:51:26

标签: 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&#c; cdis并禁止交换该组

如何阻止容器开始交换?

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:0)

如果你只是在玩耍,那么就不用担心关掉掉掉了。东西仍然会运行,但资源隔离也会起作用。如果你使用Kubernetes足够严重需要资源隔离,那么你不应该在机器上运行其他东西。