如果您的服务采用分布式架构,您可以使用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组件的链路追踪。