这里验证下如何通过Ingress-NGINX控制器将流量路由到gRPC服务

前提条件:

1,已创建或者自建kubernetes集群

2,已经申请对应域名

3,已安装了ingress-nginx-controller

4,GRPC服务 可以使用go-grpc-greeter-server作为示例

5,和域名对应的SSL证书

部署gRPC应用

确保gRPC应用程序正在运行并监听连接,本示例使用镜像ccr.ccs.tencentyun.com/v_cjweichen/grpc-server:latest创建gRPC服务

复制以下YAML内容创建grpc.yaml文件

apiVersion: apps/v1
kind: Deployment
metadata:
  name: grpc-service
  namespace: nginx-ingress
spec:
  replicas: 1
  selector:
    matchLabels:
      run: grpc-service
  template:
    metadata:
      labels:
        run: grpc-service
    spec:
      containers:
      - image: ccr.ccs.tencentyun.com/chenjingwei/grpc-server:latest
        imagePullPolicy: Always
        name: grpc-service
        ports:
        - containerPort: 50051
          protocol: TCP
      imagePullSecrets:
      - name: qcloudregistrykey 
      restartPolicy: Always

为gRPC应用创建Service

apiVersion: v1
kind: Service
metadata:
  labels:
    run: grpc-service
  name: grpc-service
  namespace: default
spec:
  ports:
  - port: 50051
    protocol: TCP
    targetPort: 50051
  selector:
    run: grpc-service
  sessionAffinity: None
  type: ClusterIP

执行以下命令查看Pod

[root@VM-0-16-tlinux ~/grpc]# kubectl  get pods,svc -o wide
NAME                                READY   STATUS    RESTARTS   AGE     IP           NODE        NOMINATED NODE   READINESS GATES
pod/grpc-service-5d48b78787-hcfhf   1/1     Running   0          3m57s   172.16.0.5   10.0.0.16   <none>           <none>

NAME                   TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)     AGE     SELECTOR
service/grpc-service   ClusterIP   172.16.255.180   <none>        50051/TCP   2m41s   run=grpc-service

为gRPC应用创建ingress路由

复制以下YAML内容创建grpc-ingress.yaml文件。

注意

  • 部署gRPC服务所使用的Ingress需要在annotation中加入nginx.ingress.kubernetes.io/backend-protocol,值为GRPC
  • 本示例使用的域名为grpc.example.com,请根据实际情况修改。
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  annotations:
    kubernetes.io/ingress.class: nginx
    nginx.ingress.kubernetes.io/backend-protocol: GRPC   # 注意这里:必须要配置以指明后端服务为gRPC服务
  name: grpc-ingress
  namespace: default
spec:
  rules:
  - host: grpc.chen1900s.cn
    http:
      paths:
      - backend:
          serviceName: grpc-service
          servicePort: 50051
        path: /
        pathType: ImplementationSpecific
  tls:
  - hosts:
    - grpc.chen1900s.cn
    secretName: grpc-secret

测试连接

一旦我们将配置应用到Kubernetes上,就该测试我们是否可以实际与后端通信了。为此,我们将使用grpcurl实用测试程序:

需要提前安装grpcurl工具,grpcurl是Go语言开源社区开发的工具,需要手工安装:

wget https://github.com/fullstorydev/grpcurl/releases/download/v1.7.0/grpcurl_1.7.0_linux_x86_64.tar.gz
tar -xvf grpcurl_1.7.0_linux_x86_64.tar.gz
chmod +x grpcurl
./grpcurl -help

本示例中使用域名grpc.chen1900s.cn以及自签证书,执行以下命令验证请求是否成功转发到后端服务。

##grpcurl -insecure -authority grpc.example.com <ip_address>:443 list
##ip_address为Nginx Ingress Controller的Service外部IP


[root@VM-0-16-tlinux ~/grpc]# ./grpcurl -insecure -authority grpc.chen1900s.cn  170.106.134.2:443 list
greet.GrpcService
grpc.reflection.v1alpha.ServerReflection

从预期输出可得,流量被Ingress成功转发到后端gRPC服务

注意点:由于Nginx grpc_pass的限制,目前对于gRPC服务,暂不支持service-weight的配置

results matching ""

    No results matching ""