Kubernetes中的垃圾回收機制

Kubernetes中的垃圾回收機制

本文所討論垃圾回收(GC,GarbageCollection)機制針對Kubernetes1.1.7,docker容器。

一、Tips

  1. Kubernetes的垃圾回收由kubelet進行管理,每分鐘會查詢清理一次容器,每五分鐘查詢清理一次鏡像。在kubelet剛啓動時並不會立即進行GC,即第一次進行容器回收爲kubelet啓動一分鐘後,第一次進行鏡像回收爲kubelet啓動五分鐘後。

  2. 不推薦使用其它管理工具或手工進行容器和鏡像的清理,因爲kubelet需要通過容器來判斷pod的運行狀態,如果使用其它方式清除容器有可能影響kubelet的正常工作。

  3. 鏡像的回收針對node結點上由docker管理的所有鏡像,無論該鏡像是否是在創建pod時pull的。而容器的回收策略只應用於通過kubelet管理的容器。

  4. Kubernetes通過kubelet集成的cadvisor進行鏡像的回收,有兩個參數可以設置:--image-gc-high-threshold和--image-gc-low-threshold。當用於存儲鏡像的磁盤使用率達到百分之--image-gc-high-threshold時將觸發鏡像回收,刪除最近最久未使用(LRU,Least Recently Used)的鏡像直到磁盤使用率降爲百分之--image-gc-low-threshold或無鏡像可刪爲止。默認--image-gc-high-threshold爲90,--image-gc-low-threshold爲80。

  5. 容器的回收有三個參數可設置:--minimum-container-ttl-duration,--maximum-dead-containers-per-container和--maximum-dead-containers。從容器停止運行時起經過--minimum-container-ttl-duration時間後,該容器標記爲已過期將來可以被回收(只是標記,不是回收),默認值爲1m0s。一般情況下每個pod最多可以保留--maximum-dead-containers-per-container個已停止運行的容器集,默認值爲2。整個node節點可以保留--maximum-dead-containers個已停止運行的容器,默認值爲100。

  6. 如果需要關閉容器的垃圾回收策略,可以將--minimum-container-ttl-duration設爲0(表示無限制),--maximum-dead-containers-per-container和--maximum-dead-containers設爲負數。

  7. --minimum-container-ttl-duration的值可以使用單位後綴,如h表示小時,m表示分鐘,s表示秒。

  8. 當--maximum-dead-containers-per-container和--maximum-dead-containers衝突時,--maximum-dead-containers優先考慮。

  9. 對於那些由kubelet創建的但由於某些原因導致無名字(<none>)的容器,會在到達GC時間點時被刪除。

  10. 回收容器時,按創建時間排序,優先刪除那些創建時間最早的容器。

  11. 到達GC時間點時,具體的GC過程如下:1)遍歷所有pod,使其滿足--maximum-dead-containers-per-container;2)經過上一步後如果不滿足--maximum-dead-containers,計算值X=(--maximum-dead-containers)/(pod總數),再遍歷所有pod,使其滿足已停止運行的容器集個數不大於X且至少爲1;3)經過以上兩步後如果還不滿足--maximum-dead-containers,則對所有已停止的容器排序,優先刪除創建時間最早的容器直到滿足--maximum-dead-containers爲止。

  12. 當某個鏡像重新pull或啓動某個pod用到該鏡像時,該鏡像的最近使用時間都會被更新。

  13. Kubernetes的垃圾回收在1.1.4版本開始才漸漸完善,之前的版本存在比較多bug甚至不能發揮作用。

  14. 關於容器的回收需要特別注意pod的概念,比如,通過同一個yaml文件create一個pod,再delete這個pod,然後再create這個pod,此時之前的那個pod對應的容器並不會作爲新創建pod的已停止容器集,因爲這兩個pod雖然同名,但已經不是同一個pod了。只有同一個pod中在運行過程中由於意外或其它情況停止的容器纔算是這個pod的已停止容器集。

-

.

.

二、Experiments

主要分三個參數:

A:--minimum-image-ttl-duration (容器運行完之後的生存時間,默認爲0)

B:--image-gc-high-threshold (磁盤最高消耗百分比,默認爲90%。表明當磁盤佔用高達90%時,會自動觸發image回收機制)

C:--image-gc-low-threshold (磁盤最低消耗百分比,默認爲80%,當磁盤佔用低於80%時將不會觸發image回收)


