劍指Kubernetes 揭祕騰訊雲的PaaS技術選型策略

歡迎你們前往 騰訊雲 +社區,獲取更多騰訊海量技術實踐乾貨哦~
本文由 騰訊雲容器技術團隊 首發於騰訊雲+社區

一、背景

Kubernetes 很火,一大批互聯網公司早已領先一步,搭建起專有的 PaaS平臺,傳統企業們看到的 Kubernetes的趨勢,亦不甘落後,在試水的道上一路狂奔……api

雖然,Kubernetes很火,並不表明能夠「上手即用」,基於 Kubernetes的容器編排也不是簡單的「拿來主義」。在容器圈,除了 Kubernetes,還存在着 Mesos、Swarm等分屬不一樣陣營的容器集羣管理工具,以及基於這些工具的多個容器雲提供商。安全

騰訊雲在 2016年末決定開發容器產品,隨後組建容器技術團隊並進行技術選型,經過對不一樣編排工具的分析對比,最終選擇 Kubernetes 做爲容器編排引擎,而且迅速在 2017 年初推出容器解決方案 CCS,爲用戶提供託管 Kubernetes 的一站式服務。服務器

隨着業務量的增長,騰訊雲容器團隊基於 Kubernetes,不停的增長和完善容器監控、日誌處理、容器 Registry 等關鍵特性,來保障用戶業務的平穩運行。在整個 2017 年的運營過程當中,管理了數千個集羣、數十萬容器,以及業務高峯期的成倍擴容。網絡

那麼,在 16年末,Kubernetes並未大熱時,騰訊云爲什麼恰恰在諸多主流的編排引擎當中選擇 Kubernetes?騰訊雲 Kubernetes架構和資源調度原理是什麼樣的?在用戶託管服務中,又爲什麼採用 Kubernetes來託管用戶 Kubernetes集羣的 Master?做爲國內最大基於 Kubernetes的容器服務提供商,騰訊雲在 Kubernetes上還有哪些應用實踐…… 本文將帶着這些疑問,爲你一一揭開騰訊雲基於 Kubernetes的 PaaS平臺神祕面紗。架構

二、爲什麼選用 Kubernetes?

容器技術無疑是近幾年最熱門的技術之一,不少公司或者行業已經把容器做爲本身的測試環境以及正式環境,正式上跑一些業務。騰訊緊隨外界技術發展的潮流,在三年以前,騰訊雲的基礎平臺部門開始容器方面的技術實踐,通過三年時間的積累,騰訊雲目前已經有不少業務跑在容器平臺上。app

在最開始的容器產品技術選型階段,騰訊雲也曾對比過 Kubernetes、Docker Swarm、 Mesos:框架

Kubernetes的核心是如何解決自動部署,擴展和管理容器化(containerized)應用程序。它支持資源調度、服務發現、服務編排、資源邏輯隔離、服務自愈、安全配置管理等。運維

Mesos是一個分佈式內核,核心理念是數據中心操做系統(DCOS),爲了解決 IaaS層的網絡、計算和存儲問題,因此 Mesos的核心是解決物理資源層的問題。它同時支持 Marathon、 Kubernetes 和 Swarm 等多種框架,Mesosphere 也是 Kubernetes 生態的一員。分佈式

Swarm:從 Docker1.12版本開始,Swarm隨 Docker一塊兒默認安裝發佈,也因爲隨 Docker引擎一塊兒發佈,無需額外安裝,配置簡單。它支持服務註冊、服務發現,內置 Overlay Network以及 Load Balancer。Swarm是與 Docker CLI很是相似的操做命令,對熟悉 Docker的人很是容易上手學習。微服務

綜上來看,每一種工具都有本身的核心理念。

可是,騰訊雲最終選擇了 Kubernetes, 如今看來這個選擇無比正確。 在技術選型上,除了編排引擎自身的核心特性,騰訊雲也主要從如下幾個方面進行了評估。

注:表格裏的材料是當初選型時調研的狀況,上述編排工具如今的特性已經有了新變化。

從整個行業來看,業界的技術架構正在大規模向微服務遷移,容器技術天生就是部署微服務的最佳方式,騰訊雲擁有海量的業務架構,而 Kubernetes 的使用讓部署大規模的微服務更加容易,這也是騰訊雲選擇 Kubernetes的主要緣由,另外騰訊雲選擇 Kubernetes還考慮了其它優點,如:

出身名門 Google,其開發和設計受到了 Google著名的 Borg系統的影響;

