您可以通過ASM入口網關安全地訪問網格內的gRPC服務,實現對gRPC服務的精確訪問控制,提升服務治理能力,保障服務間通信的安全性。本文介紹如何通過入口網關訪問網格內gRPC服務,并在gRPC的兩個版本之間進行流量切換。
前提條件
已創建入口網關。
已部署應用到ASM實例關聯的集群,且ASM實例為最新版本的企業版或旗艦版實例。具體操作,請參見在ASM實例關聯的集群中部署應用。
步驟一:部署示例應用
部署名為istio-grpc-server-v1和istio-grpc-server-v2的示例應用。
登錄容器服務管理控制臺,在左側導航欄選擇集群。
在集群列表頁面,單擊目標集群名稱,然后在左側導航欄,選擇 。
在無狀態頁面上方,選擇目標命名空間,然后在右上角單擊使用YAML創建資源。
說明當前選中的命名空間應當已標注自動注入Sidecar,即包含istio-injection=enabled標簽。具體操作,請參見啟用自動注入。
在創建頁面,選擇自定義示例模板,配置以下YAML,然后單擊創建。
apiVersion: apps/v1 kind: Deployment metadata: name: grpc-helloworld-py-v1 labels: app: grpc-helloworld-py version: v1 spec: replicas: 1 selector: matchLabels: app: grpc-helloworld-py version: v1 template: metadata: labels: app: grpc-helloworld-py version: v1 spec: containers: - name: grpc-helloworld-py image: registry.cn-hangzhou.aliyuncs.com/aliacs-app-catalog/istio-grpc-server:grpc-helloworld-py-v1.0 imagePullPolicy: Always env: - name: podname valueFrom: fieldRef: apiVersion: v1 fieldPath: metadata.name ports: - containerPort: 50051 name: grpc-port --- apiVersion: apps/v1 kind: Deployment metadata: name: grpc-helloworld-py-v2 labels: app: grpc-helloworld-py version: v2 spec: replicas: 1 selector: matchLabels: app: grpc-helloworld-py version: v2 template: metadata: labels: app: grpc-helloworld-py version: v2 spec: containers: - name: grpc-helloworld-py image: registry.cn-hangzhou.aliyuncs.com/aliacs-app-catalog/istio-grpc-server:grpc-helloworld-py-v1.0 imagePullPolicy: Always env: - name: podname valueFrom: fieldRef: apiVersion: v1 fieldPath: metadata.name ports: - containerPort: 50051 name: grpc-port --- apiVersion: v1 kind: Service metadata: name: grpc-helloworld-py labels: app: grpc-helloworld-py spec: ports: - port: 50051 name: grpc-port selector: app: grpc-helloworld-py
步驟二:設置服務網格ASM的路由規則
設置服務網格的服務網關、虛擬服務和目標規則,將流量全部指向istio-grpc-server-v1。
登錄ASM控制臺,在左側導航欄,選擇 。
在網格管理頁面,找到待配置的實例,單擊實例的名稱或在操作列中單擊管理。
創建網關規則。
在網格詳情頁面左側導航欄,選擇 ,然后在右側頁面,單擊使用YAML創建。
在創建頁面,設置命名空間為default,選擇任意場景模版,配置以下YAML,然后單擊創建。
apiVersion: networking.istio.io/v1beta1 kind: Gateway metadata: name: grpc-gateway spec: selector: istio: ingressgateway servers: - port: number: 8080 name: grpc protocol: GRPC hosts: - "*"
創建目標規則。
在網格詳情頁面左側導航欄,選擇 ,然后在右側頁面,單擊使用YAML創建。
在創建頁面,設置命名空間為default,選擇任意場景模版,配置以下YAML,然后單擊創建。
apiVersion: networking.istio.io/v1beta1 kind: DestinationRule metadata: name: dr-istio-grpc-server spec: host: grpc-helloworld-py trafficPolicy: loadBalancer: simple: ROUND_ROBIN subsets: - name: v1 labels: version: "v1" - name: v2 labels: version: "v2"
創建虛擬服務。
在網格詳情頁面左側導航欄,選擇 ,然后在右側頁面,單擊使用YAML創建。
在創建頁面,設置命名空間為default,選擇任意場景模版,配置以下YAML,然后單擊創建。
apiVersion: networking.istio.io/v1alpha3 kind: VirtualService metadata: name: grpc-vs spec: hosts: - "*" gateways: - grpc-gateway http: - match: - port: 8080 route: - destination: host: grpc-helloworld-py port: number: 50051 subset: v1 weight: 100 - destination: host: grpc-helloworld-py port: number: 50051 subset: v2 weight: 0
步驟三:部署新入口網關或復用已有入口網關
在入口網關中,如果不存在8080端口,需要添加8080端口。
新建入口網關
登錄ASM控制臺,在左側導航欄,選擇 。
在網格管理頁面,單擊目標實例名稱,然后在左側導航欄,選擇 。
在入口網關頁面,單擊創建,配置相關信息,然后單擊創建。
部分配置項說明如下。關于配置項的更多信息,請參見入口網關配置項說明。
配置項
說明
部署集群
選擇要部署入口網關的集群。
負載均衡CLB類型
此處指定負載均衡的類型為公網訪問。
負載均衡
選擇負載均衡。
使用已有負載均衡:從已有負載均衡列表中選擇。
新建負載均衡CLB:單擊新建負載均衡CLB,從下拉列表中選擇所需的負載均衡規格。
說明建議您為每個Kubernetes服務分配一個CLB。如果多個Kubernetes服務復用同一個CLB,存在以下風險和限制:
使用已有的CLB會強制覆蓋已有監聽,可能會導致您的應用不可訪問。
Kubernetes通過Service創建的CLB不能復用,只能復用您手動在控制臺(或調用OpenAPI)創建的CLB。
復用同一個CLB的多個Service不能有相同的前端監聽端口,否則會造成端口沖突。
復用CLB時,監聽的名字以及虛擬服務器組的名字被Kubernetes作為唯一標識符。請勿修改監聽和虛擬服務器組的名字。
不支持跨集群復用CLB。
端口映射
設置協議為TCP,服務端口為8080。
在已有入口網關添加8080端口
登錄ASM控制臺,在左側導航欄,選擇 。
在網格管理頁面,單擊目標實例名稱,然后在左側導航欄,選擇 。
在入口網關頁面,單擊目標網關名稱,在網關詳情頁面的基本選項區域,單擊端口配置右側的圖標,在端口映射對話框,單擊添加端口,設置協議為TCP,服務端口為8080,然后單擊確認。
步驟四:運行gRPC客戶端
grpcurl是一個命令行工具,用于與gRPC服務進行交互。它提供了一種簡單的方式來測試和調試gRPC服務,以及查看服務的定義和元數據。具體如何下載安裝可以參考https://github.com/fullstorydev/grpcurl。運行如下命令:
grpcurl -d '{"name": "Jack"}' -plaintext {入口網關IP地址}:8080 helloworld.Greeter/SayHello
返回以下結果,可以看到所有的請求都指向了v1。
"message": "Hello, Jack! I'm from grpc-helloworld-py-v1-79b5dc9654-cg4dq!" "message": "Hello, Jack! I'm from grpc-helloworld-py-v1-79b5dc9654-cg4dq!" "message": "Hello, Jack! I'm from grpc-helloworld-py-v1-79b5dc9654-cg4dq!" "message": "Hello, Jack! I'm from grpc-helloworld-py-v1-79b5dc9654-cg4dq!" "message": "Hello, Jack! I'm from grpc-helloworld-py-v1-79b5dc9654-cg4dq!"
步驟五:按比例將流量路由到v2
將40%的流量指向v2,其余60%的流量仍然指向v1。
登錄ASM控制臺,在左側導航欄,選擇 。
在網格管理頁面,單擊目標實例名稱,然后在左側導航欄,選擇 。
在虛擬服務頁面,在grpc-vs虛擬服務右側的操作列下,單擊查看YAML。
在編輯對話框,更新以下YAML內容,單擊確定。
.... route: - destination: host: grpc-helloworld-py port: number: 50051 subset: v1 weight: 60 - destination: host: grpc-helloworld-py port: number: 50051 subset: v2 weight: 40
繼續使用grpcurl執行以下命令,訪問網格內的gRPC服務。
grpcurl -d '{"name": "Jack"}' -plaintext {入口網關IP地址}:8080 helloworld.Greeter/SayHello
返回以下結果,可以看到40%的流量指向了v2。
說明您的測試結果不一定總是100次中有40次指向v2,但從總體比例來看,將接近40%。
"message": "Hello, Jack! I'm from grpc-helloworld-py-v1-79b5dc9654-cg4dq!" "message": "Hello, Jack! I'm from grpc-helloworld-py-v1-79b5dc9654-cg4dq!" "message": "Hello, Jack! I'm from grpc-helloworld-py-v2-7f56b49b7f-9vvr7!" "message": "Hello, Jack! I'm from grpc-helloworld-py-v1-79b5dc9654-cg4dq!" "message": "Hello, Jack! I'm from grpc-helloworld-py-v2-7f56b49b7f-9vvr7!" "message": "Hello, Jack! I'm from grpc-helloworld-py-v1-79b5dc9654-cg4dq!" "message": "Hello, Jack! I'm from grpc-helloworld-py-v2-7f56b49b7f-9vvr7!" "message": "Hello, Jack! I'm from grpc-helloworld-py-v1-79b5dc9654-cg4dq!" "message": "Hello, Jack! I'm from grpc-helloworld-py-v2-7f56b49b7f-9vvr7!" "message": "Hello, Jack! I'm from grpc-helloworld-py-v1-79b5dc9654-cg4dq!"