在某次內(nèi)部架構(gòu)評(píng)審會(huì)上,我遇到了一個(gè)讓人撓頭的需求:一個(gè)EKS集群,要同時(shí)跑兩套ArgoCD。平臺(tái)團(tuán)隊(duì)要自己的控制面,應(yīng)用團(tuán)隊(duì)也要自己的控制面。賬單不能翻倍,權(quán)限不能串味,配置還不能互相踩腳。這就像在同一間廚房里劃出兩塊獨(dú)立灶臺(tái),還得讓兩組廚師各炒各的菜,抽油煙機(jī)卻只有一個(gè)。
大多數(shù)ArgoCD教程的劇本都寫得一樣簡(jiǎn)單——部署ArgoCD,連上Git倉(cāng)庫(kù),創(chuàng)建應(yīng)用,收工。可一旦多個(gè)團(tuán)隊(duì)開始共享同一個(gè)Kubernetes集群,這個(gè)干凈利落的劇本立刻失去魔力。我最近就在探索這種場(chǎng)景:?jiǎn)蝹€(gè)亞馬遜EKS集群需要支撐兩個(gè)不同的ArgoCD環(huán)境。一個(gè)是平臺(tái)團(tuán)隊(duì)用的定制化ArgoCD實(shí)例,另一個(gè)是應(yīng)用團(tuán)隊(duì)用的托管ArgoCD實(shí)例。
![]()
定制化ArgoCD實(shí)例負(fù)責(zé)管理基礎(chǔ)設(shè)施組件,比如證書管理器、外部DNS、監(jiān)控以及入口控制器。托管ArgoCD實(shí)例則由應(yīng)用團(tuán)隊(duì)操作,用來(lái)部署API、前端、微服務(wù)和業(yè)務(wù)應(yīng)用。難題在于,如何讓兩個(gè)環(huán)境保持隔離,同時(shí)又共享同一個(gè)EKS集群、同一個(gè)Cognito用戶池和同一個(gè)AWS應(yīng)用負(fù)載均衡器。這個(gè)三角關(guān)系本身就充滿了矛盾。
同一屋檐下的地盤劃分
起初的想法直截了當(dāng):為什么不用一套ArgoCD搞定所有事?這個(gè)念頭只維持了幾秒鐘,更多問(wèn)題就涌上來(lái)了。責(zé)任怎么切分?怎樣防止誤操作?單點(diǎn)登錄怎么搞?成本怎么控住?這些問(wèn)題疊加在一起,構(gòu)成了一副清晰的畫面:在較大規(guī)模的環(huán)境里,一套ArgoCD會(huì)讓權(quán)限邊界模糊、所有權(quán)混亂、運(yùn)維責(zé)任纏成一團(tuán)。平臺(tái)團(tuán)隊(duì)握著基礎(chǔ)設(shè)施的閥門,應(yīng)用團(tuán)隊(duì)卻要擠在同一扇門里進(jìn)進(jìn)出出,不出事故才怪。
分割成兩套ArgoCD的動(dòng)機(jī)就在這里。設(shè)想一下,一個(gè)Kubernetes集群里住著兩支隊(duì)伍。平臺(tái)團(tuán)隊(duì)擁有證書管理器、外部DNS、監(jiān)控、入口控制器和集群插件。應(yīng)用團(tuán)隊(duì)手里捏著API、前端、微服務(wù)和業(yè)務(wù)應(yīng)用。對(duì)小型環(huán)境而言,單一ArgoCD實(shí)例確實(shí)夠用。一旦規(guī)模膨脹,不同權(quán)限、不同所有權(quán)邊界、不同運(yùn)維職責(zé)會(huì)把整個(gè)控制面攪成一鍋粥。這正是我決定把ArgoCD拆成兩塊獨(dú)立領(lǐng)地的原因。
我想要的架構(gòu)長(zhǎng)這樣:EKS集群之下,平臺(tái)團(tuán)隊(duì)的ArgoCD掛在“argocd”命名空間里,管著證書管理器、外部DNS和監(jiān)控;應(yīng)用團(tuán)隊(duì)的ArgoCD掛在“argocd-managed”命名空間里,管著前端、后端和業(yè)務(wù)應(yīng)用。上層還有統(tǒng)一的單點(diǎn)登錄、全自動(dòng)化配置、基礎(chǔ)設(shè)施即代碼,以及盡可能低的AWS開銷。這些目標(biāo)聽起來(lái)理所應(yīng)當(dāng),真搭起來(lái)才知道坑在哪。
負(fù)載均衡器上的岔路口
最終架構(gòu)的形成過(guò)程比畫圖復(fù)雜得多。開發(fā)者通過(guò)HTTPS請(qǐng)求進(jìn)入共享的AWS應(yīng)用負(fù)載均衡器,這個(gè)負(fù)載均衡器身上打著一個(gè)組名“argocd”。流量到了這里,面前出現(xiàn)兩條岔路:一條通向“argocd”命名空間,屬于平臺(tái)團(tuán)隊(duì);另一條通向“argocd-managed”命名空間,屬于應(yīng)用團(tuán)隊(duì)。兩套ArgoCD實(shí)例都運(yùn)行在同一個(gè)EKS集群內(nèi)部,彼此的邏輯隔離全靠命名空間完成,不需要額外申請(qǐng)集群資源。
這種隔離方式的關(guān)鍵在于,命名空間給出了邏輯邊界,卻沒(méi)有引入物理分裂。“argocd”和“argocd-managed”各自為政,運(yùn)行自己的控制器、處理自己的同步循環(huán)、管理自己的Git倉(cāng)庫(kù)。兩組人看到的ArgoCD界面完全不同,可它們背后的Cognito用戶池是同一個(gè)。在負(fù)載均衡器的層次上,根據(jù)組名把流量分發(fā)到對(duì)應(yīng)的服務(wù)端點(diǎn),就像郵局按信箱編號(hào)投遞信件。
不過(guò),走到這一步之前,我先掉進(jìn)過(guò)身份認(rèn)證的坑。AWS IAM Identity Center和Cognito都擺在我面前,調(diào)研過(guò)程中發(fā)現(xiàn)Identity Center的某些特性在最初階段帶來(lái)過(guò)一絲希望,但深入下去后,Cognito的集成方式與ArgoCD的認(rèn)證體系更合拍。雖然原文沒(méi)具體展開技術(shù)實(shí)現(xiàn)細(xì)節(jié),但實(shí)際情況是,Cognito最終成了兩套實(shí)例共同依賴的認(rèn)證樞紐。
搭建過(guò)程中有幾個(gè)讓我意外的時(shí)刻。第一,命名空間級(jí)別的隔離在Kubernetes里是基礎(chǔ)操作,可把它映射到ArgoCD的應(yīng)用視圖上時(shí),團(tuán)隊(duì)成員的權(quán)限邊界需要非常細(xì)致的RBAC配置才能不越界。第二,共享負(fù)載均衡器意味著路由規(guī)則必須精確到路徑級(jí)別,任何模糊匹配都會(huì)把平臺(tái)團(tuán)隊(duì)的流量誤導(dǎo)到應(yīng)用團(tuán)隊(duì)那一側(cè)。第三,兩套ArgoCD的版本升級(jí)節(jié)奏完全不同,平臺(tái)團(tuán)隊(duì)求穩(wěn),應(yīng)用團(tuán)隊(duì)追新,一條流水線要兼容兩條心跳。
隔離的代價(jià)與回報(bào)
這套架構(gòu)落地后的運(yùn)維體驗(yàn),和之前單實(shí)例時(shí)代相比,最顯著的差異在于責(zé)任歸屬的清晰度。平臺(tái)團(tuán)隊(duì)修改證書管理器配置時(shí),再也不用擔(dān)心誤觸應(yīng)用團(tuán)隊(duì)的前端部署;應(yīng)用團(tuán)隊(duì)灰度發(fā)布新API時(shí),也不會(huì)干擾到監(jiān)控棧的同步周期。兩邊各有一套獨(dú)立的Git倉(cāng)庫(kù)、獨(dú)立的同步策略、獨(dú)立的通知渠道。唯一共享的就是集群的計(jì)算資源、網(wǎng)絡(luò)層的負(fù)載均衡器,以及那個(gè)統(tǒng)一的用戶池。
成本方面,沒(méi)有增加EKS集群數(shù)量就省下了控制面費(fèi)用。兩套ArgoCD實(shí)例的運(yùn)行開銷主要集中在額外的Pod資源消耗上,而這些Pod完全可以利用集群里已有的剩余算力。至于自動(dòng)化配置,所有ArgoCD自身的安裝文件、命名空間定義、RBAC規(guī)則都存入Git倉(cāng)庫(kù),通過(guò)基礎(chǔ)設(shè)施即代碼的方式按需重建。哪怕有一天整個(gè)集群重建,只需一條流水線就能把兩套環(huán)境復(fù)原。
當(dāng)然,不是沒(méi)有教訓(xùn)。命名空間之間的網(wǎng)絡(luò)策略需要精細(xì)調(diào)試,防止某個(gè)命名空間里的Pod意外訪問(wèn)另一個(gè)命名空間里的ArgoCD API服務(wù);Cognito的回調(diào)URL配置必須同時(shí)覆蓋兩套服務(wù)的域名路徑;日志采集規(guī)則也要區(qū)分來(lái)源,否則監(jiān)控儀表盤會(huì)同時(shí)收到兩份來(lái)源不明的事件流。這些細(xì)節(jié)都是在實(shí)際運(yùn)行中一點(diǎn)點(diǎn)補(bǔ)齊的,設(shè)計(jì)階段很難全部預(yù)見。
回頭看這個(gè)探索過(guò)程,從“為什么不用一套”到“兩套怎么共存”,推動(dòng)我的不是架構(gòu)潔癖,而是團(tuán)隊(duì)規(guī)模的現(xiàn)實(shí)壓力。當(dāng)平臺(tái)團(tuán)隊(duì)和應(yīng)用團(tuán)隊(duì)各自擁有不同的職責(zé)邊界時(shí),把控制面一并拆開,反而讓協(xié)作更順暢。共享EKS集群、共享負(fù)載均衡器、共享認(rèn)證池,這些共用的部分沒(méi)有成為阻礙,反而因?yàn)槊臻g隔離和路由規(guī)則的配合,形成了一種“同一底盤、雙引擎”的奇特穩(wěn)定感。
最終的設(shè)計(jì)里,開發(fā)者的請(qǐng)求路徑很清晰:HTTPS到達(dá)共享ALB,ALB根據(jù)組名“argocd”把流量分叉,一路去往argocd命名空間,一路去往argocd-managed命名空間。Cognito用戶池在背后給兩條路徑提供統(tǒng)一的身份憑證。平臺(tái)團(tuán)隊(duì)眼里只有基礎(chǔ)設(shè)施組件,應(yīng)用團(tuán)隊(duì)眼里只有業(yè)務(wù)應(yīng)用。兩條視線在同一集群里交錯(cuò),卻互不遮擋。
特別聲明:以上內(nèi)容(如有圖片或視頻亦包括在內(nèi))為自媒體平臺(tái)“網(wǎng)易號(hào)”用戶上傳并發(fā)布,本平臺(tái)僅提供信息存儲(chǔ)服務(wù)。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.