容器的底層實作深度依賴于內核的眾多特性,如 overlay 檔案系統,namespace, cgroup 等,因此內核的功能和穩定性,在很大程度上,決定了整個容器PaaS平臺的功能和穩定性,從 TKE 上線三年多以來,上萬集群,數十萬個節點的運營經驗來看,內核問題約占所有節點問題的三分之一,
那么容器場景選擇哪個Linux版本最好呢?在騰訊云,這個答案是 Tencent Linux,

這時候大家應該會有很多的疑問,接下來的 FAQ 會盡力解答大家的疑問,
Tencent Linux是誰維護的? 基于什么發行版的?
是騰訊內核和虛擬化團隊負責維護的,Tencent Linux 2.4 基于CentOS 7, 用戶態軟體包保持與最新版 CentOS 7 兼容,CentOS 7 版本的軟體包可以直接在 Tencent Linux 2.4 中使用
Tencent Linux跟CentOS有什么區別?
關鍵的區別在內核版本,本文后面會詳細介紹, 用戶態有少量調整,如 YUM 源的配置等,詳情請參考官方介紹檔案:https://cloud.tencent.com/document/product/213/38027
內核是什么版本?
Tencent Linux 2.4 目前是4.14內核,
代碼和 rpm 包在 GitHub 可以獲取: https://github.com/Tencent/TencentOS-kernel,
年底會推出5.4版本,
Tencent Linux跟TKE的Optimized鏡像是什么關系?
它們的內核是一樣的,但Tencent Linux 2.4 是CVM公共鏡像, TKE Optimized鏡像是市場鏡像,
TKE將使用Tencent Linux2.4來替代CentOS 7.6 TKE Optimized以及Ubuntu18.04 TKE Optimized,已經在使用CentOS 7.6 TKE Optimized和Ubuntu18.04 TKE Optimized的集群還可以繼續使用,但以后新建集群將不再支持這兩種鏡像,
預計11月下旬起,TKE用戶可以自行在控制臺操作,將集群新創建的節點的OS鏡像切換為Tencent Linux2.4,操作入口如下圖(把作業系統修改為Tencent Linux2.4):

