今天我們很高興地宣布,Lyft 的基礎(chǔ)設(shè)施工具可擴(kuò)展 UI 和 API 平臺(tái)clutch已開放源代碼,clutch使工程團(tuán)隊(duì)能夠構(gòu)建、運(yùn)行和維護(hù)用戶友好的工作流,這些工作流還包含特定于域的安全機(jī)制和訪問控制。clutch兼容多種管理平臺(tái)功能(如 AWS、Envoy和 Kubernetes),強(qiáng)調(diào)可擴(kuò)展性,因此它可以為堆棧中任何組件提供托管功能。
云計(jì)算的動(dòng)態(tài)屬性顯著地降低了新基礎(chǔ)設(shè)施的采用成本。CNCF云原生計(jì)算基金會(huì)全景圖跟蹤了300多個(gè)以上開源項(xiàng)目和1000多個(gè)商業(yè)產(chǎn)品。盡管各組織們能快速采用這些項(xiàng)目和供應(yīng)商,但每種新技術(shù)都有它自帶的一套配置、工具、日志和指標(biāo)。為了讓開發(fā)者快速、安全地在整個(gè)堆棧中變更,需要在工具方面進(jìn)行大量前期和持續(xù)的投資,而大多數(shù)組織都未能考慮到這一點(diǎn)。所以,雖然新基礎(chǔ)設(shè)施越來越容易采用,但日益擴(kuò)大的新組件的規(guī)模難以管理,特別是隨著整個(gè)平臺(tái)的復(fù)雜性和工程團(tuán)隊(duì)規(guī)模的增長。Clutch解決了這一難題,通過讓基礎(chǔ)設(shè)施團(tuán)隊(duì)向他們整個(gè)工程組織提供直觀和安全的基礎(chǔ)設(shè)施管理接口。
Clutch是一年開發(fā)周期的成果,用來解決“Lyft”開發(fā)人員經(jīng)驗(yàn)和工具的短板。Clutch由兩個(gè)核心部件組成。go后端設(shè)計(jì)為可擴(kuò)展的基礎(chǔ)設(shè)施控制平面,將單個(gè)由protobuf驅(qū)動(dòng)的API拼湊成具有通用授權(quán),可觀測(cè)性和審計(jì)日志記錄的系統(tǒng)。React前端是一個(gè)可插拔并且面向工作流的UI允許用戶和開發(fā)者在單個(gè)窗格后創(chuàng)建新功能,這只需要很少的代碼和很少的JavaScript知識(shí)及更少的維護(hù)工作。
1 設(shè)計(jì)和架構(gòu)
在設(shè)計(jì)和架構(gòu)方面,比起其他解決方案,clutch提供了與眾不同的開發(fā)人員工具空間。在項(xiàng)目開始時(shí),我們?cè)跇?gòu)建自己的工具前對(duì)現(xiàn)有工具做了深入分析。采用工具的主要目的是:
?減少平均維修時(shí)間。基礎(chǔ)設(shè)施什么時(shí)候響應(yīng)告警,工程師們待命時(shí)花太多時(shí)間在閱讀runbooks和操作復(fù)雜的工具。
?消除意外中斷。當(dāng)執(zhí)行維護(hù)任務(wù)時(shí),當(dāng)用戶在使用runbook時(shí)漏掉警告或者刪除錯(cuò)誤的資源(例如,他們認(rèn)為沒有使用,但占用了很大流量的資源),從而導(dǎo)致嚴(yán)重中斷。
?強(qiáng)化細(xì)粒度的權(quán)限并以通用格式審計(jì)所有活動(dòng),一些權(quán)限過于寬泛,是因?yàn)楣?yīng)商的訪問控制不支持細(xì)粒度控件,此外,當(dāng)我們出于安全目的從各種工具收集審計(jì)日志時(shí),很難將那些數(shù)據(jù)提煉成為如何幫助我們改善工具的可執(zhí)行見解。
?提供一個(gè)極大簡化未來工具開發(fā)的平臺(tái)。以“Lyft”這樣的規(guī)模,如果不考慮團(tuán)隊(duì)外的貢獻(xiàn)資源,項(xiàng)目范圍很大時(shí)很難成功,我們沒有足夠的資源來構(gòu)建Lyft需要的每一個(gè)特性,更別說支持它了。
一開始我們看到現(xiàn)有供應(yīng)商UI的不足:由于缺乏專業(yè)化,供應(yīng)商工具很慢 (并且在某些情況下是危險(xiǎn)的)。他們需要不必要的步驟來執(zhí)行常見任務(wù),并提供超出必要的信息集。除了簡單的訪問控制外,通常很少有防護(hù),結(jié)果導(dǎo)致運(yùn)營人員可能會(huì)執(zhí)行看似無害但實(shí)際降低系統(tǒng)性能的操作。另外,他們也許不太熟悉該工具從而延誤補(bǔ)救。理想情況下,工程師每四到六周只來一次。人們很容易忘記如何使用這個(gè)工具,特別是考慮到?jīng)]有用特定的交互系統(tǒng)情況下,又去多種執(zhí)行任務(wù)。
由于碎片化和信息雜亂無序,依賴供應(yīng)商工具的后果是高認(rèn)知負(fù)荷。
相比之下,Clutch這樣一個(gè)與供應(yīng)商無關(guān)的工具能將不相關(guān)的系統(tǒng)一體化為清晰,一致的用戶體驗(yàn),并且提供專用功能來執(zhí)行常見任務(wù),只需很少的點(diǎn)擊和培訓(xùn)。
然后我們轉(zhuǎn)向開源社區(qū),發(fā)現(xiàn)開源基礎(chǔ)設(shè)施管理工具通常仍然局限于單個(gè)系統(tǒng),并不是為廣泛的自定義設(shè)計(jì)的,它并不能解決認(rèn)知負(fù)荷和碎片化的問題。此外,雖然有用于構(gòu)建控制臺(tái)的其他前端框架,但沒有一個(gè)框架包含具有身份驗(yàn)證,授權(quán),審計(jì),可觀察性,API模式和豐富插件模型的集成后端框架。有一個(gè)很流行的持續(xù)交付平臺(tái),它解決了與Clutch相同的首要問題(例如,降低MTTR,用戶友好的UI)但是,它需要大量的投入來運(yùn)行微服務(wù)和遷移應(yīng)用到不同于我們自己的架構(gòu)上。Clutch后端功能開發(fā)簡化,是通過上面列出的集成核心功能為每個(gè)API端點(diǎn)免費(fèi)。它還開發(fā)為單個(gè)二進(jìn)制文件,只需要很少的操作投入。
最后,我們想要一個(gè)平臺(tái),可以對(duì)它進(jìn)行投資,對(duì)其他內(nèi)部團(tuán)隊(duì)來說它需要更容易理解和構(gòu)建。Clutch提供一個(gè)集成的和引導(dǎo)式開發(fā)模型,使其功能開發(fā)成為簡明直接的過程。除了一流的后端功能外,Clutch 的前端還為狀態(tài)管理和多步表單提供了獨(dú)特的抽象,沒有大量JavaScript 經(jīng)驗(yàn)的基礎(chǔ)架構(gòu)團(tuán)隊(duì)更容易實(shí)現(xiàn)前端開發(fā)。
2 特性
"控制平面"模型
Envoy 代理是Lyft創(chuàng)建的。如今,它是最受歡迎的代理之一,部署在許多大型互聯(lián)網(wǎng)公司,并不斷推進(jìn)云網(wǎng)絡(luò)標(biāo)準(zhǔn)。我們的團(tuán)隊(duì)從與大社區(qū)一起維護(hù)Envoy中學(xué)到了很多東西。Envoy用戶討論的最熱門主題之一是控制平面的開發(fā)進(jìn)展,特別是如何系統(tǒng)地集成各種不同的組件,以便Envoy能夠有效地路由和報(bào)告網(wǎng)絡(luò)流量。Envoy類似于 Clutch,它集成不同的基礎(chǔ)設(shè)施系統(tǒng)于統(tǒng)一的API。

