
摘要
隨著(zhù)容器技術(shù)的火熱,不能免俗,我們也嘗試引入容器技術(shù)搭建私有容器云平臺,然后在容器云的基礎上逐步實(shí)現公司的PaaS平臺,以提供給各團隊應用托管、應用開(kāi)發(fā)、應用運維的能力,同時(shí)希望實(shí)現開(kāi)發(fā)測試環(huán)境一致性,實(shí)現互聯(lián)網(wǎng)應用或類(lèi)互聯(lián)網(wǎng)應用的彈性伸縮,實(shí)現手機應用的灰度發(fā)布,實(shí)現持續集成持續交付的敏捷流程,實(shí)現運維自動(dòng)化等能力。
我們前后接觸了10多家容器云廠(chǎng)商,從交流過(guò)程中,隨著(zhù)理解的深入,也發(fā)現基本上所有的廠(chǎng)商都是基于開(kāi)源社區版本的功能,很少有自己的想法,難以滿(mǎn)足我們的需求,特別是多租戶(hù)的設計,基本上都是開(kāi)發(fā)人員一廂情愿的想法,沒(méi)有理解多租戶(hù)功能。所以這里我們就拋磚引玉討論下如何看待多租戶(hù)及多租戶(hù)權限訪(fǎng)問(wèn)控制的設計實(shí)現。
容器云多租戶(hù)
多租戶(hù),顧名思義,就是很多人來(lái)租用容器云平臺的資源來(lái)實(shí)現自己的應用托管運維需求。那么資源管理與分配就是我們首先需要面對的問(wèn)題。那么容器云中什么是資源?資源該由誰(shuí)來(lái)管理?如何分配?誰(shuí)來(lái)運維這些資源?誰(shuí)來(lái)使用這些資源? 是不是一個(gè)admin就可以眉毛胡子一把抓,干所有事情?
資源概念很廣,對于容器云平臺來(lái)說(shuō),租戶(hù)是不是一種資源?當然是。但這里我們討論的只是容器云平臺提供的基礎資源:計算資源、存儲資源、網(wǎng)絡(luò )資源。
有了資源,那么誰(shuí)來(lái)管理運維分配使用這些資源?目前幾乎所有的容器廠(chǎng)商都是由一個(gè)容器平臺管理員來(lái)做所有的事情,這很不合理!
多租戶(hù)很重要的一點(diǎn)是資源隔離,安全。即便是私有云,也需要考慮相應的安全和業(yè)務(wù)隔離需求,特別做一個(gè)產(chǎn)品時(shí)。
從多租戶(hù)的角度考慮,租戶(hù)租用容器云平臺的資源來(lái)托管、開(kāi)發(fā)、部署運維自己的應用、服務(wù)。容器云平臺需要提供、維護保障租戶(hù)能正常使用這些資源,同時(shí)給租戶(hù)托管的應用提供服務(wù)注冊、服務(wù)發(fā)現、服務(wù)配置、日志、監控、預警告警、彈性伸縮、負載均衡、安全等能力。我們要明白的是租戶(hù)只是租用這些能力,他并不運維這些能力。租戶(hù)關(guān)注的是其托管的應用和服務(wù),他需要做的是利用平臺提供的這些能力來(lái)無(wú)縫的運維他們的應用和服務(wù)。
到此,我們就理解清楚了上面的幾個(gè)問(wèn)題。租戶(hù)只是使用/租用資源;容器云平臺管理運維這些資源。租戶(hù)側重于對自由的應用或服務(wù)進(jìn)行運維。資源由租戶(hù)申請,容器云平臺來(lái)分配管理資源。
我們再來(lái)討論下容器云中多租戶(hù)的可能的案例需求:
多租戶(hù)可能需求
- 案例需求一
不同組織架構支持。租戶(hù)可能是一個(gè)公司、一個(gè)部門(mén)、一個(gè)團隊、一個(gè)項目組或者簡(jiǎn)單一個(gè)人等。一個(gè)公司可能有不同的部門(mén),一個(gè)部門(mén)有子部門(mén),一個(gè)團隊可能有多個(gè)項目組,一個(gè)人可能屬于不同的團隊不同的項目組……有點(diǎn)頭大,是不是?多租戶(hù)中需要支持不同的組織架構形式,并且這個(gè)組織架構是租戶(hù)自己定義管理的。

