部署微服務:Spring Cloud vs. Kubernetes

Spring Cloud vs. Kubernetes,誰才是部署微服務的最佳拍檔?
Spring Cloud和Kubernetes都聲稱自己是開發和運行微服務的最佳環境,但兩者在特性上並不相同,解決的問題點也不一樣。本文將探討這兩種平台對於微服務架構的交付有何作用、兩者在哪些方面表現更好以及如何利用這兩種平台在微服務架構的路上取得成功。

背景故事

我最近拜讀了A.Lukyanchikov關於如何利用Spring CloudDocker搭建微服務的文章68,推薦大家也看一看。
想要搭建一個可以十倍、百倍擴展服務的彈性伸縮微服務系統,需要藉助具有寬泛構建時間和運行時能力的工具集進行集中的管理和治理。
Spring Cloud包括了各種功能性服務(如統計服務,帳戶服務和通知服務)和支持基礎設施服務(如日誌分析,配置服務器,服務發現,授權服務)。
下圖展示使用Spring Cloud的微服務架構:


Spring Cloud微服務架構,by A. Lukyanchikov )
該圖展示了運行時的方方面面,但沒有包括打包、持續集成、伸縮、高可用和自我修復等在微服務架構中重要點。本文假設大多數JAVA開發者熟悉Spring Cloud,採用類比的形式,通過解決以上要點問題,帶大家了解KubernetesSpring Cloud之間的關係。

微服務要點

我們在此不進行特性的逐個對比,而是從大面上看一看微服務的要點並聊一聊Spring CloudKubernetes如何實現。
微服務架構的一大優勢是易於理解的架構風格,可實現強大的模塊邊界,並且具有獨立的部署和技術多樣性,但需要付出的代價也是顯而易見的——開發分佈式系統的成本和運維開銷。
而微服務架構能否成功實踐,利用各種工具解決潛在問題是關鍵。把啟動過程變得快速簡單很重要,但通往生產環境的旅程是漫長的,你需要不斷進步才能成功。


上圖是需要在微服務架構中最常見的技術要點(在這裡,我們不涉及那些非技術要點,比如組織結構、公司文化等等)

技術對比

Spring CloudKubernetes有很大的不同,並沒有直接可比的特性,如果對照微服務架構的要點,可以得出如下的技術對比圖表:

從上表我們可以得知:
  • Spring Cloud有一套豐富且集成良好的JAVA庫,作為應用棧的一部分解決所有運行時問題。因此,微服務本身可以通過庫和運行時代理解決客戶端服務發現、負載均衡、配置更新、統計跟踪等。工作模式就像单实例服务集群譯者註:集群中master節點工作,當master掛掉後,slave節點被選舉頂替。)並且一批工作也是在JVM中被管理。
  • Kubernetes是多語言的,不僅僅針對Java平台,而是以通用的方式為所有語言解決分佈式計算問題。Kubernetes提供了配置管理、服務發現、負載均衡、跟踪、統計、單實例、平台級和應用棧之外的調度工作。該應用不需要任何客戶端邏輯的庫或代理程序,可以用任何語言編寫。
  • 兩個平台依靠相似的第三方工具,如ELKEFK stacks, tracing libraries等。HystrixSpring Boot等庫,在兩個環境中都表現良好。很多情況下,Spring CloudKubernetes可以形成互補,組建出更強大的解決方案(例如KubeFlix 31Spring Cloud Kubernetes 41)。

微服務需求

想要進一步理解Spring CloudKubernetes的適用範圍,可以參考下圖微服務架構需求。


有些需求,Spring Cloud表現更好,有需求則是Kubernetes,也有些需求,兩者可以用不同的方式滿足。好消息是,Spring CloudKubernetes在使用上並不衝突。例如,Spring Cloud提供Maven插件來創建單獨JAR應用程序包。結合Docker、Kubernetes的聲明式部署和調度能力,輕鬆運行微服務。同樣,Sring Cloud以應用程序內的包裝庫的形式來支持彈性伸縮,微服務容錯使用Hystrixbulkhead和斷路器模式)與Ribbon(負載均衡)。但這些是不夠的,當組合Kubernetes健康檢查、程序重啟和自動伸縮能力,微服務才真正變成一個強壯的系統。

優缺點

Spring Cloud
Spring Cloud為開發者提供了快速構建分佈式系統中的一些常見模式的工具,例如配置管理,服務發現,斷路器,路由等。它是為Java開發人員使用,構建在Netflix OSS庫之上的。
優點
  1. Spring Platform提供的統一編程模型和Spring Boot的快速應用程序創建能力,為開發人員提供了很好的微服務開發體驗。使用很少的註解,就可以創建一個配置服務器或獲得客戶端庫來配置您的服務。
  2. 豐富的庫支持,覆蓋大多數運行時需求。Spring Cloud的所有庫均由JAVA編寫,提供多特性、高控制和易配置。
  3. 不同的Spring Cloud庫彼此完全兼容。例如,Feign客戶端還將使用Hystrix用於斷路器、Ribbon用於負載均衡請求。一切都是註解驅動的,易於Java開發者開發。