GitHub上關注 Kubernetes項目和提交代碼的開發者很是多,社區活躍,若是遇到問題,經過社區諮詢和解決 問題速度也會比較快。

Kubernetes能夠很好的支持有狀態的服務。

Kubernetes 是近 3 年來社區熱度最高的項目,Linux 基金會也成立了 CNCF來增強社區運做,不只對 Kubernetes 進行管理,還對相關項目進行有序的運做,保證了整個技術棧穩定和蓬勃的發展。Kubernetes技術相比Docker swarm和Mesos 學習難度更高,騰訊云爲此提供了免費容器實驗室, 幫助開發者快速入門學習kubernetes,感性趣的讀者能夠點擊【閱讀原文】瞭解詳情。

三、騰訊雲目前有哪些容器解決方案?

騰訊雲 PaaS平臺發展至今已有了豐富的容器解決方案, 包括但不限於:騰訊雲 Kubernetes託管服務、單容器實例服務、TencentHub服務、Flow Engine服務、CCI持續集成服務等,以及基於 Kuberentes 的 TensorFlow 和 Spark 解決方案,幫助用戶在使用容器解決方案的同時進行數據計算和模型訓練。

騰訊雲 Kubernetes服務:基於原生 kubernetes 提供以容器爲核心的、高度可擴展的高性能容器管理服務。騰訊雲容器服務徹底兼容原生 kubernetes API ,擴展了騰訊雲的 CBS、CLB 等 kubernetes 插件,爲容器化的應用提供高效部署、資源調度、服務發現和動態伸縮等一系列完整功能,解決用戶開發、測試及運維過程的環境一致性問題,提升大規模容器集羣管理的便捷性,幫助用戶下降成本,提升效率。

單容器實例服務:基於 Clear Linux 技術提供的單容器實例解決方案,經過單容器實例服務享受容器的便捷、虛擬機級別的隔離, 像使用虛擬機同樣如絲般順滑的來使用容器,很是試用於經過容器來進行批量計算、經過容器來快速部署我的站點。不依賴 VM的容器在配置和使用時間上更靈活,提供了一種更低成本的計算資源。目前,但容器實例服務正在內測階段。

TencentHub服務:在雲原生應用盛行的今天,僅僅提供 Git 服務或 Container 鏡像存儲的 Hub 已經沒法知足用戶在平常開發和運維過程當中的種種需求。構造支持多種文件格式、容器鏡像格式、編排方案的雲原生 Hub 能更好的下降用戶的架構向雲原生遷移。 TencentHub不只僅提供一個私有鏡像的存儲,同時提供了 Helm包、二進制文件等文件存儲。

DevOps 產品:DevOps 任務容器化、資源及執行全託管至 Kubernetes、提供給用戶一個全生命週期的 Workflow,完成容器構建、測試和部署等 DevOps 流程,支持用戶經過界面拖拽定義 Workflow ,支持 Workflow 定義文件導入等功能,和騰訊雲已有基礎服務和 DevOps 服務打通。核心引擎開源到容器社區,組件庫做爲配套功能同時開源。

四、騰訊雲是如何基於 K8S作容器集羣的管理?

騰訊雲容器服務應用編排

Kubernetes原生的方案中,基於服務粒度對系統組件進行管理,支持服務註冊發現和路由管理。對於一個服務提供多種不一樣的資源描述類型,比較經常使用的有 Deployment、Job、CronJob、Stateful、Daemonset。

騰訊雲容器服務參考社區 Helm的實現形式,在容器服務中實現了完整的應用編排管理功能。騰訊雲容器服務編排服務主要分爲配置管理,應用模板管理,基於應用的服務組管理幾個主要部分。

配置管理

配置管理是指將應用中常變的值以變量的形式替代,配置項支持多版本,方便用戶進行更新和回滾應用。關於配置管理的實現,騰訊雲支持三種實現方式:

Helm的模板文件支持變量渲染

Kubernetes的 ConfigMap中環境變量方式

Kubernetes的 ConfigMap經過 Volume方式進行數據填充

其主要做用包括:

經過提取出多個環境中不一樣的部分,支持同一套系統在多個環境中部署。

提取出服務中常常變動的部分,實現服務的靈活變動。而且經過配置文件的版本管理,能夠很好的對變動進行追溯和回滾。

經過配置項,能夠隱含的實現多個服務直接依賴關係的管理。例如:服務 A須要訪問服務 B的,通常狀況下依賴於服務 B的名稱。這種狀況下,將服務 B的名稱提取成爲一個配置項,而將配置項傳遞給服務 A。這樣在不一樣環境中,服務 B名稱的改變,服務 A能自動感知,不須要單獨修改服務 A的參數。