圖表 1需要支持的租戶(hù)的不同組織架構需求
- 案例需求二
權限定義。容器云為租戶(hù)提供不同的功能,不同功能組件可能面臨著(zhù)不同權限定義的問(wèn)題。對于租戶(hù)來(lái)說(shuō),可以完全控制其下的賬戶(hù)管理,賬戶(hù)管理可能有增刪改查等權限;但對資源,只能申請、使用分配到的資源,或者再分配資源給其他用戶(hù)或角色。而對租戶(hù)自己的應用可能有查詢(xún)、部署、運維(配置更新停止啟動(dòng)等)、刪除等權限。

圖表 2不同功能不同權限定義需求
- 案例需求三
角色定義、授權。對于部署的應用A, 可能的需求是分配一個(gè)用戶(hù)UserA僅 有應用A運維的角色,用戶(hù)UserA只有運維應用A的權限。當然用戶(hù)UserA需要有從鏡像倉庫更新對應的應用鏡像的權限,需要有在日志中心查詢(xún)應用A的日志的權限,在監控告警中心配置應用A監控告警規則的權限等。當然也可以不賦予用戶(hù)A此權限。

圖表 3角色定義,授權
- 案例需求四
多租戶(hù)用戶(hù)登錄。前面提到不同租戶(hù)下可能有同名用戶(hù)或同賬號用戶(hù)。同一用戶(hù)/同一賬號也可能屬于不同的租戶(hù),那么登錄的時(shí)候如何通過(guò)租戶(hù)賬號來(lái)區分?
- 案例需求五
對應用不同資源需求的支持。租戶(hù)開(kāi)發(fā)的應用可能需要不同的資源類(lèi)型來(lái)支撐,比如某應用B需要內存優(yōu)化的資源,某應用C需要IO優(yōu)化和高CPU計算的資源,應用D可能只通用資源就可以,應用E需要GPU資源,等等。這就需要根據不同的應用需求,提供不同的資源支撐。
- 案例需求六
充分利用現有資源。我們知道容器不占用很多資源,那么為充分有效利用可用的資源,公司內可能有虛擬化資源,也可能有一些淘汰的物理機。是不是可以利用起來(lái)部署容器?這些設備配置各異,即便是新購買(mǎi)主機,不同批次配置也可能不一樣,這些資源如何能更好的管理和使用?
- 案例需求七
都把容器列到菜單最顯著(zhù)位置,生怕沒(méi)人知道他們采用了容器技術(shù)。但對于租戶(hù)來(lái)說(shuō)關(guān)心的重點(diǎn)應該是應用,用不用容器,用什么容器,應用部署在哪臺主機哪個(gè)集群都應該是透明的,都不重要。只要保證資源有效可用,在資源異常情況下能順利實(shí)現應用遷移即可。
回到應用。這里的應用我們指業(yè)務(wù)應用。一個(gè)業(yè)務(wù)應用可以看作是一個(gè)系統,也可以是系統的一個(gè)模塊,或者組件。一個(gè)業(yè)務(wù)應用可能由多個(gè)服務(wù)組成,這里就涉及到了服務(wù)的編排。每個(gè)服務(wù)可能需要部署一到多個(gè)服務(wù)實(shí)例,每個(gè)服務(wù)實(shí)例運行在Pods或容器中。Pods或容器和主機、存儲、網(wǎng)絡(luò )等資源相關(guān),主機上有CPU、Memory等資源。我們希望我們運維一個(gè)應用時(shí),不同層次的對象可以有效平滑的關(guān)聯(lián)起來(lái),就像一個(gè)人,有骨架,有血肉,是一個(gè)整體。而不是點(diǎn)這里一下,再點(diǎn)那里一下,跳來(lái)跳去。