缺點
  1. 僅使用JAVA,既是Spring Cloud的優點,也是一大缺陷。微服務架構之所以吸引人,在於按需交換各種技術棧、庫,甚至語言的能力。這一點,Spring Cloud做不到。如果你想使用Spring Cloud/Netflix OSS基礎設置服務,例如配置管理、服務發現或者負載均衡,解決方案是不優雅的。雖然Netflix Prana項目實現了sidecar模式,顯示基於Java客戶類庫越過HTTP,使得用non-JVM語言編寫的應用程序存在於NetflixOSS生態系統變得可能,但它仍然不是很優雅。
  2. 除了JAVA應用程序,還有太多與開發無關的事情需要Java開發人員處理。每個微服務需要運行各種客戶端以進行配置檢索、服務發現和負載均衡。雖然很容易設置,但這並不會降低對環境的構建時間和運行的依賴性。例如,開發人員可以使用@EnableConfigServer創建一個配置服務器,但這只是開心的假象。每當開發人員想要運行單個微服務時,他們需要啟動並運行Config Server對於受控環境,開發人員必須考慮使Config Server高度可用,並且由於它可以由GitSVN支持,因此它們需要一個共享文件系統。同樣,對於服務發現,開發人員也是需要首先啟動Eureka服務器。為了創建一個受控的環境,他們需要在每個AZ上使用多個實例實現集群。可以說,開發人員除了實現所有功能外,還需要額外管理一個複雜的微服務平台。
  3. Spring Cloud目前在微服務方面覆蓋的面相對有限,開發人員還需要考慮自動化部署、調度、資源管理、過程隔離、自我修復、構建流水線等,以獲得完整的微服務體驗。對於這點,我認為拿Spring CloudKubernetes比較是不公平的,應該比較Spring Cloud + Cloud Foundry (or Docker Swarm)Kubernetes但這也意味著對於一個完整的端到端微服務體驗,Spring Cloud必須補充一個像Kubernetes這樣的應用程序平台。
Kubernetes
Kubernetes是一個用於自動化部署、擴展和管理容器化應用程序的開源系統。支持多種語言並且提供用於支持、運行、擴展和管理分佈式系統的操作系統。
優點
  1. Kubernetes是多語言且語言不敏感的容器管理平台,能夠運行雲原生和傳統的容器化應用程序。Kubernetes提供的服務(如配置管理、服務發現、負載均衡、測試指標收集和日誌聚合)可供各種語言使用。這意味著一個平台可以被多個團隊(包括使用SpringJava開發人員)使用,並提供多種用途:應​​ 用程序開發、測試環境、構建環境(源碼運行、構建服務、依賴倉庫)等。
  2. Spring Cloud相比,Kubernetes解決了更廣的微服務架構問題。除了提供運行時服務,Kubernetes也可以讓你制定環境、設置資源限制、RBAC、管理應用程序生命週期、允許自動擴容和自我修復(幾乎表現得像一個抗脆弱平台)。
  3. Kubernetes技術基於Google十五年的研發和容器管理經驗。此外,Kubernetes有近1000個貢獻者,是Github上最活躍的開源社區之一。
缺點
  1. Kubernetes是多語言的,因此它的服務是通用的,並不針對不同的平台(如Spring Cloud for JVM)進行優化。例如,配置會作為環境變量傳遞給應用程序或掛載的文件系統。它沒有像Spring Cloud Config提供的配置更新功能。
  2. Kubernetes不是一個以開發者為中心的平台,更偏向於DevOps的IT人員使用。因此,Java開發人員需要學習一些新的概念,需要學習解決問題的新方法。儘管通過MiniKuber開始一個Kubernetes開發實例很簡單,但手動安裝一個高可用的Kubernetes集群仍顯得有些複雜。
  3. Kubernetes是一個相對較新的平台(2歲),仍然在發展和成長,每個版本都添加了很多新功能,可能很難跟上。好消息是,這一點已經被考慮到了,KubernetesAPI將是可擴展和向後兼容的。

Spring Cloud和Kubernetes的最佳實踐

如你所見,Spring CloudKubernetes在核心領域都很強,並且正在其他領域努力改進。Spring Cloud可以快速使用,對開發者比較友好;而KubernetesDevOps的絕配,雖然學起來可能有點難,但是覆蓋了更廣泛的微服務技術要點。


Spring CloudKubernetes處理了不同範圍的微服務架構技術點,而且是用了不同的方法。Spring Cloud方法是試圖解決在JVM中的微服務架構要點,而Kubernetes方法是試圖讓問題消失,為開發者在平台層解決。Spring CloudJVM中非常強大,Kubernetes管理那些JVM很強大。看起來各取所長,充分利用這兩者的優勢是自然而然的趨勢了。


結合使用Spring CloudKubernetes,用Spring Cloud提供應用程序打包,DockerKubernetes提供部署和調度;Spring通過Hystrix線程池提供應用程序內隔離,Kubernetes通過資源、進程和命名空間隔離;Spring為每個微服務提供健康終端,Kubernetes執行健康檢查並且為健康服務的通信提供路由;Spring外部化且升級配置,Kubernetes給每個微服務分配配置......這樣的例子還有很多。
作者:Bilgin Ibryam 
原文:https://dzone.com/articles/deploying-microservices-spring-cloud-vs-kubernetes 52
搬運:好雨科技
為方便閱讀原文略有刪改

留言

這個網誌中的熱門文章

Json概述以及python對json的相關操作

Docker容器日誌查看與清理

利用 Keepalived 提供 VIP