TT 語音落地 Zadig:開源共創 Helm 接入場景,環境治理搞得定!

語言: CN / TW / HK

Zadig on Github

Zadig on Gitee

TTChat 是趣丸科技(TT語音)旗下的一款針對海外使用者的遊戲社交產品,包含實時語聊房、IM、開黑交友、賽事等一系列業務場景。團隊對雲原生技術非常推崇,加之在國內的 TT 語音產品上也有了一定的技術探索與積累,所以在新業務創立之初,我們就全面使用了 Kubernetes 與 Istio 進行服務治理。

本文作者:吳畏  TTChat 技術負責人 @趣丸

 

01 回望過去

起初在團隊規模較小的時候,我們簡單使用 GitLab CI 搭建了流水線,實現完全容器化的構建和部署,維護了開發與生產兩套環境。經過了一年多的產品迭代,團隊“創造”出了近兩百個微服務,也因為團隊規模變多,不斷產生出了協作問題,比如多分支開發與單一共享環境經常引起的服務覆蓋問題、缺少不同功能的環境以便提供給不同角色的人使用等等。這就催生出了多套環境的需求,面對如此多的服務,亟需一個合適的工具/平臺來幫助我們快速地“複製”多套新環境出來,正當我們一籌莫展的時候,我們看到了號稱具有「強大的雲原生多環境能力」的 Zadig。

02 共創之路

從去年的 10 月開始,我們開始嘗試進行 Zadig 的接入,彼時 Zadig 在使用 Kubernetes YAML 來管理與部署服務時,能夠很好的工作,而對於我們所使用 Helm Chart,卻仍然處於一個很初級的階段,加上我們自身對於 Helm Chart 使用姿勢不佳,導致在接入的過程中也遇到了許多困難。通過與 Zadig 團隊多次在廣滬兩地的面對面交流和思想碰撞,打磨出了不少針對 Helm Chart 場景的需求點

Zadig 團隊也逐漸豐富了 Helm Chart 場景的支援,我簡單列一些我認為非常能夠體現 Zadig「強大的雲原生多環境能力」的功能點:

環境全域性變數

通過該能力,我們可以結合自己的 Helm Chart 模板,為所有服務提供環境級別的 Values 覆蓋,例如:

  • 掛載公共配置至所有的 Pod 中,如特性開關配置、業務區域配置

  • Istio Virtual Service 中的 Gateway、Host 配置

  • 全域性生效的環境變數

  • 全域性注入的 annotations

環境配置

這個目前我們通常是結合環境全域性變數一起來使用的,比如用它來託管公共配置(前面提到的特性開關配置、業務區域配置等),也可以用來管理一些不適合放在服務配置中的敏感資訊(如密碼、證書)等。

環境複製

我們從 Git 中匯入的 Helm Values,其中所包含映象很可能是不可用的,或是一個非常古早的版本,建立環境後,經常面臨的問題就是服務無法啟動,或是某個服務版本過舊,無法正常工作,當時的做法是在環境建立之後,立刻執行一個工作流,對所有的服務進行重新構建,這無疑是非常消耗時間和構建資源的。環境複製功能則通過直接複製一個現有的穩定環境,從而實現快速構建新環境並且能直接投入使用,切實解決了痛點。

基於這些環境能力,我們現在能夠在短短的一二十分鐘內,快速地建立起一套擁有幾百個服務的全新環境

除了環境能力,我們在和 Zadig 的接入過程中也解決了不少非常痛的問題:

從 Git 中批量匯入:

對於擁有幾百個存量服務的業務來說,這項功能極大程度解放了雙手,最終我們可以順利地在短短的十幾分鍾內,完成所有服務的匯入可以說這是我們能夠堅持下來的一個重要原因。

服務編排:

通過管理服務的啟動順序,這項能力幫助我們有效地解決了服務部署時對配置、金鑰等強依賴的問題。此外,還可以使用 Zadig 託管部署測試環境的資料庫、Redis 等進行一些初始資料的匯入工作,這也是我們計劃中但一直還沒來得及做的事情。

03 落地與探索

在業務交付過程中,不同角色的人員對環境有著不同的訴求,例如開發人員需要一個統一的環境進行整合、聯調,測試人員需要一個獨立穩定的環境用於功能測試、驗收、實施自動化測試。

我們期望能夠結合 Zadig 的多環境管理以及可定製化的 Workflow非常快速地拉起一套完整的環境,並且儘可能實現自動化,這也是雲原生文化所非常倡導的價值觀之一。因此除了託管常規的服務之外,我們也用 Zadig 託管了很多環境所依賴的底層資源:

  • 環境啟動所依賴的 ConfigMaps、Secrets

  • 提供訪問入口配置的 Istio Gateway CR

  • 用於自動化生成 TLS 證書的 Certificate CR(結合 CertManager & Let's Encrypt)

在 TTChat 主專案中,由於服務數量較多,存在一定的環境維護成本,我們使用 Zadig 管理了 dev 和 qa 兩套標準環境。

下圖以 Zadig 為界分為了兩個部分,上半部分是業務執行時的一個視角,我們在業務架構上面使用了 istio-ingressgateway 作為七層閘道器對 TTChat App 提供了 HTTP/2 和 HTTP/3 的接入能力,因此使用了不同的域名將流量路由到不同的環境中(PS:圖中域名為示例);

下半部分則描繪了我們現階段在交付中,從程式碼提交或者合併觸發工作流,然後部署到兩套環境中的過程。圖中的紅色區域的自測環境是我們目前基於 Zadig 新發布的子環境能力進行的一項新的嘗試,希望能夠給研發人員提供更加好的開發體驗。

目前我們一共有六個活躍的專案執行在了 Zadig 之上,共計管理了 16 套開發&測試環境,近 300 個服務,每週進行數百次的構建部署,構建成功率 >96%,自接入以來累計產生的交付物 12000 多個,部署 20000 餘次。

04 期待與展望

Zadig 作為完整的持續交付方案,我們團隊目前只發揮了它不到 50% 的有效價值;現今,團隊正在進行主幹開發與主幹釋出的嘗試,我們也希望發揮 Zadig 的「測試管理」這一差異化價值,結合自身的自動化測試建設,能夠實現更加順暢的持續交付。

另外,最近的幾個版本中,出現了一些基於 Service Mesh 的非常有意思的新功能,比如執行部分服務的環境、自測(沙盒)環境。可以看到,經過了半年,我們所期待的一些餅都逐一實現出來了,這些功能的完善解決了不少我們目前面臨的痛點,可以幫助我們緩解甚至解決在大體量業務場景下,多環境管理時的高資源成本和開發者對獨立環境的訴求之間的矛盾

非常期待未來繼續與 Zadig 一起,幫助工程師更好地專注價值創造。

Zadig,讓工程師更專注創造!

歡迎加入 開源吐槽群🔥

 

Zadig on Github

Zadig on Gitee