目录
Please enable Javascript to view the contents

Kubernetes-ingress-nginx 配置 gRPC 服务

 ·  ☕ 1 分钟

重要

ingress-nginx 暴露 gRPC 服务时要求必须使用 TLS。两种方案:

方案证书位置适用场景
gRPCS(后端 TLS)服务端自己管理证书微服务内部已统一证书
gRPC(ingress TLS 终结)Ingress 统一管理证书运维集中管理,推荐

1.简介

gRPC 使用 HTTP/2 传输。ingress-nginx 的 gRPC 支持通过 annotation 开启,后端端口必须标记为 gRPC 协议。

2.说明

2.1 整体流程

1
2
3
4
5
客户端 gRPC 请求(TLS)
Ingress(TLS 终结,cert-manager 自动签发证书)
    ↓ annotation: nginx.ingress.kubernetes.io/backend-protocol: "GRPC"
后端 gRPC Service(HTTP/2,纯文本)

2.2 前置:cert-manager 配置

ClusterIssuer 签发证书:

1
2
3
4
5
6
7
apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
  name: ca-issuer
spec:
  ca:
    secretName: ca-key-pair

Certificate 申请证书:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
apiVersion: cert-manager.io/v1
kind: Certificate
metadata:
  name: grpc-cert
spec:
  secretName: grpc-tls
  dnsNames:
    - grpc.example.com
  issuerRef:
    name: ca-issuer
    kind: ClusterIssuer

2.3 Ingress 配置

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: grpc-ingress
  annotations:
    nginx.ingress.kubernetes.io/backend-protocol: "GRPC"
spec:
  tls:
    - hosts:
        - grpc.example.com
      secretName: grpc-tls
  rules:
    - host: grpc.example.com
      http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: grpc-service
                port:
                  number: 50051

关键配置:

配置说明
backend-protocol: GRPC告诉 ingress-nginx 使用 HTTP/2 连接后端
tls.secretNamecert-manager 自动生成的证书 Secret

2.4 测试

1
grpcurl -insecure grpc.example.com:443 build.stack.fortune.FortuneTeller/Predict

3.总结

  1. gRPC over ingress-nginx 必须带 TLS;
  2. 推荐 ingess TLS 终结方案——证书由 cert-manager 统一管理;
  3. backend-protocol: GRPC annotation 是关键,缺少会报协议不匹配。

4.参考

分享

Hex
作者
Hex
CloudNative Developer