背景
TKE發(fā)行版(TKE Kubernetes Distro)是由騰訊云TKE發(fā)布的K8s發(fā)行版本,用于幫助用戶創(chuàng)建安全可靠的K8s集群。用戶可依托TKE發(fā)行版在自建或者托管機(jī)房、物理機(jī)或者虛機(jī)上,運(yùn)行與TKE完全一致的K8s服務(wù)。TKE發(fā)行版集群可無縫與騰訊云TKE集成,進(jìn)而組建混合云。用戶可通過TKE發(fā)行版集群將云下業(yè)務(wù)擴(kuò)展到云上,利用騰訊云TKE、EKS等云服務(wù)彈性能力,為業(yè)務(wù)提供強(qiáng)大的資源保障。
目前TKE發(fā)行版已在GitHub開源:[https://github.com/tkestack/tke-k8s-distro]
使用場景與定位
在混合云場景下,不同的云服務(wù)商提供的K8s并不完全相同。并且用戶在云服務(wù)商以外的環(huán)境只能使用社區(qū)版K8s,而運(yùn)行環(huán)境的任何微小差異都可能導(dǎo)致業(yè)務(wù)故障,因此,如何盡可能地保障多環(huán)境中基礎(chǔ)組件的一致性變得尤為重要。TKE發(fā)行版便是解決這個(gè)問題的一個(gè)不錯(cuò)的選擇,用戶無需花費(fèi)精力去關(guān)注不同環(huán)境下K8s的能力差異,以及自行修復(fù)K8s中的遇到的問題。
依賴TKE發(fā)行版,用戶現(xiàn)在可以編譯和構(gòu)建與騰訊云TKE相同的K8s版本。這意味著用戶現(xiàn)在可以手動(dòng)部署可靠和安全的集群,而無需持續(xù)測試和跟蹤K8s更新、依賴關(guān)系和安全補(bǔ)丁。每一個(gè)TKE發(fā)行版都遵循騰訊云TKE和K8s社區(qū)標(biāo)準(zhǔn)新版本兼容性的流程。
TKE發(fā)行版在保證兼容性的基礎(chǔ)上,對(duì)K8s進(jìn)行了擴(kuò)展,并且與騰訊云TKE服務(wù)保持版本一致。用戶可以在自己的IDC或者混合云上部署TKE發(fā)行版,使用已有企業(yè)用戶大規(guī)模驗(yàn)證的可靠安全的K8s服務(wù)。
TKE發(fā)行版的每個(gè)版本都會(huì)通過K8s社區(qū)官方一致性測試,保證兼容性,同時(shí)以patch形式提供源代碼,并提供構(gòu)建工具幫助用戶進(jìn)行編譯。TKE發(fā)行版目前支持v1.20版本。
我們的優(yōu)勢
大規(guī)模生產(chǎn)集群驗(yàn)證
TKE發(fā)行版提供與騰訊云TKE相同的可安裝版本和開源代碼,功能和穩(wěn)定性經(jīng)過大量企業(yè)用戶、公有云及自研云錘煉。用戶可以使用提供的源代碼和編譯工具進(jìn)行構(gòu)建和部署。
無縫集成公有云TKE
TKE發(fā)行版可支持用戶在自建或者托管機(jī)房,物理機(jī)或者虛機(jī)上,運(yùn)行與騰訊云TKE完全一致的K8s服務(wù)。并且可以無縫與騰訊云TKE集成,組建混合云集群。
更長支持周期
TKE發(fā)行版的支持周期比社區(qū)版更長。在社區(qū)版停止支持后,TKE發(fā)行版將繼續(xù)得到支持,包括重要問題以及安全漏洞的修復(fù)。
更多實(shí)用能力增強(qiáng)
TKE發(fā)行版結(jié)合騰訊自身業(yè)務(wù)特點(diǎn)和經(jīng)驗(yàn),針對(duì)部分場景(彈性擴(kuò)容、離在線混部、資源隔離等)實(shí)現(xiàn)了能力增強(qiáng)。并且TKE發(fā)行版緊跟社區(qū)趨勢,主導(dǎo)或深度參與社區(qū)KEP設(shè)計(jì)與實(shí)現(xiàn)。對(duì)于有實(shí)用價(jià)值KEP會(huì)先于社區(qū)支持,讓用戶提前享受到云原生技術(shù)進(jìn)步。
功能增強(qiáng)
支持彈性擴(kuò)容到騰訊云EKS服務(wù)
EKS是騰訊云的彈性容器服務(wù),用戶無須購買節(jié)點(diǎn)即可部署工作負(fù)載,非常適合突發(fā)等臨時(shí)的擴(kuò)容需求。在需要臨時(shí)擴(kuò)容時(shí),可以秒級(jí)快速把工作負(fù)載從TKE發(fā)行版集群擴(kuò)容到云上EKS,應(yīng)對(duì)突發(fā)和臨時(shí)流量,提高資源利用率,降低運(yùn)維和資金成本。
支持動(dòng)態(tài)修改kube-controller-manager日志級(jí)別
在運(yùn)維K8s生產(chǎn)集群中,我們一般設(shè)置較低日志級(jí)別(0~2),而在問題排查時(shí)我們需要提高日志級(jí)別。TKE發(fā)行版實(shí)現(xiàn)了動(dòng)態(tài)修改日志級(jí)別功能,從而避免因組件重啟導(dǎo)致關(guān)鍵日志丟失。目前K8s官方版本支持kube-apiserver、kubelet和kube-scheduler設(shè)置,TKE發(fā)行版額外實(shí)現(xiàn)了kube-controller-manager組件的日志動(dòng)態(tài)調(diào)級(jí)。
該feature已提交社區(qū):【https://github.com/kubernetes/kubernetes/pull/98262】
支持Memory QoS with cgroups v2特性(進(jìn)行中)
Memory QoS with cgroups v2是TKE團(tuán)隊(duì)設(shè)計(jì)實(shí)現(xiàn)的內(nèi)存QoS功能,它利用v2 memory controller中memory.min/memory.high為pod/container/node提供全方位的內(nèi)存保護(hù)。
目前該KEP已被K8s社區(qū)接受,預(yù)計(jì)在v1.22中實(shí)現(xiàn)alpha版。TKE發(fā)行版會(huì)先于社區(qū)支持該特性,為用戶Pod、集群節(jié)點(diǎn)等提供更好的內(nèi)存保護(hù)。
Memory QoS with cgroups v2:【https://github.com/kubernetes/enhancements/tree/master/keps/sig-node/2570-memory-qos】
支持TencentOS QoS特性(進(jìn)行中)
TencentOS是騰訊針對(duì)云場景研發(fā)的Linux操作系統(tǒng),專門針對(duì)容器場景提供了原生優(yōu)先級(jí)支持及資源隔離增強(qiáng),包括CPU、內(nèi)存、磁盤IO和網(wǎng)絡(luò)IO等。TKE發(fā)行版內(nèi)置了對(duì)TencentOS QoS特性的支持,將K8s資源隔離和QoS分級(jí)offload到TencentOS實(shí)現(xiàn)。該特性在開發(fā)中,預(yù)計(jì)下個(gè)版本支持。
TencentOS:【https://github.com/Tencent/TencentOS-kernel】
穩(wěn)定性增強(qiáng)
TKE發(fā)行版依據(jù)大量生產(chǎn)經(jīng)驗(yàn),修復(fù)眾多生產(chǎn)級(jí)bug,支持千萬核集群在騰訊穩(wěn)定運(yùn)行。主要bugfix包括:
1.修復(fù)使用containerd時(shí)集群監(jiān)控指標(biāo)缺失問題
在containerd作為container runtime的集群中,kubelet沒有正確設(shè)置采集指標(biāo)的container name,導(dǎo)致不能被歸類和分析。TKE發(fā)行版本修復(fù)了該問題,提交社區(qū)PR:【https://github.com/kubernetes/kubernetes/pull/90260】
2.修復(fù)刪除Pod后立即創(chuàng)建并調(diào)度到同一個(gè)節(jié)點(diǎn)可能導(dǎo)致無法掛載成功的問題
K8s statefulset pod在刪除后重新創(chuàng)建,如果pod調(diào)度到同一個(gè)節(jié)點(diǎn),會(huì)因?yàn)榫頀燧d失敗而導(dǎo)致啟動(dòng)失敗。TKE發(fā)行版修復(fù)了該問題,提交社區(qū)PR:【https://github.com/kubernetes/kubernetes/pull/72914】
3.修復(fù)CentOS下創(chuàng)建容器會(huì)導(dǎo)致cgroup泄露的問題
TKE發(fā)行版關(guān)閉了kernel memory accouting以避免cgroup泄露。
4.修復(fù)kubectl describe deployment <xxx> NewReplicaSet 顯示為 <none> 的問題
kubectl describe在獲取deployment對(duì)象后,會(huì)對(duì)volume進(jìn)行排序,有時(shí)會(huì)導(dǎo)致無法匹配到最新replicaset。TKE發(fā)行版修復(fù)了該問題,提交社區(qū)PR:【https://github.com/kubernetes/kubernetes/pull/97752】
5.修復(fù)Pod容器鏡像有多tag時(shí),Pod status鏡像tag會(huì)不匹配問題
Pod容器一鏡像有多tag時(shí),會(huì)導(dǎo)致pod spec容器鏡像tag與kubelet上報(bào)不符。TKE發(fā)行版backport社區(qū)PR修復(fù)此問題:【https://github.com/kubernetes/kubernetes/pull/94833】
6.修復(fù)aws credential provider導(dǎo)致kubelet啟動(dòng)20s延遲問題
AWS credential provider在初始化時(shí)會(huì)嘗試連接AWS元數(shù)據(jù)服務(wù),會(huì)導(dǎo)致非AWS集群出現(xiàn)最長20s啟動(dòng)延遲。TKE發(fā)行版上報(bào)了bug【https://github.com/kubernetes/kubernetes/issues/92162】
并backport社區(qū)PR【https://github.com/kubernetes/kubernetes/pull/93260】
7.修復(fù)Ubuntu16.04 lxcfs升級(jí)造成pod退出問題
K8s集群在Ubuntu16.04下默認(rèn)安裝低版本lxcfs,在對(duì)lxcfs升級(jí)后,會(huì)導(dǎo)致pod無法正常運(yùn)行。原因是低版本lxcfs掛載cgroupfs,kubelet在啟動(dòng)時(shí)會(huì)使用lxcfs已掛載cgroupfs,而非系統(tǒng)/sys/fs/cgroup。lxcfs在升級(jí)新版本后,舊cgroupfs會(huì)被解掛,導(dǎo)致kubelet對(duì)pod cgroup操作失敗。TKE發(fā)行版修復(fù)了該問題。
如何使用TKE發(fā)行版
TKE發(fā)行版提供了安裝工具腳本,幫助用戶自動(dòng)編譯和構(gòu)建發(fā)行版鏡像,極大降低了TKE發(fā)行版的使用門檻。
編譯和構(gòu)建流程包括:
1.拉取patch代碼
git clone[https://github.com/tkestack/tke-k8s-distro](https://github.com/tkestack/tke-k8s-distro)
2.編譯組件
make
或者
make \<release\>
目前支持1.20版本。
3.組件產(chǎn)出
編譯過程中,源碼路徑為_src/<release>,編譯產(chǎn)出路徑為_output/<release>,組件包括kubeadm,kube-apiserver,kube-controller-manager,kubectl,kubelet,kube-proxy,kube-scheduler。
下一步
TKE發(fā)行版的推出,使得用戶線下IDC與騰訊云上TKE的融合成為可能。我們期望TKE發(fā)行版未來能成為混合云與多云的基石,讓用戶在混合云環(huán)境中,可隨時(shí)隨地享受到和云上TKE一致的體驗(yàn)。
TKE發(fā)行版未來會(huì)以開源方式運(yùn)作,用戶可以通過GitHub提供任何反饋,不僅限于Issue和PR。
GitHub:【https://github.com/tkestack/tke-k8s-distro】