Conduit是一款針對Kubernetes的超輕量級的service mesh。它能夠透明得管理服務運行時之間的通訊,使得在Kubernetes上運行服務更加安全和可靠;它還具備不用修改任何應用程序代碼便可改進應用程序的可觀測性、可靠性及安全性等方面的特性。web
本文檔將從一個較高層次介紹Conduit及其是如何工做的。若是不熟悉service mesh模型,或許能夠先閱讀William Morgan的概覽文章 什麼是service mesh?爲何須要它?安全
Conduit service mesh部署到Kubernetes集羣時有兩個基本組件:數據平面和控制平面。數據平面承載服務實例間實際的應用請求流量,而控制平面則驅動數據平面並修改其行爲(及訪問聚合指標)提供API。Conduit CLI和Web UI使用此API併爲人類提供符合人體工程學的控制。架構
讓咱們依次認識這些組件。ide
Conduit的數據平面由輕量級的代理組成,這些代理做爲sidecar容器與每一個服務代碼的實例部署在一塊兒。若是將服務「添加」到Conduit servie mesh中,必須從新部署該服務的pod,以便在每一個pod中包含一個數據平面代理。(conduit inject
命令能夠完成這個任務,以及透明地從每一個實例經過代理聚集流量所需的配置工做。)工具
這些代理透明地攔截進出每一個pod的通訊,並增長諸如重試和超時、檢測及加密(TLS)等特性,並根據相關策略來容許和拒絕請求。性能
這些代理並未設計成經過手動方式配置;相反,它們的行爲是由控制平面驅動的。ui
Conduit控制平面是一組運行在專用Kubernetes名稱空間(默認狀況下爲conduit
)的服務。這些服務完成各類事情 - 聚合遙測數據,提供面向用戶的API,向數據平面代理提供控制數據等。它們一塊兒驅動數據平面的行爲。加密
爲了支持Conduit的人機交互,能夠使用Conduit CLI及web UI(也能夠經過相關工具好比 kubectl
)。CLI 和 web UI經過API驅動控制平面,而控制平面相應地驅動數據平面的行爲。spa
控制平面API設計得足夠通用,以便能基於此構建其餘工具。好比,你可能但願從另一個CI/CD系統來驅動API。插件
運行 conduit --help
可查看關於CLI功能的簡短概述。
Conduit設計用於無縫地融入現有的Kubernetes系統。該設計有幾個重要特徵。
第一,Conduit CLI(conduit
)設計成儘量地與 kubectl
一塊兒使用。好比,conduit install
和 conduit inject
生成的Kubernetes配置,被設計成直接送入kubectl
。這是爲了在service mesh和編排系統之間提供一個明確的分工,而且使得Conduit適配現有的Kubernetes工做流程。
第二,Kubernetes中Conduit的核心詞是Deployment,而不是Service。舉個例子,conduit inject
增長一個Deployment,Conduit web UI會顯示這些Deployment,而且每一個Deployment都會給出聚合的性能指標。這是由於單個pod能夠是任意數量Service的一部分,而這會致使流量與pod之間出現複雜的映射。相比之下,Deployment要求單個pod只能屬於一個Deployment的一部分。經過基於Deployment而不是Service來構建,流量與pod間的映射就老是清晰的。
這兩個設計特性能很好地組合。好比,conduit inject
可用於一個運行的Deployment,由於當它更新Deployment時, Kubernetes會回滾pod以包括數據平面代理。
Conduit控制平面還爲構建自定義功能提供了一個便捷的入口。Conduit最初發布時並不支持這一點,在不遠的未來,經過編寫gRPC插件來做爲控制平面的一部分運行,將能擴展Conduit的功能,而無需從新編譯Conduit。