相比 CentOS 和 Ubuntu 等發行版有什么優勢?
主要優勢如下, 后文會詳細介紹:
- 經過騰訊大量內部業務多年的驗證和打磨,
- 頂級內核專家團隊的支持,
- 包含一些關鍵的性能優化和針對容器場景的定制特性,
騰訊內部業務多年的驗證和打磨
Tencent Linux 從 2010 年啟動研發,在騰訊內部已經上線運營了 10 年,總部署量已經是百萬級,在騰訊內部 Linux 系統里占比 99%,覆寫了騰訊所有的業務,同時騰訊有著國內最種類繁多的業務生態,從社交,游戲,到金融支付,AI, 安全等, 所以對底層作業系統的穩定性,性能,兼容性等都有更強的要求,
對于容器場景來講,騰訊大量核心業務幾乎已經部分或全部容器化,例如微信所有的邏輯業務全部容器化, 針對微信業務特點,進行系列優化,順利保障了每年春節的紅包高峰運營,同時在資料安全方面,也跟微信緊密合作,提供解決方案,
內核專家團隊的支持
目前有三十多位全職內核專家為這個內核版本提供支持,其中有 kvm 維護者,還有很多內核網路,存盤,cgroup,調度等各個子系統的專家,
支持力度也體現在版本更新節奏和熱補丁服務,
從版本記錄(https://github.com/Tencent/TencentOS-kernel/releases) 可以看到,從 7 月到 10 月, Tencent Linux 4.14 內核系列發布了 5 個版本,騰訊內部業務和騰訊云外部客戶碰到的絕大多數問題,都能及時得到定位和修復,
另外我們針對一些重要的修復,會提供內核熱補丁的在線修復方式,熱補丁的安裝和生效,不需要重啟機器,在不中斷客戶業務的情況下,提升客戶業務的時延 SLA,
對于漏洞修復,Tencent Linux 有著全套的熱補丁方案,包括:應用程式級熱補丁,內核級熱補丁等,每年發布 100 多個熱補丁, 大多數漏洞在一周內提供修復方案,
性能優化
Tecent Linux 在根據內部與外部的用戶在大規模落地實踐中遇到的問題,針對容器場景也做了大量性能優化,包括但不限于:
- 解決 IPVS 模式高并發場景下,連接復用引發連接例外的問題 (#81775),
- 解決 IPVS 模式在高配節點 (核數多) 下 IPVS 規則過多引發網路毛刺的問題,
- 解決在容器密集場景下(單節點上容器數量較多),cAdvisor 讀取 memcg 陷入內核態過久引發網路毛刺的問題,
- 解決大 Pod (占用核數多,單核占用高) 在高配節點 (核數多) 場景下,CPU 負載均衡引發網路毛刺的問題,
- 解決高并發場景下的 TCP 連接監控(比如單獨部署 cAdvisor 配置監控 TCP 連接) 引發網路周期性抖動問題,
- 優化網路收包軟中斷,提升網路性能,
這些針對各種容器場景的優化效果非常顯著,以第 3 點為例,ping 時延監控效果圖如下 (11:00 之后是優化后):

容器定制特性
容器資源展示隔離
很多 golang, java 程式的高效運行依賴于正確獲取行程可用的 CPU 和記憶體資源,但這類程式在容器中獲取到的是節點的 CPU 和記憶體資源, 與實際容器所分配的資源并不匹配,往往會造成行程的執行緒池等引數不合理,從而帶來問題,
社區主流的解決方案是通過部署 FUSE 實作的 LXCFS 來實作/proc/cpuinfo, /proc/meminfo等資源展示按容器隔離,這個方案需要在節點部署 LXCFS 檔案系統, 也需要往 POD sepc 中插入相關 volume 和掛載點的配置,詳情可以參考:Kubernetes Demystified: Using LXCFS to Improve Container Resource Visibility
Tencnet Linux內核中實作了類似 LXCFS 特性,用戶無需在節點部署 LXCFS 檔案系統, 也無需修改 POD spec,只需在節點開啟一個全域開關(sysctl -w kernel.stats_isolated=1), 容器中讀取 /proc/cpuinfo, /proc/meminfo 等檔案獲取的就是按容器隔離的,就是這么簡單,
另外,考慮到有些特殊容器, 比如節點監控組件, 可能就是需要讀取節點級的資訊,為了解決這個問題,專門增加了容器級的開關kernel.container_stats_isolated,在主機級開關開啟的情況下,只需要在容器的啟動腳本里面,關閉容器級的開關(sysctl -w kernel.container_stats_isolated=0),以后在這個容器里面讀取 /proc/cpuinfo, /proc/meminfo 等檔案獲取的就是主機的資訊了,(注: 容器級開關必須在容器中設定,才能對本容器生效)
請參考詳細使用檔案:容器內CPU、記憶體、行程、磁盤等資訊隔離
更多內核引數的隔離
- net.ipv4.tcp_max_orphans
- net.ipv4.tcp_workaround_signed_windows
- net.ipv4.tcp_rmem
- net.ipv4.tcp_wmem
- vm.max_map_count
這些內核引數都是業務經常需要定制修改的,但是社區內核里面并沒有對這些引數做 namespace 化隔離,一個容器對以上引數的修改,會對主機以及所有其他容器都起作用, Tencent Linux根據內外部客戶的需求,實作了這些內核引數的 namespace 化隔離,業務容器可以放心的對這些引數進行個性化設定而不用擔心對其他業務的干擾了,
容器預設內核引數優化
在高并發的情況下,可能會發生半連接佇列滿而丟包, 可以通過調大 net.core.somaxconn 來緩解問題,但是容器網路 namespace 里面的 net.core.somaxconn 預設值只有 128,而且是代碼寫死的, 在 Tencent Linux 內核中,我們把這個預設值調整到 4096, 從而可以減少高并發情況下半連接佇列滿的丟包問題,
在 TKE 如何使用 Tencent Linux
如果希望 TKE 集群的節點使用 Tencent Linux 的作業系統,需要在創建 TKE 集群時,作業系統選擇 Tencent Linux 的:

注: Tencent Linux 除了支持普通的云服務器機型外,還支持黑石物理機與 Nvidia GPU 的機型,
參考資料
- Tencent Linux 官方介紹檔案
- Tencent Linux 內核代碼
- 容器資源展示隔離使用檔案
【騰訊云原生】云說新品、云研新術、云游新活、云賞資訊,掃碼關注同名公眾號,及時獲取更多干貨!!
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/212100.html
標籤:其他

