雲原生在京東丨如何在 Kubernetes 上部署有狀態的雲原生應用?(上)

image.png
Kubernetes 的出現使得廣大開發同窗也能運維複雜的分佈式系統,它大幅下降了容器化應用部署的門檻,用戶經過它提供的 Deployment、ReplicaSet 控制器能夠方便地部署一套高可用、可擴展的分佈式無狀態服務,這類應用的特色是不在本地存儲數據,經過簡單的負載均衡策略可實現請求分發。可是愈來愈多的開發人員但願把項目中依賴的數據庫這類有狀態服務也部署到Kubernetes裏面,經過其進行編排部署,使應用與所依賴的後端存儲儘可能靠近一些,由於有狀態服務的複雜性,這一過程並不容易。git

在 Kubernetes 中有多種運行有狀態應用程序的技術,每種技術各有優缺點。本文試圖介紹在 Kubernetes 中運行有狀態應用程序的關鍵方法,並探討了在 Kubernetes 上部署有狀態的服務的幾種可行方案。github

image.png

第一種方法是將 Kubernetes 集羣與 Samba、NFS 或 GlusterFS 等傳統的存儲基礎設施集成在一塊兒,這種方法能夠輕鬆擴展到基於雲的共享文件系統,例如 Amazon EFS、Azure 文件和 Google Cloud Filestore,在這種架構中,存儲層與 Kubernetes 管理的計算層徹底脫鉤。因爲底層存儲的持久性,工做負載徹底與其分離,這使得 Pod 能夠在任何節點上進行調度,而無需定義節點親和性。數據庫

可是,這種方法對於須要高 I/O 吞吐量的有狀態工做負載並不理想。共享文件系統並不是旨在提供關係型數據、NoSQL 數據庫和其餘寫入密集型工做負載所需的 IOPS。此方法的典型應用場景應該是內容管理系統,機器學習系統和數字資產管理系統等。後端

image.png

第二種方法是經過 Kubernetes 的控制器來維護所需的配置狀態,Deployment、ReplicaSet、DaemonSet 和 StatefulSet 是一些經常使用的控制器, 其中 StatefulSet 是一種特殊的控制器。集羣工做負載一般能夠具備一個或多個主服務器和多個從服務器,大多數數據庫都設計爲在集羣模式下運行,以提供高可用性和容錯能力,有狀態的集羣工做負載持續在主服務器和從服務器之間複製數據。爲此,集羣基礎架構但願參與的實體(主從)具備一致暴露的端點,藉以可靠地同步狀態。可是在 Kubernetes 中,Pod 被設計爲臨時的,不能保證具備固定的名稱和 IP 地址。有狀態集羣工做負載的另外一個要求是持久的存儲後端,該後端具備容錯能力而且可以知足 IOPS 的需求。服務器

_Kubernetes 中引入 StatefulSet 控制器來運行有狀態的集羣工做負載,保證屬於 StatefulSet 的 Pod 具備穩定的惟一標識符,它們遵循可預測的命名約定,還支持有序、便捷的部署和擴展。_StatefulSet 中的每一個 Pod 都有一個對應的持久卷聲明(PVC),該聲明遵循類似的命名約定。當 Pod 終止並在其餘節點上從新調度時,Kubernetes 控制器將確保 Pod 與同一 PVC 關聯,以此來保證集羣的狀態。架構

因爲 StatefulSet 中的每一個 Pod 都有專用的 PVC 和 PV,所以使用共享存儲沒有特別的規定。可是能夠預期 StatefulSet 能得到快速、可靠、持久的存儲層(例如基於 SSD 的塊存儲設備)的支持,在確保將寫操做徹底提交到磁盤後,能夠從塊存儲設備中獲取常規備份和快照。典型的應用場景如 Apache ZooKeeper,Apache Kafka,MySQL,PostgreSQL 等。負載均衡

image.png

雖然用戶能夠基於 StatefulSet 在 Kubernetes 中部署運維一套高可用有狀態服務,如高 MySQL,PostgreSQL 等。但過程相對複雜,用戶既要熟悉各類 Kubernetes 資源對象,又要學習不少應用相關的操做細節,同時還需維護一套複雜的管理腳本,爲了下降在 Kubernetes 中部署複雜應用的門檻 CoreOS 公司推出了 Operator。運維

Operator 是用來打包、部署和管理須要運行在 Kubernetes 之上覆雜應用的一種方法,Operator將運維人員對軟件操做的知識代碼化,同時綜合運用 Kubernetes 中的各類資源對象來實現複雜應用的部署和運維。Operator 經過  CustomResourceDefinition(CRD)爲服務定義了新的資源對象,同時經過自定義控制器來保證應用處於預期狀態。機器學習

image.png

Operator 的工做流程可抽象成如下三個步驟:分佈式

  • Observe - 經過 Kubernetes API 觀察目標對象的狀態;
  • Analyze - 分析當前狀態與指望狀態的差異;
  • Act - 執行編排操做,將當前狀態調整爲指望狀。

因爲開源社區的推動,Operator 愈來愈普及。可是應用於各類常規服務的 Operator 成熟度各不相同,具體細節請參考 github 開源項目 awesome-operators。Operator 典型的應用場景有 MySQL 高可用集羣、TiDB 集羣、 TensorFlow 集羣、Hadoop 生態相關集羣等。

image.png

預告

下一篇咱們將以最早進的開源數據庫 PostgreSQL 爲例,介紹如何在 Kubernetes 上部署運維有狀態雲服務,敬請期待!

相關文章
相關標籤/搜索