您可以通過ASM入口網關安全地訪問網格內的gRPC服務,實現對gRPC服務的精確存取控制,提升服務治理能力,保障服務間通訊的安全性。本文介紹如何通過入口網關訪問網格內gRPC服務,並在gRPC的兩個版本之間進行流量切換。
前提條件
步驟一:部署樣本應用
部署名為istio-grpc-server-v1和istio-grpc-server-v2的樣本應用。
建立app.yaml。
部署應用。
kubectl apply -f app.yaml
步驟二:設定路由規則
建立網關規則、虛擬服務和目標規則,將流量全部指向istio-grpc-server-v1。
建立rules.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: - "*" --- 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" --- 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部署規則。
kubectl apply -f rules.yaml
步驟三:部署新入口網關或複用已有入口網關
建立入口網關
建立入口網關,在配置連接埠映射時添加8080連接埠。
為已有入口網關添加8080連接埠
登入ASM控制台,在左側導覽列,選擇。
在網格管理頁面,單擊目標執行個體名稱,然後在左側導覽列,選擇。
在入口網關頁面,單擊目標網關名稱,在網關概覽頁面的基本選項地區,單擊連接埠配置右側的
表徵圖,在連接埠映射對話方塊,單擊添加連接埠,設定協議為TCP,服務連接埠為8080,然後單擊確認。
步驟四:運行gRPC用戶端
安裝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。
編輯虛擬服務。
kubectl edit VirtualService grpc-vs按照以下內容修改
route部分並儲存。.... 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!"