圖表 4應用管理
- 案例需求八
同時(shí)業(yè)務(wù)服務(wù)涉及到鏡像倉庫、服務(wù)的注冊發(fā)現、服務(wù)配置、服務(wù)部署策略、服務(wù)運行監控、服務(wù)彈性伸縮、服務(wù)負載均衡、異常遷移、自動(dòng)恢復等。每個(gè)租戶(hù)登錄時(shí)可能只希望看到鏡像倉庫、日志、監控告警、配置等中自己相關(guān)的信息,不希望其他租戶(hù)看到自己的信息。
- 案例需求九
多租戶(hù)還有重要的一點(diǎn)就是安全和資源隔離。租戶(hù)用戶(hù)不需要連接登錄遠程容器云資源主機或容器引擎。我們說(shuō)了,容器資源由容器平臺來(lái)運維,租戶(hù)只是使用資源。不管私有云或公有云,理念要一致,不能隨意而為。否則安全就無(wú)法保證。
基于上面提到的需求,我們看下怎么實(shí)現。看起來(lái)挺復雜,其實(shí)也很簡(jiǎn)單。只有想不到,沒(méi)有做不到。
多租戶(hù)和權限中心實(shí)現
從目前國內各廠(chǎng)商的實(shí)現來(lái)看,沒(méi)有能滿(mǎn)足以上需求的, 也沒(méi)有廠(chǎng)商認真考慮上面的問(wèn)題。
多租戶(hù)設計,需要考慮到租戶(hù)的權限訪(fǎng)問(wèn)控制,這涉及到容器云平臺整體的權限控制架構,所以這里我們提出了一個(gè)權限中心的概念,實(shí)現一個(gè)權限中心,由權限中心來(lái)實(shí)現對容器云各組件及各功能的動(dòng)態(tài)控制,以適應靈活的不同的場(chǎng)景需求?
一、 組織結構的實(shí)現可采用類(lèi)似論壇的層次結構方法,無(wú)論多少層多少級,只標注其父結點(diǎn)ID,樹(shù)型結構遍歷可以獲得所有的結點(diǎn)。這也是我們下面權限訪(fǎng)問(wèn)控制實(shí)現的基礎。
二、由于每項功能可以提供不同的操作,所以定義權限時(shí)很難用統一的權限名稱(chēng)來(lái)定義,這里可以借助Oracle數據庫的權限定義,比如應用管理,有部署、查看、運維、刪除等權限;租戶(hù)資源管理,有申請、使用、再分配等權限。
三、角色定義,就需要基于用戶(hù)及用戶(hù)組織結構,權限和容器云提供給租戶(hù)的功能列表來(lái)實(shí)現。可以采用Oracle 數據庫的用戶(hù)角色權限定義方式來(lái)定義。容器云平臺初始化時(shí)可以預定義角色,比如租戶(hù)管理員角色、應用管理員角色等。
四、用戶(hù)登錄我們借用Windows domain的概念,一個(gè)租戶(hù)就是一個(gè)domain。租戶(hù)賬號就是domain name。 登錄時(shí)指定domainName\useraccount的方式登錄。根據定義的角色權限展示不同用戶(hù)視圖。以租戶(hù)賬號登錄時(shí),可以不用指定domain登錄。 租戶(hù)/用戶(hù)賬號是有效的Email Address。租戶(hù)賬號是超級用戶(hù)賬號。
五、資源管理需要容器云平臺來(lái)支撐,簡(jiǎn)單的方式是通過(guò)標簽來(lái)進(jìn)行資源分類(lèi)。 一方面可以方便的充分有效的利用公司內資源,另一方面也有針對性的對應用不同資源需求提供支持。再者也可以簡(jiǎn)單實(shí)現資源隔離。
這樣組織結構可支持不同的需求變化,每用戶(hù)(人員)有從屬于租戶(hù)(domain)下的自己的賬號。租戶(hù)可定義不同的角色,角色賦予用戶(hù),用戶(hù)可有多種角色、角色權限可繼承。用戶(hù)使用資源重點(diǎn)關(guān)注應用的運維。
之所以把權限訪(fǎng)問(wèn)控制提取出來(lái)實(shí)現一個(gè)統一的權限中心組件,是因為整個(gè)容器云平臺,各個(gè)組件都面臨著(zhù)權限訪(fǎng)問(wèn)控制需求。從云計算的理念來(lái)說(shuō),松耦合,插件式的組件或模塊設計更靈活和適用快速變化的需求。對一個(gè)客戶(hù)來(lái)說(shuō),一個(gè)組件可能需要也可能不需要,每個(gè)組件都可以以插拔的方式來(lái)控制,根據客戶(hù)需求來(lái)部署相應的組件,實(shí)現相應的權限訪(fǎng)問(wèn)控制,將會(huì )更靈活和便利。