通過ASM入口網(wǎng)關(guān)訪問網(wǎng)格內(nèi)gRPC服務(wù)
您可以通過ASM入口網(wǎng)關(guān)安全地訪問網(wǎng)格內(nèi)的gRPC服務(wù),實(shí)現(xiàn)對(duì)gRPC服務(wù)的精確訪問控制,提升服務(wù)治理能力,保障服務(wù)間通信的安全性。本文介紹如何通過入口網(wǎng)關(guān)訪問網(wǎng)格內(nèi)gRPC服務(wù),并在gRPC的兩個(gè)版本之間進(jìn)行流量切換。
前提條件
已部署應(yīng)用到ASM實(shí)例關(guān)聯(lián)的集群,且ASM實(shí)例為最新版本的企業(yè)版或旗艦版實(shí)例。具體操作,請(qǐng)參見在ASM實(shí)例關(guān)聯(lián)的集群中部署應(yīng)用。
步驟一:部署示例應(yīng)用
部署名為istio-grpc-server-v1和istio-grpc-server-v2的示例應(yīng)用。
登錄容器服務(wù)管理控制臺(tái),在左側(cè)導(dǎo)航欄選擇集群。
在集群列表頁面,單擊目標(biāo)集群名稱,然后在左側(cè)導(dǎo)航欄,選擇 。
在無狀態(tài)頁面上方,選擇目標(biāo)命名空間,然后在右上角單擊使用YAML創(chuàng)建資源。
說明當(dāng)前選中的命名空間應(yīng)當(dāng)已標(biāo)注自動(dòng)注入Sidecar,即包含istio-injection=enabled標(biāo)簽。具體操作,請(qǐng)參見啟用自動(dòng)注入。
在創(chuàng)建頁面,選擇自定義示例模板,配置以下YAML,然后單擊創(chuàng)建。
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
步驟二:設(shè)置服務(wù)網(wǎng)格ASM的路由規(guī)則
設(shè)置服務(wù)網(wǎng)格的服務(wù)網(wǎng)關(guān)、虛擬服務(wù)和目標(biāo)規(guī)則,將流量全部指向istio-grpc-server-v1。
登錄ASM控制臺(tái),在左側(cè)導(dǎo)航欄,選擇 。
在網(wǎng)格管理頁面,找到待配置的實(shí)例,單擊實(shí)例的名稱或在操作列中單擊管理。
創(chuàng)建網(wǎng)關(guān)規(guī)則。
在網(wǎng)格詳情頁面左側(cè)導(dǎo)航欄,選擇 ,然后在右側(cè)頁面,單擊使用YAML創(chuàng)建。
在創(chuàng)建頁面,設(shè)置命名空間為default,選擇任意場景模版,配置以下YAML,然后單擊創(chuàng)建。
apiVersion: networking.istio.io/v1beta1 kind: Gateway metadata: name: grpc-gateway spec: selector: istio: ingressgateway servers: - port: number: 8080 name: grpc protocol: GRPC hosts: - "*"
創(chuàng)建目標(biāo)規(guī)則。
在網(wǎng)格詳情頁面左側(cè)導(dǎo)航欄,選擇 ,然后在右側(cè)頁面,單擊使用YAML創(chuàng)建。
在創(chuàng)建頁面,設(shè)置命名空間為default,選擇任意場景模版,配置以下YAML,然后單擊創(chuàng)建。
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"
創(chuàng)建虛擬服務(wù)。
在網(wǎng)格詳情頁面左側(cè)導(dǎo)航欄,選擇 ,然后在右側(cè)頁面,單擊使用YAML創(chuàng)建。
在創(chuàng)建頁面,設(shè)置命名空間為default,選擇任意場景模版,配置以下YAML,然后單擊創(chuàng)建。
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
步驟三:部署新入口網(wǎng)關(guān)或復(fù)用已有入口網(wǎng)關(guān)
在入口網(wǎng)關(guān)中,如果不存在8080端口,需要添加8080端口。
新建入口網(wǎng)關(guān)
登錄ASM控制臺(tái),在左側(cè)導(dǎo)航欄,選擇 。
在網(wǎng)格管理頁面,單擊目標(biāo)實(shí)例名稱,然后在左側(cè)導(dǎo)航欄,選擇 。
在入口網(wǎng)關(guān)頁面,單擊創(chuàng)建,配置相關(guān)信息,然后單擊創(chuàng)建。
部分配置項(xiàng)說明如下。關(guān)于配置項(xiàng)的更多信息,請(qǐng)參見入口網(wǎng)關(guān)配置項(xiàng)說明。
配置項(xiàng)
說明
部署集群
選擇要部署入口網(wǎng)關(guān)的集群。
負(fù)載均衡CLB類型
此處指定負(fù)載均衡的類型為公網(wǎng)訪問。
負(fù)載均衡
選擇負(fù)載均衡。
使用已有負(fù)載均衡:從已有負(fù)載均衡列表中選擇。
新建負(fù)載均衡CLB:單擊新建負(fù)載均衡CLB,從下拉列表中選擇所需的負(fù)載均衡規(guī)格。
說明建議您為每個(gè)Kubernetes服務(wù)分配一個(gè)CLB。如果多個(gè)Kubernetes服務(wù)復(fù)用同一個(gè)CLB,存在以下風(fēng)險(xiǎn)和限制:
使用已有的CLB會(huì)強(qiáng)制覆蓋已有監(jiān)聽,可能會(huì)導(dǎo)致您的應(yīng)用不可訪問。
Kubernetes通過Service創(chuàng)建的CLB不能復(fù)用,只能復(fù)用您手動(dòng)在控制臺(tái)(或調(diào)用OpenAPI)創(chuàng)建的CLB。
復(fù)用同一個(gè)CLB的多個(gè)Service不能有相同的前端監(jiān)聽端口,否則會(huì)造成端口沖突。
復(fù)用CLB時(shí),監(jiān)聽的名字以及虛擬服務(wù)器組的名字被Kubernetes作為唯一標(biāo)識(shí)符。請(qǐng)勿修改監(jiān)聽和虛擬服務(wù)器組的名字。
不支持跨集群復(fù)用CLB。
端口映射
設(shè)置協(xié)議為TCP,服務(wù)端口為8080。
在已有入口網(wǎng)關(guān)添加8080端口
登錄ASM控制臺(tái),在左側(cè)導(dǎo)航欄,選擇 。
在網(wǎng)格管理頁面,單擊目標(biāo)實(shí)例名稱,然后在左側(cè)導(dǎo)航欄,選擇 。
在入口網(wǎng)關(guān)頁面,單擊目標(biāo)網(wǎng)關(guān)名稱,在網(wǎng)關(guān)詳情頁面的基本選項(xiàng)區(qū)域,單擊端口配置右側(cè)的圖標(biāo),在端口映射對(duì)話框,單擊添加端口,設(shè)置協(xié)議為TCP,服務(wù)端口為8080,然后單擊確認(rèn)。
步驟四:運(yùn)行g(shù)RPC客戶端
grpcurl是一個(gè)命令行工具,用于與gRPC服務(wù)進(jìn)行交互。它提供了一種簡單的方式來測試和調(diào)試gRPC服務(wù),以及查看服務(wù)的定義和元數(shù)據(jù)。具體如何下載安裝可以參考https://github.com/fullstorydev/grpcurl。運(yùn)行如下命令:
grpcurl -d '{"name": "Jack"}' -plaintext {入口網(wǎng)關(guān)IP地址}:8080 helloworld.Greeter/SayHello
返回以下結(jié)果,可以看到所有的請(qǐng)求都指向了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控制臺(tái),在左側(cè)導(dǎo)航欄,選擇 。
在網(wǎng)格管理頁面,單擊目標(biāo)實(shí)例名稱,然后在左側(cè)導(dǎo)航欄,選擇 。
在虛擬服務(wù)頁面,在grpc-vs虛擬服務(wù)右側(cè)的操作列下,單擊查看YAML。
在編輯對(duì)話框,更新以下YAML內(nèi)容,單擊確定。
.... 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
繼續(xù)使用grpcurl執(zhí)行以下命令,訪問網(wǎng)格內(nèi)的gRPC服務(wù)。
grpcurl -d '{"name": "Jack"}' -plaintext {入口網(wǎng)關(guān)IP地址}:8080 helloworld.Greeter/SayHello
返回以下結(jié)果,可以看到40%的流量指向了v2。
說明您的測試結(jié)果不一定總是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!"