您可以通過ASM入口網關安全地訪問網格內的gRPC服務,實現對gRPC服務的精確存取控制,提升服務治理能力,保障服務間通訊的安全性。本文介紹如何通過入口網關訪問網格內gRPC服務,並在gRPC的兩個版本之間進行流量切換。
前提條件
已建立入口網關。
已部署應用到ASM企業版或旗艦版執行個體,且執行個體為最新版本。具體操作,請參見部署應用到ASM執行個體。
步驟一:部署樣本應用
部署名為istio-grpc-server-v1和istio-grpc-server-v2的樣本應用。
登入Container Service管理主控台,在左側導覽列選擇叢集。
在叢集列表頁面,單擊目的地組群名稱,然後在左側導覽列,選擇 。
在無狀態頁面上方,選擇目標命名空間,然後在右上方單擊使用YAML建立資源。
說明當前選中的命名空間應當已標註自動注入Sidecar,即包含istio-injection=enabled標籤。具體操作,請參見啟用自動注入。
在建立頁面,選擇自訂樣本模板,配置以下YAML,然後單擊建立。
步驟二:設定Service MeshASM的路由規則
設定Service Mesh的服務網關、虛擬服務和目標規則,將流量全部指向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,然後單擊建立。
步驟三:部署新入口網關或複用已有入口網關
在入口網關中,如果不存在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!"