一、Tips
-
Kubernetes的垃圾回收由kubelet進(jìn)行管理,每分鐘會(huì)查詢清理一次容器,每五分鐘查詢清理一次鏡像。在kubelet剛啟動(dòng)時(shí)并不會(huì)立即進(jìn)行GC,即第一次進(jìn)行容器回收為kubelet啟動(dòng)一分鐘后,第一次進(jìn)行鏡像回收為kubelet啟動(dòng)五分鐘后。
-
不推薦使用其它管理工具或手工進(jìn)行容器和鏡像的清理,因?yàn)閗ubelet需要通過容器來判斷pod的運(yùn)行狀態(tài),如果使用其它方式清除容器有可能影響kubelet的正常工作。
-
鏡像的回收針對(duì)node結(jié)點(diǎn)上由docker管理的所有鏡像,無論該鏡像是否是在創(chuàng)建pod時(shí)pull的。而容器的回收策略只應(yīng)用于通過kubelet管理的容器。
-
Kubernetes通過kubelet集成的cadvisor進(jìn)行鏡像的回收,有兩個(gè)參數(shù)可以設(shè)置:
--image-gc-high-threshold
和--image-gc-low-threshold
。當(dāng)用于存儲(chǔ)鏡像的磁盤使用率達(dá)到百分之--image-gc-high-threshold時(shí)將觸發(fā)鏡像回收,刪除最近最久未使用(LRU,Least Recently Used)的鏡像直到磁盤使用率降為百分之--image-gc-low-threshold
或無鏡像可刪為止。默認(rèn)--image-gc-high-threshold
為90,``--image-gc-low-threshold`為80。 -
容器的回收有三個(gè)參數(shù)可設(shè)置:
--minimum-container-ttl-duration
,--maximum-dead-containers-per-container
和--maximum-dead-containers
。從容器停止運(yùn)行時(shí)起經(jīng)過--minimum-container-ttl-duration
時(shí)間后,該容器標(biāo)記為已過期將來可以被回收(只是標(biāo)記,不是回收),默認(rèn)值為1m0s。一般情況下每個(gè)pod最多可以保留--maximum-dead-containers-per-container
個(gè)已停止運(yùn)行的容器集,默認(rèn)值為2。整個(gè)node節(jié)點(diǎn)可以保留--maximum-dead-containers
個(gè)已停止運(yùn)行的容器,默認(rèn)值為100。 -
如果需要關(guān)閉容器的垃圾回收策略,可以將
--minimum-container-ttl-duration
設(shè)為0(表示無限制),--maximum-dead-containers-per-container
和--maximum-dead-containers
設(shè)為負(fù)數(shù)。 -
--minimum-container-ttl-duration
的值可以使用單位后綴,如h表示小時(shí),m表示分鐘,s表示秒。 -
當(dāng)
--maximum-dead-containers-per-container
和--maximum-dead-containers
沖突時(shí),``--maximum-dead-containers`優(yōu)先考慮。 -
對(duì)于那些由kubelet創(chuàng)建的但由于某些原因?qū)е聼o名字()的容器,會(huì)在到達(dá)GC時(shí)間點(diǎn)時(shí)被刪除。
-
回收容器時(shí),按創(chuàng)建時(shí)間排序,優(yōu)先刪除那些創(chuàng)建時(shí)間最早的容器。
-
到達(dá)GC時(shí)間點(diǎn)時(shí),具體的GC過程如下:1)遍歷所有pod,使其滿足
--maximum-dead-containers-per-container
;2)經(jīng)過上一步后如果不滿足--maximum-dead-containers
,計(jì)算值X=(--maximum-dead-containers)/(pod總數(shù))
,再遍歷所有pod,使其滿足已停止運(yùn)行的容器集個(gè)數(shù)不大于X且至少為1;3)經(jīng)過以上兩步后如果還不滿足--maximum-dead-containers
,則對(duì)所有已停止的容器排序,優(yōu)先刪除創(chuàng)建時(shí)間最早的容器直到滿足--maximum-dead-containers
為止。 -
當(dāng)某個(gè)鏡像重新pull或啟動(dòng)某個(gè)pod用到該鏡像時(shí),該鏡像的最近使用時(shí)間都會(huì)被更新。
-
Kubernetes的垃圾回收在1.1.4版本開始才漸漸完善,之前的版本存在比較多bug甚至不能發(fā)揮作用。
-
關(guān)于容器的回收需要特別注意pod的概念,比如,通過同一個(gè)yaml文件create一個(gè)pod,再delete這個(gè)pod,然后再create這個(gè)pod,此時(shí)之前的那個(gè)pod對(duì)應(yīng)的容器并不會(huì)作為新創(chuàng)建pod的已停止容器集,因?yàn)檫@兩個(gè)pod雖然同名,但已經(jīng)不是同一個(gè)pod了。只有同一個(gè)pod中在運(yùn)行過程中由于意外或其它情況停止的容器才算是這個(gè)pod的已停止容器集。
二、Experiments
-
鏡像回收(使用docker默認(rèn)
--graph
參數(shù):/var/lib/docker
)
結(jié)點(diǎn)上運(yùn)行的docker設(shè)置的參數(shù) --graph
使用默認(rèn)的/var/lib/docker
,指向/var文件系統(tǒng),通過df -lh查看目前 /var 磁盤使用率為30%,啟動(dòng)kubelet設(shè)置鏡像回收相關(guān)參數(shù)如下:
--image-gc-high-threshold=40--image-gc-low-threshold=35
此時(shí)任意創(chuàng)建兩個(gè)使用不同鏡像的pod,在node節(jié)點(diǎn)上可以看到新pull了三個(gè)images(pause鏡像是啟動(dòng)pod必需的):
[@tc-151-100/opt/domeos/openxxs/k8s-1.1.7-flannel]#dockerimages
REPOSITORYTAGIMAGEIDCREATEDSIZE
10.11.150.76:5000/openxxs/iperf1.21783511c56f83monthsago279MB
10.11.150.76:5000/centos75ddf34d4d69b8monthsago172.2MB
pub.domeos.org/kubernetes/pauselatestf9d5de07953920monthsago239.8kB
此時(shí)查看/var磁盤使用率達(dá)到了41%,然后將使用10.11.150.76:5000/centos:7
鏡像的pod刪除,等待GC的鏡像回收時(shí)間點(diǎn)。然而五分鐘過去了,什么事情也沒有發(fā)生=_=!!。還記得 docker rmi 鏡像時(shí)有個(gè)前提條件是什么嗎?沒錯(cuò),要求使用該鏡像的容器都已經(jīng)被刪除了才可以。前面刪除pod只是停止了容器,并沒有將容器刪除。因此手工將對(duì)應(yīng)的容器docker rm掉,再等待五分鐘后,可以看到鏡像已經(jīng)被刪除回收了:
[@tc-151-100/opt/domeos/openxxs/k8s-1.1.7-flannel]#dockerimages
REPOSITORYTAGIMAGEIDCREATEDSIZE
10.11.150.76:5000/openxxs/iperf1.21783511c56f83monthsago279MB
pub.domeos.org/kubernetes/pauselatestf9d5de07953920monthsago239.8kB
結(jié)論:只有相關(guān)聯(lián)的容器都被停止并刪除回收后,才能將Kubernetes的鏡像垃圾回收策略應(yīng)用到該鏡像上。
-
鏡像回收(使用自定義docker
--graph
參數(shù):/opt/docker
)
結(jié)點(diǎn)上運(yùn)行的docker設(shè)置的參數(shù)--graph
指向 /opt 磁盤,通過 df -lh 查看目前 /opt 磁盤使用率為 48% ,啟動(dòng) kubelet 設(shè)置鏡像回收相關(guān)參數(shù)如下:
--image-gc-high-threshold=50--image-gc-low-threshold=40
此時(shí)任意創(chuàng)建兩個(gè)使用不同鏡像的pod,在node節(jié)點(diǎn)上可以看到新pull了三個(gè)images:
[@tc-151-100/opt/domeos/openxxs/k8s-1.1.7-flannel]#dockerimages
REPOSITORYTAGIMAGEIDCREATEDSIZE
10.11.150.76:5000/openxxs/iperf1.21783511c56f83monthsago279MB
10.11.150.76:5000/centos75ddf34d4d69b8monthsago172.2MB
pub.domeos.org/kubernetes/pauselatestf9d5de07953920monthsago239.8kB
此時(shí)查看/opt磁盤使用率達(dá)到了51%,然后將使用10.11.150.76:5000/centos:7鏡像的pod刪除,手工將對(duì)應(yīng)的容器docker rm掉,等待GC的鏡像回收時(shí)間點(diǎn)。然而五分鐘過去了,十分鐘過去了,docker images時(shí)centos鏡像依舊頑固地堅(jiān)守在陣地。
結(jié)論:目前Kubernetes的鏡像垃圾回收策略可以在docker
--graph
參數(shù)默認(rèn)為/var/lib/docker
時(shí)正常工作,當(dāng)--graph
設(shè)置為其它磁盤路徑時(shí)還存在bug。
問題反饋在 Github 的相關(guān) issue 里:https://github.com/kubernetes/kubernetes/issues/17994,可以繼續(xù)跟進(jìn)。
Append: 根據(jù)Github上的反饋,這個(gè)bug將在后續(xù)版本中解決,目前版本需要讓設(shè)置了--graph的鏡像垃圾回收生效,在啟動(dòng)kubelet時(shí)還需要加上參數(shù) --docker-root=
。
-
容器回收之
--maximum-dead-containers-per-container
參數(shù)
啟動(dòng)kubelet設(shè)置容器回收相關(guān)參數(shù)如下:
--maximum-dead-containers-per-container=1--minimum-container-ttl-duration=30s--maximum-dead-containers=100
創(chuàng)建一個(gè)只包含一個(gè)容器且該容器一運(yùn)行就退出的pod,此時(shí)在node節(jié)點(diǎn)上可以看到該pod中的容器不斷的創(chuàng)建退出創(chuàng)建退出:
[@tc-151-100/home/domeos]#dockerps-a
CONTAINERIDIMAGECOMMANDCREATEDSTATUSPORTSNAMES
2fe96949916410.11.150.76:5000/centos:7"/bin/bash"4secondsagoExited(0)2secondsagok8s_iperf1.57dfe29d_test-gc-pod-exit_default_92e8bd05-e9e6-11e5-974c-782bcb2a316a_68cc6f03
555b5e7a855010.11.150.76:5000/centos:7"/bin/bash"24secondsagoExited(0)22secondsagok8s_iperf1.57dfe29d_test-gc-pod-exit_default_92e8bd05-e9e6-11e5-974c-782bcb2a316a_ad4a5e39
94b30a0b32c210.11.150.76:5000/centos:7"/bin/bash"34secondsagoExited(0)32secondsagok8s_iperf1.57dfe29d_test-gc-pod-exit_default_92e8bd05-e9e6-11e5-974c-782bcb2a316a_4027e3e1
d458e6a7d396pub.domeos.org/kubernetes/pause:latest"/pause"34secondsagoUp33secondsk8s_POD.bdb2e1f5_test-gc-pod-exit_default_92e8bd05-e9e6-11e5-974c-782bcb2a316a_09798975
GC的容器回收時(shí)間點(diǎn)到達(dá)時(shí),可以看到創(chuàng)建時(shí)間大于30秒的已退出容器只剩下一個(gè)(pause容器不計(jì)算),且先創(chuàng)建的容器被優(yōu)先刪除:
[@tc-151-100/home/domeos]#dockerps-a
CONTAINERIDIMAGECOMMANDCREATEDSTATUSPORTSNAMES
5aae6157aeff10.11.150.76:5000/centos:7"/bin/bash"46secondsagoExited(0)45secondsagok8s_iperf1.57dfe29d_test-gc-pod-exit_default_92e8bd05-e9e6-11e5-974c-782bcb2a316a_f126d2a8
d458e6a7d396pub.domeos.org/kubernetes/pause:latest"/pause"2minutesagoUp2minutesk8s_POD.bdb2e1f5_test-gc-pod-exit_default_92e8bd05-e9e6-11e5-974c-782bcb2a316a_09798975
結(jié)論:Kubernetes容器垃圾回收的
--maximum-dead-containers-per-container
參數(shù)設(shè)置可正常工作。
-
--maximum-dead-containers-per-container
針對(duì)容器還是容器集
啟動(dòng)kubelet設(shè)置容器回收相關(guān)參數(shù)如下:
--maximum-dead-containers-per-container=1--minimum-container-ttl-duration=30s--maximum-dead-containers=100
創(chuàng)建一個(gè)包含三個(gè)容器且這些容器一運(yùn)行就退出的pod,此時(shí)在node節(jié)點(diǎn)上可以看到該pod中的容器不斷的創(chuàng)建退出創(chuàng)建退出:
[@tc-151-100/home/domeos]#dockerps-a
CONTAINERIDIMAGECOMMANDCREATEDSTATUSPORTSNAMES
dec04bd28a0310.11.150.76:5000/centos:7"/bin/bash"7secondsagoExited(0)6secondsagok8s_iperf1.57dfe29d_test-gc-pod-exit_default_d1677c09-e9e7-11e5-974c-782bcb2a316a_830a9375
7c94d4a963a710.11.150.76:5000/centos:7"/bin/bash"7secondsagoExited(0)6secondsagok8s_iperf3.5c8de29f_test-gc-pod-exit_default_d1677c09-e9e7-11e5-974c-782bcb2a316a_975d44d3
4f3e7e8ddfd510.11.150.76:5000/centos:7"/bin/bash"8secondsagoExited(0)7secondsagok8s_iperf2.5a36e29e_test-gc-pod-exit_default_d1677c09-e9e7-11e5-974c-782bcb2a316a_d024eb06
cb48cf2ba13310.11.150.76:5000/centos:7"/bin/bash"12secondsagoExited(0)11secondsagok8s_iperf3.5c8de29f_test-gc-pod-exit_default_d1677c09-e9e7-11e5-974c-782bcb2a316a_b5ff7373
ec2941f046f010.11.150.76:5000/centos:7"/bin/bash"13secondsagoExited(0)12secondsagok8s_iperf2.5a36e29e_test-gc-pod-exit_default_d1677c09-e9e7-11e5-974c-782bcb2a316a_69b1a996
f831e8ed568710.11.150.76:5000/centos:7"/bin/bash"13secondsagoExited(0)12secondsagok8s_iperf1.57dfe29d_test-gc-pod-exit_default_d1677c09-e9e7-11e5-974c-782bcb2a316a_fbc02e2e
ee972a4537fcpub.domeos.org/kubernetes/pause:latest"/pause"14secondsagoUp13secondsk8s_POD.bdb2e1f5_test-gc-pod-exit_default_d1677c09-e9e7-11e5-974c-782bcb2a316a_85b3c032
GC的容器回收時(shí)間點(diǎn)到達(dá)時(shí),可以看到創(chuàng)建時(shí)間大于30秒的已退出容器剩下三個(gè)(pause容器不計(jì)算),且這三個(gè)容器正好是一組:
[@tc-151-100/home/domeos]#dockerps-a
CONTAINERIDIMAGECOMMANDCREATEDSTATUSPORTSNAMES
e4351e6855ae10.11.150.76:5000/centos:7"/bin/bash"51secondsagoExited(0)50secondsagok8s_iperf3.5c8de29f_test-gc-pod-exit_default_d1677c09-e9e7-11e5-974c-782bcb2a316a_263dd820
990baa6e6a7a10.11.150.76:5000/centos:7"/bin/bash"52secondsagoExited(0)51secondsagok8s_iperf2.5a36e29e_test-gc-pod-exit_default_d1677c09-e9e7-11e5-974c-782bcb2a316a_b16b5eaa
c6916fb06d6510.11.150.76:5000/centos:7"/bin/bash"53secondsagoExited(0)51secondsagok8s_iperf1.57dfe29d_test-gc-pod-exit_default_d1677c09-e9e7-11e5-974c-782bcb2a316a_1d8ea284
ee972a4537fcpub.domeos.org/kubernetes/pause:latest"/pause"AboutaminuteagoUpAboutaminutek8s_POD.bdb2e1f5_test-gc-pod-exit_default_d1677c09-e9e7-11e5-974c-782bcb2a316a_85b3c032
結(jié)論:
--maximum-dead-containers-per-container
的計(jì)數(shù)針對(duì)一個(gè)pod內(nèi)的容器集而不是容器的個(gè)數(shù)。
-
容器回收之
--maximum-dead-containers
參數(shù)
啟動(dòng)kubelet設(shè)置容器回收相關(guān)參數(shù)如下:
--maximum-dead-containers-per-container=2--minimum-container-ttl-duration=30s--maximum-dead-containers=3
創(chuàng)建一個(gè)包含三個(gè)容器的pod,再刪除該pod,再創(chuàng)建該pod,再刪除該pod,這樣就產(chǎn)生了8個(gè)已退出容器(包括兩個(gè)pause容器):
[@tc-151-100/home/domeos]#dockerps-a
CONTAINERIDIMAGECOMMANDCREATEDSTATUSPORTSNAMES
a28625d189df10.11.150.76:5000/centos:7"/bin/bash"1secondsagoExited(0)Lessthanasecondagok8s_iperf3.5c8de29f_test-gc-pod-exit_default_c7612b59-e9ee-11e5-974c-782bcb2a316a_48c11200
97aca44f0deb10.11.150.76:5000/centos:7"/bin/bash"2secondsagoExited(0)1secondsagok8s_iperf2.5a36e29e_test-gc-pod-exit_default_c7612b59-e9ee-11e5-974c-782bcb2a316a_df34f48d
4e57b6c839ae10.11.150.76:5000/centos:7"/bin/bash"3secondsagoExited(0)2secondsagok8s_iperf1.57dfe29d_test-gc-pod-exit_default_c7612b59-e9ee-11e5-974c-782bcb2a316a_afd622b2
12588fce1433pub.domeos.org/kubernetes/pause:latest"/pause"3secondsagoExited(2)Lessthanasecondagok8s_POD.bdb2e1f5_test-gc-pod-exit_default_c7612b59-e9ee-11e5-974c-782bcb2a316a_c9d4cbaa
621ed207d45210.11.150.76:5000/centos:7"/bin/bash"4secondsagoExited(0)3secondsagok8s_iperf3.5c8de29f_test-gc-pod-exit_default_c5cbddbb-e9ee-11e5-974c-782bcb2a316a_a91278cd
023c10fad4fd10.11.150.76:5000/centos:7"/bin/bash"5secondsagoExited(0)4secondsagok8s_iperf2.5a36e29e_test-gc-pod-exit_default_c5cbddbb-e9ee-11e5-974c-782bcb2a316a_6cc03f37
756eb7bb4b5310.11.150.76:5000/centos:7"/bin/bash"5secondsagoExited(0)4secondsagok8s_iperf1.57dfe29d_test-gc-pod-exit_default_c5cbddbb-e9ee-11e5-974c-782bcb2a316a_83312ec2
d54bdc22773epub.domeos.org/kubernetes/pause:latest"/pause"6secondsagoExited(2)3secondsagok8s_POD.bdb2e1f5_test-gc-pod-exit_default_c5cbddbb-e9ee-11e5-974c-782bcb2a316a_ccb57220
GC的容器回收時(shí)間點(diǎn)到達(dá)時(shí),可以看到已退出容器只剩下了三個(gè),pause容器也被回收了:
[@tc-151-100/home/domeos]#dockerps-a
CONTAINERIDIMAGECOMMANDCREATEDSTATUSPORTSNAMES
a28625d189df10.11.150.76:5000/centos:7"/bin/bash"2minutesagoExited(0)2minutesagok8s_iperf3.5c8de29f_test-gc-pod-exit_default_c7612b59-e9ee-11e5-974c-782bcb2a316a_48c11200
97aca44f0deb10.11.150.76:5000/centos:7"/bin/bash"2minutesagoExited(0)2minutesagok8s_iperf2.5a36e29e_test-gc-pod-exit_default_c7612b59-e9ee-11e5-974c-782bcb2a316a_df34f48d
4e57b6c839ae10.11.150.76:5000/centos:7"/bin/bash"2minutesagoExited(0)2minutesagok8s_iperf1.57dfe29d_test-gc-pod-exit_default_c7612b59-e9ee-11e5-974c-782bcb2a316a_afd622b2
結(jié)論:Kubernetes容器垃圾回收的
--maximum-dead-containers
參數(shù)設(shè)置可正常工作;pause容器也作為可回收容器被管理著;Tips第11條第3)點(diǎn)。
-
--maximum-dead-containers
對(duì)于非kubelet管理的容器是否計(jì)數(shù)
在第5個(gè)實(shí)驗(yàn)的基礎(chǔ)上,手工創(chuàng)建一個(gè)container,等待GC的容器回收時(shí)間點(diǎn)到達(dá),一分鐘過去了,兩分鐘過去了,docker ps -a 顯示的依然是4個(gè)容器:
[@tc-151-100/home/domeos]#dockerrun-it10.11.150.76:5000/openxxs/iperf:1.2/bin/sh
sh-4.2#exit
exit
[@tc-151-100/home/domeos]#dockerps-a
CONTAINERIDIMAGECOMMANDCREATEDSTATUSPORTSNAMES
939b932dc7db10.11.150.76:5000/openxxs/iperf:1.2"/bin/sh"2minutesagoExited(0)2minutesagobackstabbing_aryabhata
a28625d189df10.11.150.76:5000/centos:7"/bin/bash"12minutesagoExited(0)12minutesagok8s_iperf3.5c8de29f_test-gc-pod-exit_default_c7612b59-e9ee-11e5-974c-782bcb2a316a_48c11200
97aca44f0deb10.11.150.76:5000/centos:7"/bin/bash"12minutesagoExited(0)12minutesagok8s_iperf2.5a36e29e_test-gc-pod-exit_default_c7612b59-e9ee-11e5-974c-782bcb2a316a_df34f48d
4e57b6c839ae10.11.150.76:5000/centos:7"/bin/bash"12minutesagoExited(0)12minutesagok8s_iperf1.57dfe29d_test-gc-pod-exit_default_c7612b59-e9ee-11e5-974c-782bcb2a316a_afd622b2
結(jié)論:Kubernetes容器垃圾回收的策略不適用于非kubelet管理的容器。
審核編輯:湯梓紅
-
容器
+關(guān)注
關(guān)注
0文章
507瀏覽量
22369 -
kubernetes
+關(guān)注
關(guān)注
0文章
240瀏覽量
8974
原文標(biāo)題:kubelet 垃圾回收機(jī)制
文章出處:【微信號(hào):magedu-Linux,微信公眾號(hào):馬哥Linux運(yùn)維】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
Kubernetes之路 2 - 利用LXCFS提升容器資源可見性
阿里云容器Kubernetes監(jiān)控(一) - 資源監(jiān)控
阿里云容器Kubernetes監(jiān)控(一) - 資源監(jiān)控
固態(tài)硬盤垃圾回收方法

基于邏輯區(qū)間熱度的垃圾回收算法

Jvm垃圾回收機(jī)制及性能調(diào)優(yōu)實(shí)戰(zhàn)
交大發(fā)布可回收物垃圾分揀機(jī)器人,實(shí)現(xiàn)助力全國(guó)垃圾分類回收工作
智能垃圾回收機(jī)器人的應(yīng)用優(yōu)勢(shì)是什么
生活垃圾數(shù)據(jù)化分類回收方法及其回收系統(tǒng)(機(jī)械部分)
詳解JVM的垃圾回收算法和垃圾回收器

什么是Kubernetes容器運(yùn)行時(shí)CRI

智能垃圾回收箱及其控制系統(tǒng)

智能垃圾回收箱控制系統(tǒng)硬件設(shè)計(jì)

智能垃圾回收箱功能實(shí)驗(yàn)

評(píng)論