作者:一個程序媛呀
來源:CSDN
原文:https://blog.csdn.net/qq_42997214/article/details/83418584
版權聲明:本文爲博主原創文章,轉載請附上博文鏈接!

.

  1. 鏡像回收(使用docker默認--graph參數:/var/lib/docker)

    /usr/lib/systemd/system/docker.service

Kubernetes中的垃圾回收機制

結點上運行的docker設置的參數--graph使用默認的/var/lib/docker,指向/var文件系統,通過df -lh查看目前 /var 磁盤使用率爲30%,啓動kubelet設置鏡像回收相關參數如下:

--image-gc-high-threshold=40
--image-gc-low-threshold=35

此時任意創建兩個使用不同鏡像的pod,在node節點上可以看到新pull了三個images(pause鏡像是啓動pod必需的):

[@tc-151-100 /opt/domeos/openxxs/k8s-1.1.7-flannel]# docker images
REPOSITORY                        TAG                 IMAGE ID            CREATED             SIZE
10.11.150.76:5000/openxxs/iperf   1.2                 1783511c56f8        3 months ago        279 MB
10.11.150.76:5000/centos          7                   5ddf34d4d69b        8 months ago        172.2 MB
pub.domeos.org/kubernetes/pause   latest              f9d5de079539        20 months ago       239.8 kB

此時查看/var磁盤使用率達到了41%,然後將使用10.11.150.76:5000/centos:7鏡像的pod刪除,等待GC的鏡像回收時間點。然而五分鐘過去了,什麼事情也沒有發生=_=!!。還記得 docker rmi 鏡像時有個前提條件是什麼嗎?沒錯,要求使用該鏡像的容器都已經被刪除了纔可以。前面刪除pod只是停止了容器,並沒有將容器刪除。因此手工將對應的容器docker rm掉,再等待五分鐘後,可以看到鏡像已經被刪除回收了:

[@tc-151-100 /opt/domeos/openxxs/k8s-1.1.7-flannel]# docker images
REPOSITORY                        TAG                 IMAGE ID            CREATED             SIZE
10.11.150.76:5000/openxxs/iperf   1.2                 1783511c56f8        3 months ago        279 MB
pub.domeos.org/kubernetes/pause   latest              f9d5de079539        20 months ago       239.8 kB

結論:只有相關聯的容器都被停止並刪除回收後,才能將Kubernetes的鏡像垃圾回收策略應用到該鏡像上。


.

.

  1. 鏡像回收(使用自定義docker --graph參數:/opt/docker)

結點上運行的docker設置的參數--graph指向 /opt 磁盤,通過 df -lh 查看目前 /opt 磁盤使用率爲 48% ,啓動 kubelet 設置鏡像回收相關參數如下:

--image-gc-high-threshold=50 --image-gc-low-threshold=40

此時任意創建兩個使用不同鏡像的pod,在node節點上可以看到新pull了三個images:

[@tc-151-100 /opt/domeos/openxxs/k8s-1.1.7-flannel]# docker images
REPOSITORY                        TAG                 IMAGE ID            CREATED             SIZE
10.11.150.76:5000/openxxs/iperf   1.2                 1783511c56f8        3 months ago        279 MB
10.11.150.76:5000/centos          7                   5ddf34d4d69b        8 months ago        172.2 MB
pub.domeos.org/kubernetes/pause   latest              f9d5de079539        20 months ago       239.8 kB

此時查看/opt磁盤使用率達到了51%,然後將使用10.11.150.76:5000/centos:7鏡像的pod刪除,手工將對應的容器docker rm掉,等待GC的鏡像回收時間點。然而五分鐘過去了,十分鐘過去了,docker images時centos鏡像依舊頑固地堅守在陣地。

結論:目前Kubernetes的鏡像垃圾回收策略可以在docker --graph參數默認爲/var/lib/docker時正常工作,當--graph設置爲其它磁盤路徑時還存在bug。

問題反饋在Github的相關issue裏(戳這裏),可以繼續跟進。

Append: 根據Github上的反饋,這個bug將在後續版本中解決,目前版本需要讓設置了--graph的鏡像垃圾回收生效,在啓動kubelet時還需要加上參數 --docker-root=<docker --graph參數值>。

.

.

  1. 容器回收之--maximum-dead-containers-per-container參數

主要分爲三個參數:

A:--minimum-container-ttl-duration (容器運行結束之後可以存活的時間,默認爲0)

B:--maximum-dead-container-per-container (一個pod上可以留下運行結束之後的容器的個數,默認爲2)

