2016-11-11 71 views
1

我在許多實驗室機器上運行Kubernetes 1.2.0。機器已啓用交換。由於機器也用於其他目的,我無法在全局禁用交換。在kubelet上禁用交換

我正在觀察以下問題:如果我啓動具有內存限制的容器,容器會在達到內存限制後開始交換。我希望容器被殺死。

根據this issue這是一個已經解決的問題,但它仍然發生在Kubernetes 1.2.0上。如果我用docker inspect檢查正在運行的容器,則可以看到MemorySwap = -1MemorySwappiness = -1。如果我啓動內存限制較低的吊艙,它幾乎立即開始交換。

我有一些想法,但我無法弄清楚如何做這些:

  • 變化所以沒有容器被允許調換
  • 添加參數傳遞給在泊塢窗默認設置Kubernetes容器的配置,因此通過--memory-swappiness=0
  • 撥弄碼頭工人的cgroup中,並禁止對換組

如何防止集裝箱開始交換?

回答

1

Kubernetes,特別是kubelet,fails if swap is enabled on Linux since version 1.8 (flag --fail-swap-on=true),作爲Kubernetes can't handle swap。這意味着您可以確保在Kubernetes上默認禁用交換。

要在當地碼頭工人的容器,set memory-swap == memory,如測試:

docker run --memory="10m" --memory-swap="10m" dominikk/swap-test

我的測試圖像是基於this small program與除刷新輸出碼頭工人:

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 
0

如果你只是在玩耍,那麼就不必費心去掉掉。東西仍然可以運行,但資源隔離不會起作用。如果你正在認真使用Kubernetes來需要資源隔離,那麼你不應該在機器上運行其他東西。

+0

「東西仍然可以運行,但資源隔離不會很好」 - 這是不正確的。我有一個可能使用30GB內存的作業,啓用了交換功能,需要*天*才能完成。所以性能差異很大。我設置Kubernetes在機器閒置時運行作業;當使用機器時,節點自動排空。雖然這並不完美,但如果我沒有交換問題,它會很好地工作。 – morxa