阿里巴巴中間件
來源:https://blog.csdn.net/j3t9z7h/article/details/81380506
Istio 1.0 於北京時間8月1日0點正式發佈!雖然比原本官網公佈的發佈時間晚了9個小時,但這並未影響到Istio在社區的熱度。
Istio 是 Service Mesh概念的具體實現。2018年被稱爲 Service Mesh 原年,譽爲新一代的微服務架構,有了Service Mesh,像Docker和Kubernetes標準化部署操作一樣來標準化我們的應用程序運行時的操作便成爲可能。Istio是其中最成熟和被廣泛接受的開源項目。它是連接、管理和保護微服務的開放平臺。今天發佈的1.0 版本是一個重要的里程碑。這意味着Istio的所有核心功能都已經可以落地部署,不再只是演示版了。
本文來自阿里巴巴中間件事業部硅谷團隊 Istio 技術專家 Andy在 Istio上的實踐和對1.0版本的解讀,Andy長期關注Service Mesh,在Cloud Foundry,Kubernetes,Envoy上有着豐富的實踐和開發經驗。
從功能上說,1.0版本是對0.8版本的補充和加強。從0.8之前版本到1.0版本,改變的部分從網絡,策略和遙測,適配器,到安全等幾大模塊,都有補充和增強。
一、Istio 新功能簡介
1.0 版本中的新功能大致如下:
➤ 網絡
-
使用 Virtual Service 進行 SNI 路由
-
流式 gRPC 恢復
-
舊版本(v1alpha1)的網絡 API 被移除
-
Istio Ingress 被gateway替代
➤ 策略和遙測
-
屬性更新
-
緩存策略檢查
-
遙測緩衝
-
進程外適配器
-
客戶端遙測
➤ Mixer 適配器
-
SignalFX
-
Stackdriver
➤ 安全
-
RPC 級授權策略
-
改進的雙向 TLS 認證控制
-
JWT 認證
二、幾個重要的改變
在衆多的改變中,下面幾點和之前版本相比,有較大的增強和改動,在這裏我們展開介紹下:
➤ IstioGateway 替代 IstioIngress
在 istio 1.0 之前,Istio Ingress 直接使用 Kubernetes Ingress,因此受到 Kubernetes 的 Ingress 本身只有 L7 的網絡控制功能的限制,很多功能無法實現。這些功能包括:
-
L4-L6的LB
-
對外的mTLS
-
對SNI(服務器名稱指示)的支持
-
以及其它在Pilot已經實現的對內部網絡的功能,比如Traffic splitting,fault injection, mirroring, header match等。
爲了解決這些問題,Istio 在 1.0 版本提出了 Istio Gateway 的概念,從而擺脫了對 Kubernetes Ingress 的依賴,可以實現更多的功能,例如: L4-L6的LB,對外的mTLS,對SNI(服務器名稱指示)的支持等。
如果我們希望給一個 Kubernetes 的 guestbook ui Service 做一個 Istio Ingress 的話,在 0.8 版本以前我們需要如下定義一個 Istio Ingress Resourse:
apiVersion
: extensions/v1beta1
kind
: Ingress
metadata
:
annotations
:
kubernetes.io/ingress.class
: istio
name
: simple-ingress
spec
:
rules
:
- http
:
paths
:
- path
: /.*
backend
:
serviceName
: guestbook-ui
servicePort
:80
這裏面是我們對 L7 的策略配置。但是可以看到,基於這種 Ingress 並不能支持 mTLS 等高級功能。現在在 Istio 1.0 版本,我們可以使用新的 Istio Gateway 來完成類似的配置。這種配置會分兩部分:
-
L4-L6 的配置在 Gateway 這種資源中;
-
L7 的配置在綁定的 Virtual Services 配置資源中。
對於上面同樣的例子,Istio Gateway 資源的定義是這樣的:
apiVersion
: networking.istio.io/v1alpha3
kind
: Gateway
metadata
:
name
: simple-gateway
spec
:
servers
:
- port
:
number
:80
name
: http
protocol
: HTTP
- port
:
number
:443
name
: https
protocol
: HTTPS
hosts
:
- sample.default.example.com
tls
:
mode
: SIMPLE
serverCertificate
: /tmp/tls.crt
privateKey
: /tmp/tls.key
通過 Gateway 這種資源,我們提供了對mTLS的支持。爲了完成對 HTTP path 的匹配和對 Virtual Host 的支持,我們需要定一個新的 VirtualService 資源並且將它和 Gateway 資源綁定。Virtual Services 很像以前的 Virtual Host,它可以允許同一個IP對應不同的域名,所以即使同樣的路徑也不會產生重複。
它的配置和與 Gateway 的綁定如下:
apiVersion
: networking.istio.io/v1alpha3
kind
: VirtualService
metadata
:
name
: sample
spec
:
hosts
:
- guestbook-ui.default.example.com
gateways
:
- simple-gateway
http
:
- match
:
- uri
:
prefix
: /get
route
:
...
➤ Mixer 進程外適配器
適配器是讓第三方用戶來擴展Mixer功能的,比如和自己的 Logging 系統集成。以前的適配器,是與 Mixer 主進程在一起的。這樣有些問題,比如如果適配器有用戶的認證信息,那麼上傳的時候所有人都知道了。另外,如何對這些適配器做健康檢查(health check)呢? 它們在同一個進程裏。
新的版本,適配器在 Mixer 主進程之外,用戶不但可以決定是否要把適配器上傳,而且運行時也可以進行外部健康檢查了。
不過由於適配器 和 Mixer 主進程不在同一個進程,需要進行進程間通訊,因此適配器要和主進程通訊會依賴 RPC。這裏 Mixer 選用了比較流行的標準 RPC 框架 gRPC作爲實現。
有了這個功能,在 Istio 的 Mixer 中開發外適配器功能只需要如下三個步驟:
-
編譯適配器源代碼
-
生成適配器模版
-
部署適配器鏡像
如果有興趣更深入的瞭解適配器的開發和使用,請參考這兩個教程
第一部分:
https://github.com/istio/istio/wiki/Out-Of-Process-gRPC-Adapter-Dev-Guide
第二部分:
https://github.com/istio/istio/wiki/gRPC-Adapter-Walkthrough
➤ 支持可以使用身份驗證策略配置的 JWT 身份驗證
JWT(JSON Web Token)是一種基於token的鑑權機制。JWT很流行的原因主要是它的簡單易用,特別是採用JSON格式,是大部分編程語言支持的。所以儘管出現的時間不長,但卻是很多編程人員的鑑權首選。因此 Istio 對 JWT 進行了支持。
例如我們創建一個 JWT token payload來慶祝 Istio 1.0 GA :
{
"iss":"istio",
"sub":"1.0 GA",
"iat":1533073556
}
用戶調用時,需要把 JTW token 來編碼後,以 Bearer 形式進行傳遞:
GET http://35.45.16.16/api/v1/packages?packageNumber=MPDS-372766142-5899
Host: sample.default.example.com
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJpc3RpbyIsInN1YiI6IjEuMCBHQSIsImlhdCI6MTUzMzA3MzU1Nn0.SkgIHM5ecYsn_hWGewyPFgBAQw79g4hAMEtpXzidKaM
Istio 就用這個Bearer來作最終用戶認證。是不是很簡單呢?Istio 之前就支持基於 JWT 的Authentication。新的版本開始支持 Authorization。對用戶來說,只是在同一個Authentication policy 的資源上擴展一部分而已。
Istio的 Authorization 是基於角色的訪問控制,它提供命名空間級別, 服務級別和 method-level 的訪問控制。
要實現Authorization,只需要如下幾步:
-
首先要開啓允許授權;
-
開啓了特定級別(如:命名空間)的授權;
-
創建這個級別的訪問控制策略。
更詳盡的內容,可以參考 Istio 安全文檔:
https://istio.io/zh/docs/concepts/security/
三、阿里巴巴對 Istio 生態的支持
以上是關於Istio 1.0的簡單介紹。如果大家感興趣的話,可以通過以下的教程進行實踐
https://github.com/szihai/istio-workshop
阿里巴巴中間件技術團隊會持續關注和參與Service Mesh的開發和推廣活動。並提供一系列關於Service Mesh和 Istio 的解讀、實踐和教程,詳細介紹 Istio新版本中的概念、功能以及未來最新的動態。我們也正計劃在Dubbo 2.7的版本中加入對Istio的集成,充分利用Service Mesh的理念,進一步簡化微服務的管理。