C:--maximum-dead-containers (一個node上可以留下運行結束之後的容器個數,默認爲240)

當不需要回收container時,自定義將A參數設置爲0,BC參數設置爲負數,則不會有回收container行爲。

vim /etc/systemd/system/kubelet.service

啓動kubelet設置容器回收相關參數如下:

        --maximum-dead-containers-per-container=1
        --minimum-container-ttl-duration=30s  
        --maximum-dead-containers=100

創建一個只包含一個容器且該容器一運行就退出的pod,此時在node節點上可以看到該pod中的容器不斷的創建退出創建退出:
複製代碼

[@tc-151-100 /home/domeos]# docker ps -a
CONTAINER ID        IMAGE                                    COMMAND             CREATED             STATUS                      PORTS               NAMES
2fe969499164        10.11.150.76:5000/centos:7               "/bin/bash"         4 seconds ago       Exited (0) 2 seconds ago                        k8s_iperf1.57dfe29d_test-gc-pod-exit_default_92e8bd05-e9e6-11e5-974c-782bcb2a316a_68cc6f03
555b5e7a8550        10.11.150.76:5000/centos:7               "/bin/bash"         24 seconds ago      Exited (0) 22 seconds ago                       k8s_iperf1.57dfe29d_test-gc-pod-exit_default_92e8bd05-e9e6-11e5-974c-782bcb2a316a_ad4a5e39
94b30a0b32c2        10.11.150.76:5000/centos:7               "/bin/bash"         34 seconds ago      Exited (0) 32 seconds ago                       k8s_iperf1.57dfe29d_test-gc-pod-exit_default_92e8bd05-e9e6-11e5-974c-782bcb2a316a_4027e3e1
d458e6a7d396        pub.domeos.org/kubernetes/pause:latest   "/pause"            34 seconds ago      Up 33 seconds                                   k8s_POD.bdb2e1f5_test-gc-pod-exit_default_92e8bd05-e9e6-11e5-974c-782bcb2a316a_09798975

GC的容器回收時間點到達時,可以看到創建時間大於30秒的已退出容器只剩下一個(pause容器不計算),且先創建的容器被優先刪除:

[@tc-151-100 /home/domeos]# docker ps -a
CONTAINER ID        IMAGE                                    COMMAND             CREATED             STATUS                      PORTS               NAMES
5aae6157aeff        10.11.150.76:5000/centos:7               "/bin/bash"         46 seconds ago      Exited (0) 45 seconds ago                       k8s_iperf1.57dfe29d_test-gc-pod-exit_default_92e8bd05-e9e6-11e5-974c-782bcb2a316a_f126d2a8
d458e6a7d396        pub.domeos.org/kubernetes/pause:latest   "/pause"            2 minutes ago       Up 2 minutes                                    k8s_POD.bdb2e1f5_test-gc-pod-exit_default_92e8bd05-e9e6-11e5-974c-782bcb2a316a_09798975

結論:Kubernetes容器垃圾回收的--maximum-dead-containers-per-container參數設置可正常工作。

  1. --maximum-dead-containers-per-container針對容器還是容器集

啓動kubelet設置容器回收相關參數如下:

--maximum-dead-containers-per-container=1
--minimum-container-ttl-duration=30s
--maximum-dead-containers=100

創建一個包含三個容器且這些容器一運行就退出的pod,此時在node節點上可以看到該pod中的容器不斷的創建退出創建退出:

