GitHub-zlabjp/envoy-spire-opa-service-mesh: 使用Envoy作為資料平面以及SPIRE和OPA作為控制平面在Kubernetese上構建Service Mesh的演示案例原始碼
該演示使用Envoy作為資料平面以及SPIRE和OPA作為控制平面在Kubernetese上構建Service Mesh。該演示是zlabjp / spiffejp-demo,其中新增了OPA。
- 使用Kubernetes 1.17.0
- 使用特使 1.12.2,SPIRE 0.9.0和OPA 0.15.1
- Envoy使用SPIRE作為SDS伺服器來獲取TLS證書
- Envoy使用OPA作為外部授權伺服器來檢查傳入請求是否被授權
Kubernetes叢集中正在執行四個服務。
- ec-web(spiffe://example.org/ec-web)
- ec-web 僅接受包含“ ec-web-secret”值的自定義標頭“ X-Opa-Secret”的請求
- ec-backend(spiffe://example.org/ec-backend)
- ec-backend可以只從訪問ec-web
- news-web(spiffe://example.org/news-web)
- news-web 僅接受包含“ news-web-secret”值的自定義標頭“ X-Opa-Secret”的請求
- news-backend(spiffe://example.org/news-backend)
- news-backend可以只從訪問news-web
架構:
具體架構如下;
Envoy,SPIRE Agent和OPA被啟用為每個pod的邊車。為了稍微解釋一下該功能,(ec | news)-web是Nginx,並且僅將從檢視器收到的請求代理到(ec | news)-backend,而(ec | news)-backend返回一個字串API。
簡要介紹從ec-web向ec-backend發出請求時的流程。
- Envoy在啟動時從SPIRE Agent獲取mTLS所需的憑據,例如TLS客戶端證書
- ec-web Pod中的應用程式向自己的Envoy發出請求,向ec-backend發出請求
- 收到請求的Envoy向ec-backend的Envoy請求
- 使用從SPIRE Agent獲得的憑據在ec-web和ec-backend Envoy之間通過mTLS進行相互身份驗證
- 身份驗證成功後,ec-backend Envoy會向其OPA請求允許的請求。
- OPA通過查詢預設策略和接收到的請求來執行授權處理
- 如果授權成功,則ec-backend Envoy會將請求代理到其自己的App
- ec-backend返回對ec-web的響應
上面是一個簡單的流程。
Envoy
Envoy是每個Pod之間通訊的中心人物,Envoy的重要功能是Secret Discovery Service(SDS),它是xDS API之一。
通過使用SDS,Envoy可以從SDS伺服器動態獲取TLS證書和mTLS通訊所需的金鑰。SPIRE代理充當了SDS伺服器,並且可以將TLS證書的管理(分發和輪換)委託給SPIRE。
接下來,關於外部授權,可以使用此功能將Envoy的網路過濾功能委託給另一個系統,如果確定不允許該請求,則通訊將關閉。 (對於HTTP,返回403)。這次,OPA將充當外部授權伺服器。
SPIRE
如Envoy部分所述,SPIRE的作用是管理(分發和輪換)TLS證書。SPIRE頒發的TLS證書包含SPIFFE ID(即工作負載的身份),因此,本次引入的Servicec Mesh使用基於SPIFFE ID的身份驗證和授權(通過Envoy中的mTLS和OPA中的SPIFFE ID進行相互身份驗證)。基於基礎的策略定義)是可能的。
*有關SPIRE的概述,請參閱開頭提到的幻燈片。
OPA
如Envoy部分所述,OPA的作用是代表Envoy的網路過濾功能。這次,將進行設定以充當HTTP篩選器的外部授權伺服器,並且基於HTTP請求所儲存的資訊來定義策略。當然,HTTP請求的資訊包括TLS證書,因此可以基於SPIFFE ID進行控制。
點選標題見Github.
相關文章
- Envoy Proxy構建控制平面指南
- 開源 | Service Mesh 資料平面 SOFAMosn 深層揭祕
- Service Mesh 通用資料平面 API(UDPA)最新進展深度介紹APIUDP
- 詳細解讀Service Mesh的資料面Envoy
- Envoy實現.NET架構的閘道器(二)基於控制平面的動態配置架構
- unloader將資料解除安裝為平面檔案
- 在 Intenseye,為什麼我們選擇 Linkerd2 作為 Service Mesh 工具(Part.1)
- 在 Intenseye,為什麼我們選擇 Linkerd2 作為 Service Mesh 工具(Part.2)
- [譯] 在 Swift 中使用 errors 作為控制流SwiftError
- AR的平面檢測和利用SceneKit構建幾何體
- 在SpringCloud使用RSocket替代Rabbit或Kafka作為訊息路由中繼的原始碼案例SpringGCCloudKafka路由中繼原始碼
- Segment使用Go、gRPC和Envoy作為後端REST API實現GoRPC後端RESTAPI
- 在.NET使用JSON作為資料交換格式JSON
- 使用Hazelcast作為Spring資料儲存庫的開源案例ASTSpring
- 使用gitee作為原始碼管理工具Gitee原始碼
- 平面
- 網頁中的平面構成網頁
- 使用PostgreSQL作為資料倉儲 - narratorSQL
- MongoDB和資料流:使用MongoDB作為Kafka消費者MongoDBKafka
- 使用Deno和WebSockets構建實時聊天原始碼案例Web原始碼
- 為什麼要使用服務網格Service Mesh?
- 作為資料應用場景基石的資料模型應該如何構建?Smartbi來教你!模型
- GridView用資料來源控制元件和用DataTable作為資料來源的不同View控制元件
- 室內地圖怎麼畫,樓層平面索引圖製作地圖索引
- 為什麼不建議使用自定義Object作為HashMap的key?ObjectHashMap
- 如何將 npm 作為構建工具使用NPM
- 使用spring validation 作為資料校驗Spring
- 遊戲案例|Service Mesh 在歡樂遊戲的應用演變和實踐遊戲
- 平面幾何
- 作為程式設計師為什麼要閱讀原始碼程式設計師原始碼
- 靜態庫和動態庫的製作以及Bundle資原始檔的使用
- 遊戲作為隱形的建築學遊戲
- 使用 Casbin 作為 ThinkPHP 的許可權控制中介軟體PHP
- 使用harbor和nexus作為docker registryDocker
- NVM作為主存上對資料庫管理系統的影響資料庫
- 不要使用業務鍵作為資料庫主鍵資料庫
- Java面試題:為什麼HashMap不建議使用物件作為Key?Java面試題HashMap物件
- 理解 Istio Service Mesh 中 Envoy 代理 Sidecar 注入及流量劫持IDE