應用模板

應用模板包括多個服務的定義加一個默認配置,經過應用模板 +配置項的組合,方便用戶部署相同應用的不一樣環境。主要用於描述一個或多個服務的定義,服務的定義支持原生的 Yaml語法,但能夠經過 GoTemplate的方式定義對應的變量。其主要做用爲:

實現應用的快速克隆。因爲應用的相關信息已經經過對應的 Template文件進行了描述,複製應用的過程只須要針對性的修改應用的配置,其餘結構信息不須要進行改變。

應用的多環境部署。在多個環境中,實現應用的部署,也不須要關係每一個服務具體的部署信息,只須要在不一樣環境下修改環境對應的配置,便可以經過應用模板實如今新環境應用的快速部署。

更高階的功能,經過應用市場能夠下載通用的模板,快速的部署應用。例如:在 Helm(Charts)的應用市場 https://kubeapps.com/,已經打包好了 100+應用的模板文件。直接下載對應的應用模板就能夠實現應用的部署。

應用

應用包括描述多個服務以及這些服務間的相互調用依賴關係 ,方便用戶管理多個服務。應用能夠理解爲多個服務的組合,多個服務會統一進行展現,服務支持按照應用進行搜索。多個服務的配置項,統一的經過同一個配置進行管理。經過服務組的方式,管理多個服務。能夠簡化多個服務管理的複雜度。

應用中的服務支持單獨編輯,部署和更新。同時服務支持差別化比較,方便用戶查看兩次修訂之間的差別。在服務編輯時,自動提取出對應的變量,簡化配置的過程。並支持服務回滾功能,支持服務回滾到上一個版本。

用 K8S託管用戶 K8S集羣的 Master

與其餘雲服務商不一樣的是,騰訊云爲用戶管理 Master 節點,最重要的挑戰是爲了保證用戶 Kubernetes 集羣的高可用,將用戶 Kubernetes 集羣的 Master 節點的進程以容器方式運行,發揮 Kubernetes 的優點提供穩定保障。

在這個過程當中,隨着託管集羣數量的增長,Kubernetes 的 Master 節點的負載也愈來愈高,騰訊雲提供的 Kubernetes 託管服務面臨巨大的穩定性挑戰:

多集羣共享 ETCD面臨性能瓶頸、運維困難、可用性較難持續保障

大量小集羣產生 master服務器成本增長,可用性、性能較難保障

用 agent管理節點,隨集羣增長安裝包、證書、配置愈加難以維護,更新回滾困難

提供給用戶的監控與後臺使用的監控是徹底不一樣的兩套,監控對象與環境不統一,維護困難

Kubernetes爲高效運維而生,爲何運維起來卻這麼難?騰訊云爲用戶提供了高效的 Kubernetes服務,爲何本身作不到? 經過屢次的技術方案碰撞,騰訊雲最終選擇用 Kubernetes來管理 Kubernetes的方案,讓本身成爲本身的第一個用戶。

如上圖,騰訊雲將用戶集羣 Master 節點的組件所有使用容器的方式部署在一個 Kubernetes 集羣裏進行管理,最大限度的利用了容器的優點和 Kubernetes 自己的能力,經過這樣的部署方案:

用戶集羣 Master再也不獨佔雲主機,解決成本問題

健康檢查便可實現基本 HA,多副本可提供更高可用性

單個用戶集羣 Master相關數據放在同一個 namespace下

無需額外 db存儲用戶集羣版本信息

升級時備份 namespace下數據便可快速回滾

無需開發、維護額外的 agent

騰訊雲 Kubernetes高可用託管架構解析

用 K8S管理 K8S方案提及來簡單,但將用戶的全部 Master 節點的組件所有使用容器的方式部署在一個 Kubernetes 集羣裏,其實現過程也並不容易。具體到落地實踐上,騰訊雲是如何作的呢?下圖爲騰訊雲的 Kubernetes高可用託管架構。

託管服務中將整個平臺分爲控制面和數據面兩層。控制面節點中駐留的是用戶 Kubernetes 集羣的 Master 相關容器和騰訊雲容器服務的服務管理服務節點;數據面的節點是客戶運行業務的節點。

