我在许多实验室机器上运行Kubernetes 1.2.0。机器已启用交换。由于这些机器也用于其他目的,我无法全局禁用交换。
我观察到以下问题:如果我启动具有内存限制的pod,则容器在达到内存限制后开始交换。我希望容器能够被杀死。
根据this issue,这是一个已修复的问题,但它仍然发生在Kubernetes 1.2.0中。如果我使用docker inspect
检查正在运行的容器,那么我可以看到MemorySwap = -1
和MemorySwappiness = -1
。如果我启动一个内存限制较低的pod,它几乎立即开始交换。
我有一些想法,但我无法弄清楚如何做到这些:
--memory-swappiness=0
如何阻止容器开始交换?
答案 0 :(得分:2)
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
答案 1 :(得分:0)
如果你只是在玩耍,那么就不用担心关掉掉掉了。东西仍然会运行,但资源隔离也会起作用。如果你使用Kubernetes足够严重需要资源隔离,那么你不应该在机器上运行其他东西。