背景為了降低 EMQX 在 Kubernetes 上的部署、運(yùn)維成本,我們將一些日常運(yùn)維能力進(jìn)行總結(jié)、抽象并整合到代碼中,以 EMQX Kubernetes Operator 的方式幫助用戶實(shí)現(xiàn) EMQX 的自動(dòng)化部署和運(yùn)維。 此前,EMQX Kubernetes Operator v1beta1、v1beta2、v1beta3 的升級(jí)策略均為滾動(dòng)升級(jí),相關(guān)升級(jí)流程如下: ![]() 問題分析滾動(dòng)升級(jí)在生產(chǎn)環(huán)境中可能會(huì)面臨以下問題:
如果上面幾個(gè)步驟的問題疊加(多次斷連與大量斷連的客戶端不停的重試連接),則可能會(huì)放大客戶端重連的規(guī)模,從而造成服務(wù)端過載或雪崩。 下圖是在現(xiàn)有升級(jí)模式下連接數(shù)的監(jiān)控圖(在不同的業(yè)務(wù)中會(huì)存在差異,比如后端依賴的不同資源、服務(wù)器配置、客戶端重連或重試策略等,均會(huì)帶來一些不同的影響)。其中:
![]() 在上圖中,當(dāng)我們開始執(zhí)行滾動(dòng)升級(jí)時(shí),首先 emqx-ee-a-emqx-ee-2 進(jìn)行銷毀,并創(chuàng)建新的 emqx-ee-b-emqx-ee-2,此時(shí)僅有 emqx-ee-a-emqx-ee-1、emqx-ee-a-emqx-ee-0 能夠提供服務(wù),當(dāng)客戶端進(jìn)行重連時(shí),LB 會(huì)將流量轉(zhuǎn)移到 emqx-ee-a-emqx-ee-0、emqx-ee-a-emqx-ee-1 上面,因此我們能夠看到 emqx-ee-a-emqx-ee-1、emqx-ee-a-emqx-ee-0 有明顯的流量上升,當(dāng)后面更新這兩個(gè) pod 時(shí),意味著客戶端可能多次斷連。由于新 pod 建立的過程存在著時(shí)間差,以上圖為例,emqx-ee-a-emqx-ee-0 最后升級(jí),當(dāng)升級(jí)完成后,可能客戶端已經(jīng)完成重試、重連,此時(shí)主要連接已經(jīng)被另兩個(gè) pod 接納,因此會(huì)導(dǎo)致 pod 之間流量不均衡,從而影響到用戶業(yè)務(wù)模型的評(píng)估,或者影響到服務(wù)。 為了方便展示,我們未壓測大量連接模擬重連、導(dǎo)致服務(wù)端過載的場景(在實(shí)際生產(chǎn)環(huán)境中可能遇到,TPS 超過云端規(guī)劃的容量模型),但從連接數(shù)監(jiān)控圖上,我們依然看到一個(gè)大缺口,說明對(duì)業(yè)務(wù)產(chǎn)生了較大影響。因此我們需制定一種方案來規(guī)避以上幾個(gè)問題,保障升級(jí)過程中的平滑穩(wěn)定。 問題解決目標(biāo)
方案設(shè)計(jì)藍(lán)綠發(fā)布是一種同時(shí)運(yùn)行兩個(gè)版本應(yīng)用的發(fā)布策略。EMQX Kubernetes Operator 近日在 2.1.0 版本中實(shí)現(xiàn)了 EMQX Enterprise 的藍(lán)綠發(fā)布,即從現(xiàn)有的 EMQX Enterprise 集群開始,創(chuàng)建一套新版本的 EMQX Enterprise 集群,在這一過程中不停止掉老版本,等新版本集群運(yùn)行起來后,再將流量逐步平滑切換到新版本上。 從 4.4.12 版本開始,EMQX 企業(yè)版本支持節(jié)點(diǎn)疏散功能。節(jié)點(diǎn)疏散功能允許用戶在關(guān)閉節(jié)點(diǎn)之前強(qiáng)制將連接和會(huì)話以一定速率遷移到其他節(jié)點(diǎn),以避免節(jié)點(diǎn)關(guān)閉帶來的會(huì)話數(shù)據(jù)丟失。
在 Kubernetes 上我們通過模擬藍(lán)綠發(fā)布以及結(jié)合節(jié)點(diǎn)疏散功能,實(shí)現(xiàn)了連接可控遷移,極大減少了斷連的次數(shù)(僅斷連一次)。相關(guān)升級(jí)流程圖如下: ![]() 整個(gè)升級(jí)流程大致可分為以下幾步:
操作流程節(jié)點(diǎn)疏散是 EMQX Enterprise 4.4.12 開始支持的新特性,EMQX Kubernetes Operator 在 2.1 版本中對(duì)該能力進(jìn)行適配,如需使用該能力,請(qǐng)將 EMQX 升級(jí)到企業(yè)版 v4.4.12,EMQX Kubernetes Operator 升級(jí)到 v2.1。
apiVersion: apps.emqx.io/v1beta4 initialDelaySeconds:所有的節(jié)點(diǎn)就緒后(藍(lán)綠節(jié)點(diǎn)),開始節(jié)點(diǎn)疏散前的等待時(shí)間 (由于切換 Service 后,LoadBalancer 需要時(shí)間來處理 service 與 pod 的關(guān)系)(單位:秒) waitTakeover:所有連接斷開后,等待客戶端重連以接管會(huì)話的時(shí)間(單位:秒) connEvictRate:客戶端每秒斷開連接速度 sessEvictRate:waitTakeover之后每秒會(huì)話疏散速度 詳情可參考:Operator 文檔 升級(jí)過程中連接數(shù)監(jiān)控圖如下(本次測試以 10 萬連接進(jìn)行): ![]() sum:總的連接數(shù),圖中最上面的一條線 emqx-ee-86d7758868:前綴表示的是升級(jí)前的 3 個(gè) EMQX 節(jié)點(diǎn) emqx-ee-745858464d:前綴表示升級(jí)后的 3 個(gè) EMQX 節(jié)點(diǎn) 如上圖,我們通過 EMQX Kubernetes Operator 的藍(lán)綠發(fā)布在 Kubernetes 中實(shí)現(xiàn)了優(yōu)雅升級(jí),通過該方案升級(jí),總連接數(shù)未出現(xiàn)較大抖動(dòng)(取決于遷移速率、服務(wù)端能夠接收的速率、客戶端重連策略等),能夠極大程度保障升級(jí)過程的平滑,有效防止服務(wù)端過載,減少業(yè)務(wù)感知,從而提升服務(wù)的穩(wěn)定性。
結(jié)語通過采用節(jié)點(diǎn)疏散功能結(jié)合模擬藍(lán)綠發(fā)布,本文所提供的方案解決了普通升級(jí)導(dǎo)致的多次斷連和可能的服務(wù)過載與負(fù)載不均問題,實(shí)現(xiàn)了在 Kubernetes 上優(yōu)雅的升級(jí)。 作為一個(gè)自動(dòng)化管理工具,EMQX Kubernetes Operator 旨在幫助用戶輕松創(chuàng)建和管理 EMQX 集群,充分享受 EMQX 的強(qiáng)大產(chǎn)品能力。通過本文方案完成 EMQX 的升級(jí),用戶可以進(jìn)一步體驗(yàn) EMQX 的最新特性,構(gòu)建創(chuàng)新物聯(lián)網(wǎng)應(yīng)用。
|
|