服務管理節點是由一組高可用的 Kubernetes Master 節點組成,同時包括一組高可用的 etcd 集羣。服務管理節點外的其它機器都屬於該 Kubernetes 的 Node 節點。當用戶在騰訊雲的控制檯申請一個 Kubernetes 集羣時,在這些 Node 節點上把 etcd/api-server/controller/scheduler 等 Kuberneter Master 必須組件以 Kubernetes Controller 的方式部署在集羣內,而且經過 ingress 暴露到 VPC 。用戶 Node 節點在初始化時指定要加入的 Kubernetes 集羣。

採用以上架構方案,當用戶集羣負載升高的時候,能夠快速啓動更多的容器應對訪問壓力。同時無需開發額外的 agent 管理 Master 節點,減小管理環節有效的下降運維難度。騰訊雲能夠經過容器的滾動升級,快速爲用戶升級到最新的 Kubernetes 版本,享用最新的特性。能夠方便的爲客戶部署多種版本的 Kubernetes ,甚至是用戶的定製版本。

五、如何用騰訊雲容器解決方案部署微服務?

騰訊雲 CCS解決方案介紹

微服務架構適用於構建複雜的應用,騰訊雲 CCS容器解決方案將單體式應用從不一樣緯度拆分紅多個微服務,每一個微服務的內容使用一個 Docker 鏡像管理。在功能不變的狀況,應用拆分紅了多個可管理的服務,使得每一個單體的服務更容易理解、開發和維護。

不一樣的微服務也能夠由不一樣的團隊來開發,開發團隊可自由選擇開發技術和程序語言等,每一個服務又可獨立部署、獨立擴展。例如 Web 應用程序能夠分割成一組更簡單的外部服務及多組內部服務。

小紅書基於騰訊雲的微服務改造實踐

小紅書是一家發展很是快速的公司,技術團隊在急劇增長的同時技術棧也在不斷變遷。之前小紅書的研發團隊採用的是純 Python 的技術環境,隨着業務的發展,不一樣的團隊在作 Java、Go、Node等不一樣方向嘗試 ,同時在每一年電商大促時,擴容在現有模式也很耗時耗力。爲了爲了支撐業務的發展, 小紅書利用騰訊雲的 CCS解決方案對業務系統進行微服務化改造。

在微服務改造的過程當中,小紅書基於騰訊雲容器服務搭配 Jenkins、GitLab、Prometheus 和 Spinnaker等開源組件,以最小的投入,最低的開發量快速的實現容器化微服務架構。

上圖是小紅書以前的應用上線的過程,開發向運維提需求,須要多少臺服務器,運維依據需求去作初始化並交付給開發。如今小紅書有一個運維平臺,全部服務器的部署都是由這個平臺來完成的,平臺調用騰訊雲 API 生成服務器,作環境初始化,配置監控和報警,交付給開發的是一個標準化好的服務器。

如上圖,開發者拿到服務器準備線上發佈時用 Jenkins 觸發腳本的方式:用 Jenkins 的腳本作測試,執行代碼推送。當須要新加一臺服務器或者下線一臺服務器,要去修改這個發佈腳本。 發佈流程大概爲:Jenkins 腳本先往 beta 環境發,開發者在 beta 環境裏作自測,自測環境沒有問題就全量發。

通過架構的系列微服務改造實踐,小紅書的資源利用率提升了 100%, 計算資源減小將近 1倍,穩定支撐了雙 11等大型促銷活動。除了應用於微服務架構改造,CCS解決方案也可以根據業務運行狀況,提供集羣和服務兩個層級的彈性伸縮能力,併爲持續集成與持續交付提供的高效的 DevOps 環境。

六、將來規劃

在 PaaS平臺的將來規劃上,騰訊雲將會提供更多的容器基礎解決方案,支持包括 Docker、OCI、Kata 等容器引擎和鏡像格式。同時推出更多配套的 DevOps 服務,爲用戶提供完整的 PaaS + DevOps 開發部署環境。

據悉,騰訊雲單容器實例解決方案 CIS計劃在 5 月底發佈公測,用戶能夠經過 CIS從容器 Image 當中快速建立容器實例。同時提供 DevOps 編排引擎的 Tencent Hub 的一部分已經上線,計劃將在 5 月底正式發佈公測,而在黑石上部署的 CCS 解決方案已上線。


問答
如何在已存在的Docker容器上運行命令?
相關閱讀
Docker容器技術
容器時代的DevOps部署
打破神話:容器vs虛擬機


此文已由做者受權騰訊雲+社區發佈,原文連接:https://cloud.tencent.com/developer/article/1077383?fromSource=waitui

相關文章
相關標籤/搜索