容器場景要選擇什麼 Linux 版本?
阿新 • • 發佈:2020-11-12
容器的底層實現深度依賴於核心的眾多特性,如 overlay 檔案系統,namespace, cgroup 等,因此核心的功能和穩定性,在很大程度上,決定了整個容器PaaS平臺的功能和穩定性。從 TKE 上線三年多以來,上萬叢集,數十萬個節點的運營經驗來看,核心問題約佔所有節點問題的三分之一。
那麼容器場景選擇哪個Linux版本最好呢?在騰訊雲,這個答案是 [Tencent Linux](https://cloud.tencent.com/document/product/213/38027)。
![](https://img2020.cnblogs.com/other/2041406/202011/2041406-20201112105409499-737434735.png)
這時候大家應該會有很多的疑問,接下來的 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`):
![](https://img2020.cnblogs.com/other/2041406/202011/2041406-20201112105409802-64430838.png)
#### 相比 CentOS 和 Ubuntu 等發行版有什麼優勢?
主要優勢如下, 後文會詳細介紹:
1. 經過騰訊大量內部業務多年的驗證和打磨。
2. 頂級核心專家團隊的支援。
3. 包含一些關鍵的效能優化和針對容器場景的定製特性。
## 騰訊內部業務多年的驗證和打磨
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 在根據內部與外部的使用者在大規模落地實踐中遇到的問題,針對容器場景也做了大量效能優化,包括但不限於:
1. 解決 IPVS 模式高併發場景下,連線複用引發連線異常的問題 ([#81775](https://github.com/kubernetes/kubernetes/issues/81775))。
2. 解決 IPVS 模式在高配節點 (核數多) 下 IPVS 規則過多引發網路毛刺的問題。
3. 解決在容器密集場景下(單節點上容器數量較多),cAdvisor 讀取 memcg 陷入核心態過久引發網路毛刺的問題。
4. 解決大 Pod (佔用核數多,單核佔用高) 在高配節點 (核數多) 場景下,CPU 負載均衡引發網路毛刺的問題。
5. 解決高併發場景下的 TCP 連線監控(比如單獨部署 cAdvisor 配置監控 TCP 連線) 引發網路週期性抖動問題。
6. 優化網路收包軟中斷,提升網路效能。
這些針對各種容器場景的優化效果非常顯著,以第 3 點為例,ping 時延監控效果圖如下 (11:00 之後是優化後):
![](https://img2020.cnblogs.com/other/2041406/202011/2041406-20201112105410042-1558674847.png)
## 容器定製特性
#### 容器資源展示隔離
很多 golang, java 程式的高效執行依賴於正確獲取程序可用的 CPU 和記憶體資源。但這類程式在容器中獲取到的是節點的 CPU 和記憶體資源, 與實際容器所分配的資源並不匹配,往往會造成程序的執行緒池等引數不合理,從而帶來問題。
社群主流的解決方案是通過部署 FUSE 實現的 LXCFS 來實現/proc/cpuinfo, /proc/meminfo等資源展示按容器隔離。這個方案需要在節點部署 LXCFS 檔案系統, 也需要往 POD sepc 中插入相關 volume 和掛載點的配置。詳情可以參考:[Kubernetes Demystified: Using LXCFS to Improve Container Resource Visibility](https://dzone.com/articles/kubernetes-demystified-using-lxcfs-to-improve-cont)
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、記憶體、程序、磁碟等資訊隔離](https://github.com/Tencent/TencentOS-kernel/wiki/container-resource-view-isolation)
#### 更多核心引數的隔離
- 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` 的:
![](https://img2020.cnblogs.com/other/2041406/202011/2041406-20201112105410245-294964212.png)
> **注:** Tencent Linux 除了支援普通的雲伺服器機型外,還支援黑石物理機與 Nvidia GPU 的機型。
## 參考資料
- [Tencent Linux 官方介紹文件](https://cloud.tencent.com/document/product/213/38027)
- [Tencent Linux 核心程式碼](https://github.com/Tencent/TencentOS-kernel)
- [容器資源展示隔離使用文件](https://github.com/Tencent/TencentOS-kernel/wiki/container-resource-view-isolation)
>【騰訊雲原生】雲說新品、雲研新術、雲遊新活、雲賞資訊,掃碼關注同名公眾號,及時獲取更多幹貨!!
![](https://img2020.cnblogs.com/other/2041406/202011/2041406-20201112105410637-162606