在 kubelet 上禁用交换
Disable swap on a kubelet
我在一些实验室机器上 运行 Kubernetes 1.2.0。机器已启用交换。由于这些机器也用于其他目的,我无法全局禁用交换。
我观察到以下问题:如果我启动有内存限制的 pod,容器在达到内存限制后开始交换。我希望容器被杀死。
根据 this issue,这是一个已修复的问题,但它仍然出现在 Kubernetes 1.2.0 中。如果我用 docker inspect
检查 运行 容器,那么我可以看到 MemorySwap = -1
和 MemorySwappiness = -1
。如果我启动内存限制较低的 pod,它几乎会立即开始交换。
我有一些想法,但我不知道该怎么做:
- 更改 Docker 中的默认设置,因此不允许交换任何容器
- 向 Kubernetes 容器配置添加一个参数,使其通过
--memory-swappiness=0
- Fiddle 与 docker 的 cgroup 并禁止交换组
如何防止容器开始交换?
如果您只是随便玩玩,则无需费心关闭交换。东西仍然 运行 但资源隔离将无法正常工作。如果您认真使用 Kubernetes 以致需要资源隔离,那么您不应该 运行 在机器上安装其他东西。
Kubernetes,特别是 kubelet
、fails 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
我在一些实验室机器上 运行 Kubernetes 1.2.0。机器已启用交换。由于这些机器也用于其他目的,我无法全局禁用交换。
我观察到以下问题:如果我启动有内存限制的 pod,容器在达到内存限制后开始交换。我希望容器被杀死。
根据 this issue,这是一个已修复的问题,但它仍然出现在 Kubernetes 1.2.0 中。如果我用 docker inspect
检查 运行 容器,那么我可以看到 MemorySwap = -1
和 MemorySwappiness = -1
。如果我启动内存限制较低的 pod,它几乎会立即开始交换。
我有一些想法,但我不知道该怎么做:
- 更改 Docker 中的默认设置,因此不允许交换任何容器
- 向 Kubernetes 容器配置添加一个参数,使其通过
--memory-swappiness=0
- Fiddle 与 docker 的 cgroup 并禁止交换组
如何防止容器开始交换?
如果您只是随便玩玩,则无需费心关闭交换。东西仍然 运行 但资源隔离将无法正常工作。如果您认真使用 Kubernetes 以致需要资源隔离,那么您不应该 运行 在机器上安装其他东西。
Kubernetes,特别是 kubelet
、fails 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