一文詳解 kubernetes 5種常見釋出模式如何選擇

Kubernetes面向通用場景提供了非常靈活的應用管理和運維方式,而作為雲效CI/CD平臺的開發同學,在日常和使用者交流過程中,我們經常會被使用者問到關於釋出的問題,比如不同職能團隊之間應該如何配合、釋出的最佳實踐應該是什麼樣子的等等。

今天我們就來聊聊Kubernetes下應用釋出方式的選擇,每種釋出模式適合什麼樣的場景,以及如何在雲效上高效落地。

Kubernetes應用

首先我們來看看一般情況下Kubernetes是如何管理應用的。 Kubernetes透過宣告式的API,並提供了一系列的資源來滿足各種各樣的應用運維場景:

從應用的角度我們會關注應用容器(Pod),應用配置(ConfigMap/Secret),應用需要持久化的資訊(Volume),應用與應用之間的服務發現(Service),以及如何將應用服務暴露給叢集外的使用者(Ingress)等。

從叢集運維的角度看,由於應用執行在叢集中我們需要控制應用在叢集中的許可權(ServiceAccount/ClusterRole/Role)使得應用能夠以最小所需許可權原則在叢集中執行,同時運維要管理和配置叢集的儲存資源(PV/PVC),同時對於資源有限的情況我們還需要管理和控制應用本身的資源暫用以及配額(quata)等等等。

一文詳解 kubernetes 5種常見釋出模式如何選擇

而在實際場景中由於應用使用的框架(Doubbo/Spring Cloud)的不同,應用對外提供的服務場景不同(後端或者前端),不同的應用可能只需要關注其中的一小部分資源比如當你採用了像Spring Cloud或者Doubbo這類自帶了服務發現的應用開發框架,你可能並不關心Kubernetes所提供的服務發現能力(Service),只需要透過Deployment來部署和管理這些應用例項。又比如說如果你採用了單獨的配置管理中心,那ConfigMap/Secret這些可能也不會出現在你的Kubernetes資源清單中。又比如說,如果是一個面向使用者前端應用,在應用部署是除了Deployment例項以外,你還要關係如何將這個服務暴露給外部使用者,這是就需要相應的Ingress以及Service的資源來描述。

同時在單個應用在整個系統中所處的位置不同又會導致我們對於釋出的驗證方式也會產生差異,比如一個後端微服務的釋出,我們可能只需要確保釋出過程系統不中斷即可,而對於前端應用我們可能希望釋出能夠現在一小部分使用者上進行驗證,在線上流量充分測試後,再完成整個版本升級。

如上所示,對於應用而言採用的技術架構不同,提供的服務的方式不同,對釋出驗證方式要求的不同都會導致Kubernetes的使用上產生各種各樣的差異,而云效為了能夠支援這些不同的差異提供了多種多樣的釋出模式,接下來我們就來看看雲效下常用的這些釋出模式,以及他們所適用的場景。

Kubernetes釋出模式

最原生:YAML釋出

顧名思義,這是我們在使用Kubernetes時最直接的應用部署方式,而在持續交付流水線中我們一般將這些用於描述Kubernetes資源的YAML檔案透過Git進行統一版本管理,透過雲效CI/CD平臺監聽程式碼庫的變更事件,並透過流水線將這些YAML變更同步到叢集當中。這種方式也被稱為GitOps模式。

在雲效當中,我們除了支援直接同步YAML到Kubernetes叢集以外,還擴充套件了基本的模板能力,你可以透過在YAML檔案中定義變數佔位符如${IMAGE},透過流水線執行是透過Docker映象構建或者阿里雲映象倉庫觸發器(幫助文件:阿里雲映象倉庫觸發器觸發流水線),動態產生要釋出的映象版本

如下所示:

一文詳解 kubernetes 5種常見釋出模式如何選擇

YAML釋出支援任意資源型別,因此適用於如下場景:

1、開發自運維,團隊並充分理解和掌握Kubernetes原生的釋出策略,希望透過YAML完成應用的升級與釋出以及回滾,一般來說應用Git庫會包含應用原始碼,Dockerfile以及部署應用所需的所有YAML檔案(在某些情況下,YAML可能是由單獨的Git倉庫進行管理,以進行細粒度的許可權控制)。

2、基礎設施運維:運維團隊透過Git管理叢集的所有基礎設施配置,並透過流水線完成叢集的統一管理以及配置的同步

更多詳細使用介紹請參考:雲效Kubernetes YAML釋出

最簡單:映象升級

一文詳解 kubernetes 5種常見釋出模式如何選擇

在和一些雲效使用者的交流場景中,在也會有使用者希望開發團隊能夠儘可能少的理解Kubernetes相關概念,在這種情況下由專職的運維團隊負責完成應用環境的部署和初始化。而開發團隊只負責完成程式碼開發,並透過流水線自動化完成應用映象構建,並使用該映象對叢集中已有的應用進行升級。開發團隊只關心應用的工作負載例項資源。

如下圖所示,在雲效流水線中我們監聽應用程式碼庫的變化,並構建出相應的Docker映象,而釋出階段只需要指定對叢集中例項並關聯前序任務產生的映象即可完成應用的升級釋出:

一文詳解 kubernetes 5種常見釋出模式如何選擇