[@tc-151-100 /home/domeos]# docker ps -a
CONTAINER ID        IMAGE                                    COMMAND             CREATED             STATUS                      PORTS               NAMES
dec04bd28a03        10.11.150.76:5000/centos:7               "/bin/bash"         7 seconds ago       Exited (0) 6 seconds ago                        k8s_iperf1.57dfe29d_test-gc-pod-exit_default_d1677c09-e9e7-11e5-974c-782bcb2a316a_830a9375
7c94d4a963a7        10.11.150.76:5000/centos:7               "/bin/bash"         7 seconds ago       Exited (0) 6 seconds ago                        k8s_iperf3.5c8de29f_test-gc-pod-exit_default_d1677c09-e9e7-11e5-974c-782bcb2a316a_975d44d3
4f3e7e8ddfd5        10.11.150.76:5000/centos:7               "/bin/bash"         8 seconds ago       Exited (0) 7 seconds ago                        k8s_iperf2.5a36e29e_test-gc-pod-exit_default_d1677c09-e9e7-11e5-974c-782bcb2a316a_d024eb06
cb48cf2ba133        10.11.150.76:5000/centos:7               "/bin/bash"         12 seconds ago      Exited (0) 11 seconds ago                       k8s_iperf3.5c8de29f_test-gc-pod-exit_default_d1677c09-e9e7-11e5-974c-782bcb2a316a_b5ff7373
ec2941f046f0        10.11.150.76:5000/centos:7               "/bin/bash"         13 seconds ago      Exited (0) 12 seconds ago                       k8s_iperf2.5a36e29e_test-gc-pod-exit_default_d1677c09-e9e7-11e5-974c-782bcb2a316a_69b1a996
f831e8ed5687        10.11.150.76:5000/centos:7               "/bin/bash"         13 seconds ago      Exited (0) 12 seconds ago                       k8s_iperf1.57dfe29d_test-gc-pod-exit_default_d1677c09-e9e7-11e5-974c-782bcb2a316a_fbc02e2e
ee972a4537fc        pub.domeos.org/kubernetes/pause:latest   "/pause"            14 seconds ago      Up 13 seconds                                   k8s_POD.bdb2e1f5_test-gc-pod-exit_default_d1677c09-e9e7-11e5-974c-782bcb2a316a_85b3c032

GC的容器回收時間點到達時,可以看到創建時間大於30秒的已退出容器剩下三個(pause容器不計算),且這三個容器正好是一組:
複製代碼

[@tc-151-100 /home/domeos]# docker ps -a
CONTAINER ID        IMAGE                                    COMMAND             CREATED              STATUS                      PORTS               NAMES
e4351e6855ae        10.11.150.76:5000/centos:7               "/bin/bash"         51 seconds ago       Exited (0) 50 seconds ago                       k8s_iperf3.5c8de29f_test-gc-pod-exit_default_d1677c09-e9e7-11e5-974c-782bcb2a316a_263dd820
990baa6e6a7a        10.11.150.76:5000/centos:7               "/bin/bash"         52 seconds ago       Exited (0) 51 seconds ago                       k8s_iperf2.5a36e29e_test-gc-pod-exit_default_d1677c09-e9e7-11e5-974c-782bcb2a316a_b16b5eaa
c6916fb06d65        10.11.150.76:5000/centos:7               "/bin/bash"         53 seconds ago       Exited (0) 51 seconds ago                       k8s_iperf1.57dfe29d_test-gc-pod-exit_default_d1677c09-e9e7-11e5-974c-782bcb2a316a_1d8ea284
ee972a4537fc        pub.domeos.org/kubernetes/pause:latest   "/pause"            About a minute ago   Up About a minute                               k8s_POD.bdb2e1f5_test-gc-pod-exit_default_d1677c09-e9e7-11e5-974c-782bcb2a316a_85b3c032

結論:--maximum-dead-containers-per-container的計數針對一個pod內的容器集而不是容器的個數。

  1. 容器回收之--maximum-dead-containers參數

啓動kubelet設置容器回收相關參數如下:

--maximum-dead-containers-per-container=2 --minimum-container-ttl-duration=30s --maximum-dead-containers=3

創建一個包含三個容器的pod,再刪除該pod,再創建該pod,再刪除該pod,這樣就產生了8個已退出容器(包括兩個pause容器):

