如果您的服務採用分布式架構,您可以使用gRPC協議提升用戶端與伺服器端的通訊效率。將使用gRPC協議的服務部署在Nginx Ingress Controller的後端時,您需要對Ingress資源進行特殊的配置。
背景資訊
gRPC(Google Remote Procedure Call)是一個基於HTTP/2協議標準和ProtoBuf(Protocol Buffers)序列化協議設計的遠端程序呼叫(RPC)架構。它由Google開源,支援在多語言開發的平台上使用。其因其高效、靈活和跨語言的特性,gRPC適用於分布式系統和微服務架構情境,例如微服務間調用、物聯網裝置間通訊、使用複雜資料結構的遠程API服務等。
前提條件
已安裝Nginx Ingress Controller組件,且組件版本為0.22.0及以上。具體操作,請參見管理Nginx Ingress Controller組件。
已通過kubectl工具串連叢集。具體操作,請參見擷取叢集KubeConfig並通過kubectl工具串連叢集。
已安裝gRPCurl工具。具體操作,請參見gRPCurl。
已擷取到可信的數位憑證。您可以從以下幾個途徑擷取數位憑證:
從阿里雲數位憑證中心購買認證。具體操作,請參見購買SSL認證。
從其他CA購買的認證。
(可選)參照本文中的(可選)產生自我簽署憑證產生自我簽署憑證。
步驟一:將SSL認證儲存到叢集Secret資源中
使用Nginx Ingress Controller時,gRPC服務只運行在HTTPS連接埠(預設443)上,因此需要使用SSL認證。認證需要以Secret資源的方式儲存在叢集中。
執行以下命令,將認證通過grpc-secret
添加到叢集中。
kubectl create secret tls grpc-secret --key grpc.key --cert grpc.crt # grpc.key替換為您的認證檔案,grpc.crt替換為您的私密金鑰檔案
步驟二:建立gRPC服務
建立並將以下內容拷貝到grpc.yaml檔案中。
apiVersion: apps/v1 kind: Deployment metadata: name: grpc-service spec: replicas: 1 selector: matchLabels: run: grpc-service template: metadata: labels: run: grpc-service spec: containers: - image: registry.cn-hangzhou.aliyuncs.com/acs-sample/grpc-server:latest imagePullPolicy: Always name: grpc-service ports: - containerPort: 50051 protocol: TCP restartPolicy: Always --- apiVersion: v1 kind: Service metadata: name: grpc-service spec: ports: - port: 50051 protocol: TCP targetPort: 50051 selector: run: grpc-service sessionAffinity: None type: NodePort
執行以下命令建立gRPC服務。
kubectl apply -f grpc.yaml
預期輸出:
deployment.apps/grpc-service created service/grpc-service created
步驟三:建立Ingress
建立並拷貝以下內容到grpc-ingress.yaml檔案中。
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: grpc-ingress annotations: # 必須指明後端服務為gRPC服務 nginx.ingress.kubernetes.io/backend-protocol: "GRPC" spec: # 指定通過Secret儲存的SSL認證 tls: - hosts: - grpc.example.com secretName: grpc-secret rules: - host: grpc.example.com # gRPC服務網域名稱,替換為您的網域名稱 http: paths: - path: / pathType: Prefix backend: service: # gRPC服務 name: grpc-service port: number: 50051
重要由於Nginx grpc_pass的限制,目前對於gRPC服務,暫不支援service-weight的配置。
執行以下命令建立Ingress。
kubectl apply -f grpc-ingress.yaml
預期輸出:
ingress.networking.k8s.io/grpc-ingress created
步驟四:效果驗證
執行以下命令,查看Ingress資訊。
kubectl get ingress
預期輸出:
NAME CLASS HOSTS ADDRESS PORTS AGE grpc-ingress nginx grpc.example.com 139.196.***** 80, 443 3m51s
記錄
ADDRESS
對應的IP地址。使用grpcurl串連服務。
grpcurl -insecure -authority grpc.example.com <IP_ADDRESS>:443 list # <IP_ADDRESS>替換為上一步中記錄的IP地址
輸出如下,表明流量被Ingress成功轉寄到後端gRPC服務:
grpc.reflection.v1alpha.ServerReflection helloworld.Greeter
相關文檔
關於如何通過Nginx Ingress Controller實現gRPC服務的灰階發布,請參見通過Nginx Ingress實現灰階發布和藍綠髮布。
Nginx Ingress Controller支援鏈路追蹤。具體操作,請參見實現Nginx Ingress Controller組件的鏈路追蹤。