如上所述,該場景適用於:

開發和運維分離:運維團隊充分理解Kubernetes的原生髮布策略,開發團隊只負責產出程式碼以及應用映象,由運維團隊負責叢集中應用的實際運維管理。

關於如何在雲效中使用映象升級能力,請參考:雲效Kubernetes映象升級

過程可控:分批發布

在前面兩個小結中,我們都強呼叫戶需要充分理解Kubernetes的原生髮布策略,Kubernetes原生的釋出策略主要是指RollingUpdate模式,使用者透過宣告升級策略,如maxSurge和maxUnavailable控制Pod的啟動策略以及最大不可用Pod數,來確保即使應用釋出出現異常的情況,也能保證服務的基本可用。

一文詳解 kubernetes 5種常見釋出模式如何選擇

除此,由於應用啟動往往有一定的耗時,如果使用了Kubernetes的服務發現機制,我們還需要配置如liveness以及readiness探針,來避免應用還在啟動過程中就有不在計劃內的流量進入到正在啟動的例項當中。同時整個釋出過程是不可逆的,假如認定當前釋出出現了異常我們只能透過重新發布的方式來使應用回到可用狀態。

一文詳解 kubernetes 5種常見釋出模式如何選擇

而在雲效的分批發布中,我們以Service為最小發布單元,在釋出開始階段我們將基於新版映象創建出應用的版本V2,並根據當前應用的副本總數以及分批數量,對新舊兩個版本的應用例項分別進行縮容和擴容,來控制實際進入到新版應用的流量比例,從而可以實現小規模的釋出驗證,在對釋出進行充分驗證後再逐步完全下線老版應用。

同時批次之間支援暫停和手動恢復讓使用者可以充分對針對釋出過程進行控制。

一文詳解 kubernetes 5種常見釋出模式如何選擇

該模式適用於:採用Kubernetes原生的服務發現機制,並希望獲得相比於原生Kubernetes釋出更好過程控制性以及安全性的使用者。

更多詳細使用介紹,請參考幫助文件:雲效Kubernetes分批發布

外部流量可控:Ingress灰度釋出

相比於分批發布灰度釋出更強調更加可控和安全的線上驗證。而灰度釋出在Kubernetes中由於應用的部署模式的不同大致分為兩種,我們首先來說第一種,基於Ingress的灰度釋出,如下所示,我們透過Ingress將叢集內的服務暴露給外部使用者:

一文詳解 kubernetes 5種常見釋出模式如何選擇

在釋出過程中我們希望能夠透過cookie或者header的方式使得特定的使用者或者開發人員,能夠在線上對新版本引用進行驗證,經過小部分可控的線上流量驗證後,我們的釋出可靠性更好,如果出現預期外的問題,也可以快速回滾,並且整個灰度驗證過程對非灰度使用者完全不可感知。

一文詳解 kubernetes 5種常見釋出模式如何選擇

在雲效流水線的Ingress灰度釋出中,我們以Ingress作為釋出單元,當觸發部署後,將會根據當前Ingress以及其關聯的Service/Deployment資源,基於新版映象創建出V2版本的Service/Deployment。並透過Nginx Ingress的Annoation完成對流量規則宣告,從而確保只有滿足特定特徵的流量才能進入到V2版本中,當處於灰度狀態時,流水線將會等待人工驗證,以觸發釋出或者或者回滾操作。

一文詳解 kubernetes 5種常見釋出模式如何選擇

關於如何在雲效流水線中使用灰度釋出請參考幫助文件:雲效Nginx Ingress灰度釋出

該模式適用於:採用Ingress對外暴露應用服務,並且希望能夠透過灰度的方式對釋出進行驗證

內部流量可控:Istio/ASM灰度釋出

而在微服務的場景中,並不是所有的服務都需要直接暴露給外部使用者,如下所示:

一文詳解 kubernetes 5種常見釋出模式如何選擇

當採用微服務架構,我們大部分的後端服務是隻暴露與叢集內,微服務之間透過Kubernetes Service進行相互訪問,在這種情況下,當採用灰度釋出模式時,我們需要在Service級別進行流量控制,已確保指定的流量才進入到灰度的鏈路而不對正常使用者產生影響。

一文詳解 kubernetes 5種常見釋出模式如何選擇

不過由於Kubernetes原生在Service級別並不支援任何的流量控制規則,因此我們需要在叢集中部署Istio或者採用阿里雲ServiceMesh來對服務之間的流量進行細粒度的控制。

一文詳解 kubernetes 5種常見釋出模式如何選擇

如下圖所示,當使用Kubernetes藍綠髮布模式時,可以設定灰度流量規則,從而只有當請求中包含指定的Cookie配置的請求轉發到灰度版本當中:

一文詳解 kubernetes 5種常見釋出模式如何選擇

該模式適用於:採用Istio或者阿里雲ServiceMesh的Kubernetes使用者,並且希望能夠透過灰度的方式對釋出進行驗證。

小結

在本文中,我們主要介紹了Kubernetes實際中的各種釋出模式以及相關的適用場景,希望能夠幫助使用者快速找到適合自己的釋出模式,當然如果你還有更多更好的交付實踐,也可以在留言中進行分享。作者:鄭雲龍,阿里云云效技術專家

相關文章