[@tc-151-100 /home/domeos]# docker ps -a
CONTAINER ID        IMAGE                                    COMMAND             CREATED             STATUS                              PORTS               NAMES
a28625d189df        10.11.150.76:5000/centos:7               "/bin/bash"         1 seconds ago       Exited (0) Less than a second ago                       k8s_iperf3.5c8de29f_test-gc-pod-exit_default_c7612b59-e9ee-11e5-974c-782bcb2a316a_48c11200
97aca44f0deb        10.11.150.76:5000/centos:7               "/bin/bash"         2 seconds ago       Exited (0) 1 seconds ago                                k8s_iperf2.5a36e29e_test-gc-pod-exit_default_c7612b59-e9ee-11e5-974c-782bcb2a316a_df34f48d
4e57b6c839ae        10.11.150.76:5000/centos:7               "/bin/bash"         3 seconds ago       Exited (0) 2 seconds ago                                k8s_iperf1.57dfe29d_test-gc-pod-exit_default_c7612b59-e9ee-11e5-974c-782bcb2a316a_afd622b2
12588fce1433        pub.domeos.org/kubernetes/pause:latest   "/pause"            3 seconds ago       Exited (2) Less than a second ago                       k8s_POD.bdb2e1f5_test-gc-pod-exit_default_c7612b59-e9ee-11e5-974c-782bcb2a316a_c9d4cbaa
621ed207d452        10.11.150.76:5000/centos:7               "/bin/bash"         4 seconds ago       Exited (0) 3 seconds ago                                k8s_iperf3.5c8de29f_test-gc-pod-exit_default_c5cbddbb-e9ee-11e5-974c-782bcb2a316a_a91278cd
023c10fad4fd        10.11.150.76:5000/centos:7               "/bin/bash"         5 seconds ago       Exited (0) 4 seconds ago                                k8s_iperf2.5a36e29e_test-gc-pod-exit_default_c5cbddbb-e9ee-11e5-974c-782bcb2a316a_6cc03f37
756eb7bb4b53        10.11.150.76:5000/centos:7               "/bin/bash"         5 seconds ago       Exited (0) 4 seconds ago                                k8s_iperf1.57dfe29d_test-gc-pod-exit_default_c5cbddbb-e9ee-11e5-974c-782bcb2a316a_83312ec2
d54bdc22773e        pub.domeos.org/kubernetes/pause:latest   "/pause"            6 seconds ago       Exited (2) 3 seconds ago                                k8s_POD.bdb2e1f5_test-gc-pod-exit_default_c5cbddbb-e9ee-11e5-974c-782bcb2a316a_ccb57220

GC的容器回收時間點到達時,可以看到已退出容器只剩下了三個,pause容器也被回收了:
複製代碼

[@tc-151-100 /home/domeos]# docker ps -a
CONTAINER ID        IMAGE                        COMMAND             CREATED             STATUS                     PORTS               NAMES
a28625d189df        10.11.150.76:5000/centos:7   "/bin/bash"         2 minutes ago       Exited (0) 2 minutes ago                       k8s_iperf3.5c8de29f_test-gc-pod-exit_default_c7612b59-e9ee-11e5-974c-782bcb2a316a_48c11200
97aca44f0deb        10.11.150.76:5000/centos:7   "/bin/bash"         2 minutes ago       Exited (0) 2 minutes ago                       k8s_iperf2.5a36e29e_test-gc-pod-exit_default_c7612b59-e9ee-11e5-974c-782bcb2a316a_df34f48d
4e57b6c839ae        10.11.150.76:5000/centos:7   "/bin/bash"         2 minutes ago       Exited (0) 2 minutes ago                       k8s_iperf1.57dfe29d_test-gc-pod-exit_default_c7612b59-e9ee-11e5-974c-782bcb2a316a_afd622b2

結論:Kubernetes容器垃圾回收的--maximum-dead-containers參數設置可正常工作;pause容器也作爲可回收容器被管理着;Tips第11條第3)點。

  1. --maximum-dead-containers對於非kubelet管理的容器是否計數

在第5個實驗的基礎上,手工創建一個container,等待GC的容器回收時間點到達,一分鐘過去了,兩分鐘過去了,docker ps -a 顯示的依然是4個容器:
複製代碼

[@tc-151-100 /home/domeos]# docker run -it 10.11.150.76:5000/openxxs/iperf:1.2 /bin/sh
sh-4.2# exit
exit
[@tc-151-100 /home/domeos]# docker ps -a
CONTAINER ID        IMAGE                                 COMMAND             CREATED             STATUS                      PORTS               NAMES
939b932dc7db        10.11.150.76:5000/openxxs/iperf:1.2   "/bin/sh"           2 minutes ago       Exited (0) 2 minutes ago                        backstabbing_aryabhata
a28625d189df        10.11.150.76:5000/centos:7            "/bin/bash"         12 minutes ago      Exited (0) 12 minutes ago                       k8s_iperf3.5c8de29f_test-gc-pod-exit_default_c7612b59-e9ee-11e5-974c-782bcb2a316a_48c11200
97aca44f0deb        10.11.150.76:5000/centos:7            "/bin/bash"         12 minutes ago      Exited (0) 12 minutes ago                       k8s_iperf2.5a36e29e_test-gc-pod-exit_default_c7612b59-e9ee-11e5-974c-782bcb2a316a_df34f48d
4e57b6c839ae        10.11.150.76:5000/centos:7            "/bin/bash"         12 minutes ago      Exited (0) 12 minutes ago                       k8s_iperf1.57dfe29d_test-gc-pod-exit_default_c7612b59-e9ee-11e5-974c-782bcb2a316a_afd622b2
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章