我在许多实验室机器上运行Kubernetes 1.2.0。机器已启用交换。由于这些计算机也用于其他目的,因此我无法全局禁用交换。
我观察到以下问题:如果我启动具有内存限制的Pod,则容器在达到内存限制后开始交换。我希望该容器被杀死。
根据this issue的描述,此问题已得到解决,但在Kubernetes 1.2.0中仍然会发生。如果我使用docker inspect
检查正在运行的容器,则可以看到MemorySwap = -1
和MemorySwappiness = -1
。如果我启动内存不足的Pod,它将立即开始交换。
我有一些想法,但我不知道该怎么做:
--memory-swappiness=0
如何防止容器开始交换?
最佳答案
Kubernetes,特别是kubelet
,fails 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/