本文發表於一年多前。舊文章可能包含過時內容。請檢查頁面中的資訊自發布以來是否已變得不正確。
京東從 OpenStack 轉向 Kubernetes 的內幕
編者按:今天的文章由京東基礎設施平臺部門團隊撰寫,講述了他們從 OpenStack 過渡到 Kubernetes 的過程。京東是中國最大的公司之一,也是第一家進入全球財富500強的中國網際網路公司。
叢集建設歷程
物理機時代 (2004-2014)
2014年之前,我們公司的應用都部署在物理機上。在物理機時代,應用上線資源分配平均需要等待一週時間。由於缺乏隔離,應用之間會相互影響,導致許多潛在風險。當時,每臺物理機上的 tomcat 例項平均不超過九個。物理機資源嚴重浪費,排程不靈活。由於物理機故障,應用遷移需要數小時。並且無法實現自動擴縮容。為了提高應用部署效率,我們開發了編譯打包、自動化部署、日誌收集、資源監控等系統。
容器化時代 (2014-2016)
2014年秋,由京東首席架構師劉海峰領導的基礎設施平臺部門 (IPD) 尋求新的解決方案。Docker 進入了我們的視野。當時 Docker 正在興起,但略顯稚嫩,在生產環境中缺乏經驗。我們反覆測試了 Docker。此外,Docker 也被定製化以解決一些問題,例如裝置對映器導致的系統崩潰和一些 Linux 核心 bug。我們還向 Docker 中添加了許多新功能,包括磁碟限速、容量管理以及映象構建中的分層合併等。
為了妥善管理容器叢集,我們選擇了 OpenStack + Novadocker 驅動的架構。容器被當作虛擬機器進行管理。這被稱為京東第一代容器引擎平臺——JDOS1.0 (JD Datacenter Operating System)。JDOS 1.0 的主要目的是將基礎設施容器化。自那時起,所有應用程式都執行在容器中,而不是物理機上。至於應用程式的運維,我們充分利用了現有工具。開發人員在生產環境中請求計算資源的時間從一週縮短到幾分鐘。計算資源池化後,即使是擴容1000個容器也能在幾秒內完成。應用例項之間相互隔離。應用平均部署密度和物理機利用率都提高了三倍,帶來了巨大的經濟效益。
我們在每個 IDC 部署了叢集,並提供統一的全域性 API 以支援跨 IDC 部署。在我們的生產環境中,單個 OpenStack 分散式容器叢集最多有10,000個計算節點,最少有4,000個。第一代容器引擎平臺 (JDOS 1.0) 成功支援了2015年和2016年的“6.18”和“11.11”促銷活動。截至2016年11月,已有150,000個容器線上執行。
“6.18”和“11.11”是京東最受歡迎的兩次線上促銷活動,類似於黑色星期五促銷。2016年11月11日,完成訂單量達到3000萬。
在開發和推廣 JDOS 1.0 的實踐中,應用程式直接從物理機遷移到容器中。本質上,JDOS 1.0 是 IaaS 的一種實現。因此,應用程式的部署仍然嚴重依賴於編譯打包和自動化部署工具。然而,JDOS1.0 的實踐非常有意義。首先,我們成功地將業務遷移到容器中。其次,我們對容器網路和儲存有了深入的瞭解,並知道如何將它們打磨到最佳狀態。最後,所有這些經驗為我們開發全新的應用容器平臺奠定了堅實的基礎。
新容器引擎平臺 (JDOS 2.0)
平臺架構
當 JDOS 1.0 從2000個容器增長到100,000個時,我們推出了新的容器引擎平臺 (JDOS 2.0)。JDOS 2.0 的目標不僅僅是一個基礎設施管理平臺,而是一個面向應用的容器引擎平臺。在 JDOS 1.0 和 Kubernetes 的基礎上,JDOS 2.0 集成了 JDOS 1.0 的儲存和網路,打通了從原始碼到映象,再到部署的 CI/CD 流程。此外,JDOS 2.0 還提供日誌、監控、故障排除、終端和編排等一站式服務。JDOS 2.0 的平臺架構如下圖所示。
功能 | 產品 |
---|---|
原始碼管理 | Gitlab |
容器工具 | Docker |
容器網路 | Cane |
容器引擎 | Kubernetes |
映象倉庫 | Harbor |
CI 工具 | Jenkins |
日誌管理 | Logstash + Elastic Search |
監控 | Prometheus |
在 JDOS 2.0 中,我們定義了系統和應用兩個級別。一個系統由多個應用組成,一個應用由多個提供相同服務的 Pod 組成。一般來說,一個部門可以申請一個或多個系統,這直接對應於 Kubernetes 的名稱空間。這意味著同一個系統的 Pod 將位於同一個名稱空間中。
JDOS 2.0 的大部分元件(GitLab / Jenkins / Harbor / Logstash / Elastic Search / Prometheus)也都被容器化並部署在 Kubernetes 平臺上。
一站式解決方案
- 1.JDOS 2.0 以 Docker 映象為核心,實現持續整合和持續部署。
- 2.開發者將程式碼推送到 Git。
- 3.Git 觸發 Jenkins master 生成構建任務。
- 4.Jenkins master 呼叫 Kubernetes 建立 Jenkins slave Pod。
- 5.Jenkins slave 拉取原始碼,編譯和打包。
- 6.Jenkins slave 將軟體包和 Dockerfile 傳送到帶有 Docker 的映象構建節點。
- 7.映象構建節點構建映象。
- 8.映象構建節點將映象推送到映象倉庫 Harbor。
- 9.使用者在不同區域建立或更新應用程式 Pod。
JDOS 1.0 中的 Docker 映象主要由作業系統和應用程式的執行時軟體棧組成。因此,應用程式的部署仍然依賴於自動化部署和其他工具。而在 JDOS 2.0 中,應用程式的部署在映象構建期間完成。映象包含完整的軟體棧,包括應用程式。透過映象,我們可以實現應用程式在任何環境中按設計執行的目標。
網路和外部服務負載均衡
JDOS 2.0 採用 JDOS 1.0 的網路解決方案,該方案透過 OpenStack Neutron 的 VLAN 模型實現。該解決方案實現了容器之間的高效通訊,非常適合公司內部的叢集環境。每個 Pod 在 Neutron 中佔用一個埠,並擁有獨立的 IP。基於容器網路介面標準 (CNI),我們開發了一個新的專案 Cane,用於整合 kubelet 和 Neutron。
同時,Cane 也負責 Kubernetes 服務中 LoadBalancer 的管理。當建立/刪除/修改 LoadBalancer 時,Cane 會呼叫 Neutron 中 lbaas 服務的建立/刪除/修改介面。此外,Cane 專案中的 Hades 元件為 Pod 提供了內部 DNS 解析服務。
Cane 專案的原始碼目前正在完成,並將很快在 GitHub 上釋出。
靈活排程
JDOS 2.0 接入了包括大資料、Web 應用、深度學習等多種型別的應用,並採用了更多樣化和靈活的排程方式。在一些 IDC,我們實驗性地混合部署了線上任務和離線任務。與 JDOS 1.0 相比,整體資源利用率提高了約30%。
總結
Kubernetes 豐富的功能使我們能夠更多地關注平臺整體生態系統,例如網路效能,而不是平臺本身。特別是,SREs 高度讚賞了複製控制器功能。有了它,應用程式的擴縮容在幾秒鐘內即可完成。JDOS 2.0 目前已接入約20%的應用程式,並部署了2個叢集,每天執行約20,000個 Pod。我們計劃接入更多公司應用程式,以取代當前的 JDOS 1.0。我們也很高興與社群分享在此過程中的經驗。
感謝 Kubernetes 和其他開源專案的所有貢獻者。
——京東基礎設施平臺部門團隊
- 在 GitHub 上參與 Kubernetes 專案
- 在 Stack Overflow 上提問(或回答問題)
- 下載 Kubernetes
- 在 Slack 上與社群交流
- 在 Twitter 上關注我們 @Kubernetesio 獲取最新動態