Clutch采用了許多envoy代理的核心模式,這些模式是在網(wǎng)絡(luò)控制平面多年的工作中脫穎而出的。
像Envoy 一樣,Clutch 是配置驅(qū)動(dòng)、模式驅(qū)動(dòng)的,并利用基于模塊化擴(kuò)展的架構(gòu),使其適用于各種用例,同時(shí)不影響可維護(hù)性。擴(kuò)展Clutch不需要分支或重寫,自定義代碼可以很容易地從自定義公共或私有外部存儲(chǔ)庫編譯到應(yīng)用程序中。這些相同模式使具有獨(dú)特技術(shù)堆棧的大小組織能夠聚集在單個(gè)代理解決方案上,有望使相似的獨(dú)特組織聚焦在Clutch這樣的基礎(chǔ)設(shè)施控制平面上。
3 安全和保障
此外,Clutch附帶身份驗(yàn)證和授權(quán)組件。OpenID Connect (OIDC) 身份驗(yàn)證流用于單點(diǎn)登錄、RBAC,以及對(duì)所有操作的自動(dòng)審核,并能夠運(yùn)行附加的輸出接收器,例如Slackbot。
Clutch 還具有降低事故風(fēng)險(xiǎn)的功能。通常記錄在 Runbook 中的護(hù)欄和啟發(fā)式方法可以以編程方式實(shí)現(xiàn)。例如,我們絕不允許用戶一次將群集縮減 50% 以上,因?yàn)檫@種操作曾經(jīng)導(dǎo)致過正常維護(hù)時(shí)的意外中斷。不久以后,我們計(jì)劃獲取CPU 和其他使用數(shù)據(jù),以便與群集信息一起顯示,甚至在確定可能導(dǎo)致停機(jī)的情況下,限制縮小規(guī)模的下限。通過將護(hù)欄和啟發(fā)式方法直接實(shí)施到工具中,避免了僅僅依靠于培訓(xùn)和運(yùn)行手冊(cè)來防止事故的發(fā)生。
4 部署和用戶引導(dǎo)
Clutch作為包含前端和后端的單個(gè)二進(jìn)制文件進(jìn)行傳輸,使部署工作變得很簡單。許多更改可以通過配置實(shí)現(xiàn),而不是重新編譯新的二進(jìn)制文件。
提供基礎(chǔ)設(shè)施生命周期工具的其他系統(tǒng),則需要一組復(fù)雜的微服務(wù)或遷移到一種固有的方式管理和部署應(yīng)用程序。Clutch旨在完善現(xiàn)有系統(tǒng),而不是更換它們。
5 框架和組件
Clutch由Go后端和React前端驅(qū)動(dòng)。它為后端和前端開發(fā)提供了功能齊全的框架。Clutch的所有組件都是可組合的,允許使用部分框架功能或完全自定義功能。
這樣的組件和工作流體系結(jié)構(gòu)讓前端經(jīng)驗(yàn)有限的開發(fā)人員在不到一個(gè)小時(shí)的開發(fā)時(shí)間內(nèi),就能使用清晰且易于使用的分步 UI 替換笨重的工具或命令行腳本。
Clutch的前端封裝提供的組件,可輕松構(gòu)建一致且連續(xù)用戶體驗(yàn)的分步工作流程,包括:
?DataLayout:是一個(gè)工作流-本地狀態(tài)管理控件,用于處理來自 API 調(diào)用的用戶輸入和數(shù)據(jù)。
?Wizard:用于向用戶顯示分步表單,自定義元素的 UI 插件,用于在以最少的代碼以一致的方式顯示豐富的信息。
?Clutch的后端重度依賴從ProtobufAPI 定義生成的代碼。
Protobuf 工具還生成前端客戶端,隨著 API 的發(fā)展,該客戶端保持后端和前端的同步。后端的組件包括:
?模塊:代碼生成的 API 存根的實(shí)現(xiàn)
?服務(wù):用于與外部數(shù)據(jù)源交互
?中間件:用于檢查請(qǐng)求和響應(yīng)數(shù)據(jù)以及應(yīng)用審核、授權(quán)等。
?解析器:一種基于自由格式文本搜索或結(jié)構(gòu)化查詢查找資源的通用接口
解析器是一個(gè)Clutch抽象,我們希望會(huì)對(duì)將功能抽象到多個(gè)組織的方式產(chǎn)生重大影響。解析器使用自定義資源位置代碼可輕松擴(kuò)展,允許操作員通過組織習(xí)慣的通用名稱(而不是普通的規(guī)范標(biāo)識(shí)符)定位資源(如 K8s pod 或 EC2 實(shí)例)。例如,如果開發(fā)人員稱其應(yīng)用程序?yàn)?quot;myService-staging",則很容易添加一種將此類查詢解釋為結(jié)構(gòu)化元素的代碼"$application_name=-${environment}"。此外,前端自動(dòng)從后端定義生成用戶輸入表單。
前端有一行代碼:
<Resolver type="clutch.aws.ec2.v1.Instance" />
渲染的表單如下:

在后端配置額外的搜索維度,將會(huì)自動(dòng)映射在前端渲染表單。
6 Clutch在Lyft公司

在 Clutch 之前,Lyft 工程師依靠一系列大雜燴式命令行工具、Web 接口和 Runbook 來執(zhí)行簡單的任務(wù)。Lyft 最常見的警報(bào)需要解決多達(dá)六個(gè)不同的信息源:警報(bào)、其他服務(wù)儀表板、Runbook、其他文檔源、供應(yīng)商控制臺(tái)或腳本以及配置設(shè)置。隨著 Lyft 在團(tuán)隊(duì)、產(chǎn)品和堆棧方面進(jìn)行擴(kuò)張,我們意識(shí)到這些工具沒有跟上步伐。我們用現(xiàn)有的框架解決這些問題沒有出路,這導(dǎo)致了Clutch的第一個(gè)迭代開發(fā)。
在過去的一年里,Clutch 在使用和開發(fā)方面擁有令人難以置信的內(nèi)部采用率。Clutch經(jīng)受住了數(shù)千個(gè)與基礎(chǔ)設(shè)施管理相關(guān)的風(fēng)險(xiǎn)操作,每一個(gè)操作都有帶來意外或延遲的可能,導(dǎo)致用戶失去對(duì)我們的信任。
在撰寫本文時(shí),七個(gè)內(nèi)部工程團(tuán)隊(duì)已經(jīng)計(jì)劃到 2020 年底添加新功能,其中至少一半面向開源。工程師(包括我們出色的實(shí)習(xí)生)在有限的指導(dǎo)下能夠開發(fā)出有意義的功能。最重要的是,我們終于能夠看到一條路線,通過單一虛擬管理平臺(tái)交付我們的內(nèi)部平臺(tái),使 Lyft 基礎(chǔ)設(shè)施成為滿足客戶需求的一個(gè)產(chǎn)品,而不是拼湊的系統(tǒng)和工具集合。
我們?cè)趦?nèi)部收到了很多積極的反饋,例如:
"我很滿意它的存在, 否則我將仍然在等待選項(xiàng)卡加載到云提供商的控制臺(tái)中。
有關(guān) Lyft Clutch的更多細(xì)節(jié),可以在 Lyft 案例研究文章中找到。
7 路線圖
在整個(gè)構(gòu)建Clutch的過程中,產(chǎn)品不斷發(fā)展,我們的內(nèi)外部路線圖目前包含了 Lyft 的全體開發(fā)人員經(jīng)驗(yàn)。我們的長期愿景是構(gòu)建一個(gè)情景感知開發(fā)者門戶,不僅向開發(fā)者提供一套工具,而且在用戶登錄門戶時(shí)提供最有價(jià)值的工具和信息。
即將推出的功能包括:

Envoy UI,為用戶提供一個(gè)實(shí)時(shí)儀表盤,以監(jiān)視其分布式應(yīng)用程序的網(wǎng)絡(luò)性能和配置。
混沌測(cè)試,與Envoy集成來允許預(yù)定的故障注入和擠壓測(cè)試與自動(dòng)停機(jī)條件。自動(dòng)修正,通過適當(dāng)?shù)腃lutch操作自動(dòng)響應(yīng)警報(bào)。
安全增強(qiáng),包括性能升級(jí)、考察模態(tài)和兩階段審批。
附加的基礎(chǔ)設(shè)施生命周期管理功能,查看群集的狀態(tài)以查找異常值,執(zhí)行長時(shí)間運(yùn)行的維護(hù)任務(wù)。
服務(wù)健康狀況儀表板,使用可配置的報(bào)告機(jī)制向開發(fā)者提供有關(guān)其服務(wù)狀態(tài)的反饋(例如代碼覆蓋率、成本、活躍的突發(fā)事件)。
通用配置管理,允許用戶通過引導(dǎo)式 UI 管理復(fù)雜配置,或以其他方式將基礎(chǔ)結(jié)構(gòu)中的變更反映為代碼聲明。
拓?fù)鋱D,將用戶與其擁有的服務(wù)關(guān)聯(lián),并在登陸頁上向他們顯示相關(guān)的數(shù)據(jù)和工具。
作者:Daniel Hochman & DerekSchaller
譯者:時(shí)間