容器的底層實(shí)現(xiàn)深度依賴于內(nèi)核的眾多特性,如overlay文件系統(tǒng),namespace,cgroup等,因此內(nèi)核的功能和穩(wěn)定性,在很大程度上,決定了整個(gè)容器PaaS平臺(tái)的功能和穩(wěn)定性。從TKE上線三年多以來,上萬集群,數(shù)十萬個(gè)節(jié)點(diǎn)的運(yùn)營經(jīng)驗(yàn)來看,內(nèi)核問題約占所有節(jié)點(diǎn)問題的三分之一。
那么容器場景選擇哪個(gè)Linux版本最好呢?在騰訊云,這個(gè)答案是Tencent Linux[1]。
這時(shí)候大家應(yīng)該會(huì)有很多的疑問,接下來的FAQ會(huì)盡力解答大家的疑問。
Tencent Linux是誰維護(hù)的?基于什么發(fā)行版的?
是騰訊內(nèi)核和虛擬化團(tuán)隊(duì)負(fù)責(zé)維護(hù)的。Tencent Linux 2.4基于CentOS 7,用戶態(tài)軟件包保持與最新版CentOS 7兼容,CentOS 7版本的軟件包可以直接在Tencent Linux 2.4中使用。
Tencent Linux跟CentOS有什么區(qū)別?
關(guān)鍵的區(qū)別在內(nèi)核版本,本文后面會(huì)詳細(xì)介紹。用戶態(tài)有少量調(diào)整,如YUM源的配置等,詳情請(qǐng)參考官方介紹文檔:https://cloud.tencent.com/document/product/213/38027
內(nèi)核是什么版本?
Tencent Linux 2.4目前是4.14內(nèi)核。
代碼和rpm包在GitHub可以獲?。篽ttps://github.com/Tencent/TencentOS-kernel。
年底會(huì)推出5.4版本。
Tencent Linux跟TKE的Optimized鏡像是什么關(guān)系?
它們的內(nèi)核是一樣的,但Tencent Linux 2.4是CVM公共鏡像,TKE Optimized鏡像是市場鏡像。
TKE將使用Tencent Linux2.4來替代CentOS 7.6 TKE Optimized以及Ubuntu18.04 TKE Optimized。已經(jīng)在使用CentOS 7.6 TKE Optimized和Ubuntu18.04 TKE Optimized的集群還可以繼續(xù)使用,但以后新建集群將不再支持這兩種鏡像。
預(yù)計(jì)11月下旬起,TKE用戶可以自行在控制臺(tái)操作,將集群新創(chuàng)建的節(jié)點(diǎn)的OS鏡像切換為Tencent Linux2.4,操作入口如下圖(把操作系統(tǒng)修改為Tencent Linux2.4):
相比CentOS和Ubuntu等發(fā)行版有什么優(yōu)勢?
主要優(yōu)勢如下,后文會(huì)詳細(xì)介紹:
1.經(jīng)過騰訊大量內(nèi)部業(yè)務(wù)多年的驗(yàn)證和打磨。
2.頂級(jí)內(nèi)核專家團(tuán)隊(duì)的支持。
3.包含一些關(guān)鍵的性能優(yōu)化和針對(duì)容器場景的定制特性。
騰訊內(nèi)部業(yè)務(wù)多年的驗(yàn)證和打磨
Tencent Linux從2010年啟動(dòng)研發(fā),在騰訊內(nèi)部已經(jīng)上線運(yùn)營了10年,總部署量已經(jīng)是百萬級(jí),在騰訊內(nèi)部Linux系統(tǒng)里占比99%,覆蓋了騰訊所有的業(yè)務(wù),同時(shí)騰訊有著國內(nèi)最種類繁多的業(yè)務(wù)生態(tài),從社交,游戲,到金融支付,AI,安全等,所以對(duì)底層操作系統(tǒng)的穩(wěn)定性,性能,兼容性等都有更強(qiáng)的要求。
對(duì)于容器場景來講,騰訊大量核心業(yè)務(wù)幾乎已經(jīng)部分或全部容器化,例如微信所有的邏輯業(yè)務(wù)全部容器化,針對(duì)微信業(yè)務(wù)特點(diǎn),進(jìn)行系列優(yōu)化,順利保障了每年春節(jié)的紅包高峰運(yùn)營,同時(shí)在數(shù)據(jù)安全方面,也跟微信緊密合作,提供解決方案。
內(nèi)核專家團(tuán)隊(duì)的支持
目前有三十多位全職內(nèi)核專家為這個(gè)內(nèi)核版本提供支持。其中有kvm維護(hù)者,還有很多內(nèi)核網(wǎng)絡(luò),存儲(chǔ),cgroup,調(diào)度等各個(gè)子系統(tǒng)的專家。
支持力度也體現(xiàn)在版本更新節(jié)奏和熱補(bǔ)丁服務(wù)。
從版本記錄(https://github.com/Tencent/TencentOS-kernel/releases)可以看到,從7月到10月,Tencent Linux 4.14內(nèi)核系列發(fā)布了5個(gè)版本。騰訊內(nèi)部業(yè)務(wù)和騰訊云外部客戶碰到的絕大多數(shù)問題,都能及時(shí)得到定位和修復(fù)。
另外我們針對(duì)一些重要的修復(fù),會(huì)提供內(nèi)核熱補(bǔ)丁的在線修復(fù)方式。熱補(bǔ)丁的安裝和生效,不需要重啟機(jī)器,在不中斷客戶業(yè)務(wù)的情況下,提升客戶業(yè)務(wù)的時(shí)延SLA。
對(duì)于漏洞修復(fù),Tencent Linux有著全套的熱補(bǔ)丁方案,包括:應(yīng)用程序級(jí)熱補(bǔ)丁,內(nèi)核級(jí)熱補(bǔ)丁等。每年發(fā)布100多個(gè)熱補(bǔ)丁。大多數(shù)漏洞在一周內(nèi)提供修復(fù)方案。
性能優(yōu)化
Tecent Linux在根據(jù)內(nèi)部與外部的用戶在大規(guī)模落地實(shí)踐中遇到的問題,針對(duì)容器場景也做了大量性能優(yōu)化,包括但不限于:
1.解決IPVS模式高并發(fā)場景下,連接復(fù)用引發(fā)連接異常的問題(pr#81775[2])。
2.解決IPVS模式在高配節(jié)點(diǎn)(核數(shù)多)下IPVS規(guī)則過多引發(fā)網(wǎng)絡(luò)毛刺的問題。
3.解決在容器密集場景下(單節(jié)點(diǎn)上容器數(shù)量較多),cAdvisor讀取memcg陷入內(nèi)核態(tài)過久引發(fā)網(wǎng)絡(luò)毛刺的問題。
4.解決大Pod(占用核數(shù)多,單核占用高)在高配節(jié)點(diǎn)(核數(shù)多)場景下,CPU負(fù)載均衡引發(fā)網(wǎng)絡(luò)毛刺的問題。
5.解決高并發(fā)場景下的TCP連接監(jiān)控(比如單獨(dú)部署cAdvisor配置監(jiān)控TCP連接)引發(fā)網(wǎng)絡(luò)周期性抖動(dòng)問題。
6.優(yōu)化網(wǎng)絡(luò)收包軟中斷,提升網(wǎng)絡(luò)性能。
這些針對(duì)各種容器場景的優(yōu)化效果非常顯著,以第3點(diǎn)為例,ping時(shí)延監(jiān)控效果圖如下(11:00之后是優(yōu)化后):
容器定制特性
容器資源展示隔離
很多golang,java程序的高效運(yùn)行依賴于正確獲取進(jìn)程可用的CPU和內(nèi)存資源。但這類程序在容器中獲取到的是節(jié)點(diǎn)的CPU和內(nèi)存資源,與實(shí)際容器所分配的資源并不匹配,往往會(huì)造成進(jìn)程的線程池等參數(shù)不合理,從而帶來問題。
社區(qū)主流的解決方案是通過部署FUSE實(shí)現(xiàn)的LXCFS來實(shí)現(xiàn)/proc/cpuinfo,/proc/meminfo等資源展示按容器隔離。這個(gè)方案需要在節(jié)點(diǎn)部署LXCFS文件系統(tǒng),也需要往POD sepc中插入相關(guān)volume和掛載點(diǎn)的配置。詳情可以參考:Kubernetes Demystified:Using LXCFS to Improve Container Resource Visibility[3]
Tencnet Linux內(nèi)核中實(shí)現(xiàn)了類似LXCFS特性,用戶無需在節(jié)點(diǎn)部署LXCFS文件系統(tǒng),也無需修改POD spec。只需在節(jié)點(diǎn)開啟一個(gè)全局開關(guān)(sysctl-w kernel.stats_isolated=1),容器中讀取/proc/cpuinfo,/proc/meminfo等文件獲取的就是按容器隔離的,就是這么簡單。
另外,考慮到有些特殊容器,比如節(jié)點(diǎn)監(jiān)控組件,可能就是需要讀取節(jié)點(diǎn)級(jí)的信息。為了解決這個(gè)問題,專門增加了容器級(jí)的開關(guān)kernel.container_stats_isolated。在主機(jī)級(jí)開關(guān)開啟的情況下,只需要在容器的啟動(dòng)腳本里面,關(guān)閉容器級(jí)的開關(guān)(sysctl-w kernel.container_stats_isolated=0),以后在這個(gè)容器里面讀取/proc/cpuinfo,/proc/meminfo等文件獲取的就是主機(jī)的信息了。(注:容器級(jí)開關(guān)必須在容器中設(shè)置,才能對(duì)本容器生效)
請(qǐng)參考詳細(xì)使用文檔:容器內(nèi)CPU、內(nèi)存、進(jìn)程、磁盤等信息隔離[4]
更多內(nèi)核參數(shù)的隔離
·net.ipv4.tcp_max_orphans
·net.ipv4.tcp_workaround_signed_windows
·net.ipv4.tcp_rmem
·net.ipv4.tcp_wmem
·vm.max_map_count
這些內(nèi)核參數(shù)都是業(yè)務(wù)經(jīng)常需要定制修改的。但是社區(qū)內(nèi)核里面并沒有對(duì)這些參數(shù)做namespace化隔離。一個(gè)容器對(duì)以上參數(shù)的修改,會(huì)對(duì)主機(jī)以及所有其他容器都起作用。
Tencent Linux根據(jù)內(nèi)外部客戶的需求,實(shí)現(xiàn)了這些內(nèi)核參數(shù)的namespace化隔離,業(yè)務(wù)容器可以放心的對(duì)這些參數(shù)進(jìn)行個(gè)性化設(shè)置而不用擔(dān)心對(duì)其他業(yè)務(wù)的干擾了。
容器缺省內(nèi)核參數(shù)優(yōu)化
在高并發(fā)的情況下,可能會(huì)發(fā)生半連接隊(duì)列滿而丟包,可以通過調(diào)大net.core.somaxconn來緩解問題。但是容器網(wǎng)絡(luò)namespace里面的net.core.somaxconn缺省值只有128,而且是代碼寫死的。在Tencent Linux內(nèi)核中,我們把這個(gè)缺省值調(diào)整到4096,從而可以減少高并發(fā)情況下半連接隊(duì)列滿的丟包問題。
在TKE如何使用Tencent Linux
如果希望TKE集群的節(jié)點(diǎn)使用Tencent Linux的操作系統(tǒng),需要在創(chuàng)建TKE集群時(shí),操作系統(tǒng)選擇Tencent Linux的:
注:Tencent Linux除了支持普通的云服務(wù)器機(jī)型外,還支持黑石物理機(jī)與Nvidia GPU的機(jī)型。
參考資料
[1]Tencent Linux:https://cloud.tencent.com/document/product/213/38027
[2]pr#81775:https://github.com/kubernetes/kubernetes/issues/81775
[3]Kubernetes Demystified:Using LXCFS to Improve Container Resource Visibility:https://dzone.com/articles/kubernetes-demystified-using-lxcfs-to-improve-cont
[4]容器內(nèi)CPU、內(nèi)存、進(jìn)程、磁盤等信息隔離:https://github.com/Tencent/TencentOS-kernel/wiki/container-resource-view-isolation
[5]Tencent Linux內(nèi)核代碼:https://github.com/Tencent/TencentOS-kernel