本文所討論垃圾回收(GC,Garbage Collection)機制針對Kubernetes1.1.7,docker容器。node
01. Kubernetes的垃圾回收由kubelet進行管理,每分鐘會查詢清理一次容器,每五分鐘查詢清理一次鏡像。在kubelet剛啓動時並不會當即進行GC,即第一次進行容器回收爲kubelet啓動一分鐘後,第一次進行鏡像回收爲kubelet啓動五分鐘後。git
02. 不推薦使用其它管理工具或手工進行容器和鏡像的清理,由於kubelet須要經過容器來判斷pod的運行狀態,若是使用其它方式清除容器有可能影響kubelet的正常工做。github
03. 鏡像的回收針對node結點上由docker管理的全部鏡像,不管該鏡像是不是在建立pod時pull的。而容器的回收策略只應用於經過kubelet管理的容器。docker
04. 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。centos
05. 容器的回收有三個參數可設置:--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。bash
06. 若是須要關閉容器的垃圾回收策略,能夠將--minimum-container-ttl-duration設爲0(表示無限制),--maximum-dead-containers-per-container和--maximum-dead-containers設爲負數。dom
07. --minimum-container-ttl-duration的值可使用單位後綴,如h表示小時,m表示分鐘,s表示秒。工具
08. 當--maximum-dead-containers-per-container和--maximum-dead-containers衝突時,--maximum-dead-containers優先考慮。spa
09. 對於那些由kubelet建立的但因爲某些緣由致使無名字(<none>)的容器,會在到達GC時間點時被刪除。3d
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的已中止容器集。
1. 鏡像回收(使用docker默認--graph參數:/var/lib/docker)
結點上運行的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的鏡像垃圾回收策略應用到該鏡像上。
2. 鏡像回收(使用自定義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參數值>。
3. 容器回收之--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 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參數設置可正常工做。
4. --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內的容器集而不是容器的個數。
5. 容器回收之--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)點。
6. --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
結論:Kubernetes容器垃圾回收的策略不適用於非kubelet管理的容器。