kubernetes 中的 Grpc 连接不起作用 => 不可用:网络因未知原因关闭

Grpc connection in kubernetes is not working =>UNAVAILABLE: Network closed for unknown reason

我在 kubernetes 上的 grpc 通信有问题。我有一个 java 客户端调用一个简单的 helloworld grpc 服务(也在 java 中)。在 Docker 中一切正常,但在 kubernetes 中却不行 :'(.

您可以在此处获取完整代码:https://github.com/hagakure/testgrpc

如何复现?

如果您对如何使 grpc 在 kubernetes 中工作有任何线索,感谢您的帮助。

  • 您的部署 yaml 缺少将流量适当路由到 pods 的服务部分。
  • 此外,部署没有传递 docker-compose.yml 中指定的环境变量。这是固定的 yaml。
  • deployment_server.yml:
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app.kubernetes.io/name: grpc-server
  name: grpc-server
spec:
  replicas: 1
  selector:
    matchLabels:
      app.kubernetes.io/name: grpc-server
  template:
    metadata:
      labels:
        app.kubernetes.io/name: grpc-server
    spec:
      containers:
      - image: poc_grpc-server:latest
        imagePullPolicy: Never
        name: grpc-server
        ports:
        - containerPort: 8081
        env:
        - name: GRPC_SERVER_PORT
          value: "8081"
---
apiVersion: v1
kind: Service
metadata:
  name: grpc-server-svc
spec:
  selector:
    app.kubernetes.io/name: grpc-server
  ports:
    - protocol: TCP
      port: 8081
  • deployment_client.yml:
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app.kubernetes.io/name: grpc-client
  name: grpc-client
spec:
  replicas: 1
  selector:
    matchLabels:
      app.kubernetes.io/name: grpc-client
  template:
    metadata:
      labels:
        app.kubernetes.io/name: grpc-client
    spec:
      containers:
      - image: poc_grpc-client
        imagePullPolicy: Never
        name: grpc-client
        ports:
        - containerPort: 8080
        env: 
          - name: GRPC_SERVER_ADDRESS
            value: "grpc-server-svc"
          - name: GRPC_SERVER_PORT
            value: "8081"
---
apiVersion: v1
kind: Service
metadata:
  name: grpc-client-svc
spec:
  selector:
    app.kubernetes.io/name: grpc-client
  ports:
    - protocol: TCP
      port: 8080
  type: NodePort

亮点:

  • 创建了 grpc-server-svc 服务作为 ClusterIP 仅在服务于 GRPC 服务器的集群内可用。
  • NodePort 创建了 grpc-client-svc 服务,以演示从集群外部接收 curl 请求。
  • 添加了 env 部分:请注意,我将 GRPC_SERVER_ADDRESS 设置为 grpc-server-svc 因为我们不再处于 docker 环境中 host.docker.internal 不再是一个我们现在针对上述服务的选项。
  • 我将 imagePullPolicy 设置为 Never 仅用于此示例,因为我使用的是本地 docker 注册表。

复制:

  • 构建图像后:
$ docker image ls
REPOSITORY                                TAG                 IMAGE ID            CREATED             SIZE
poc_grpc-client                           latest              7f6d886a1612        24 minutes ago      660MB
poc_grpc-server                           latest              d46bf9481d1c        24 minutes ago      658MB
  • 如上部署固定 yamls:
$ kubectl apply -f deployment_server.yml 
deployment.apps/grpc-server created
service/grpc-server-svc created

$ kubectl apply -f deployment_client.yml 
deployment.apps/grpc-client created
service/grpc-client-svc created

$ kubectl get all
NAME                               READY   STATUS    RESTARTS   AGE
pod/grpc-client-6ffcf6b6c8-846s5   1/1     Running   0          3s
pod/grpc-server-5d7fd9cb89-dkqlb   1/1     Running   0          7s

NAME                      TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)          AGE
service/grpc-client-svc   NodePort    10.99.58.76    <none>        8080:32224/TCP   3s
service/grpc-server-svc   ClusterIP   10.96.67.139   <none>        8081/TCP         7s
service/kubernetes        ClusterIP   10.96.0.1      <none>        443/TCP          3h36m

NAME                          READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/grpc-client   1/1     1            1           3s
deployment.apps/grpc-server   1/1     1            1           7s

NAME                                     DESIRED   CURRENT   READY   AGE
replicaset.apps/grpc-client-6ffcf6b6c8   1         1         1       3s
replicaset.apps/grpc-server-5d7fd9cb89   1         1         1       7s
  • 现在我将 curl 客户端,因为我在 minikube(1 节点集群)上 运行 节点的 IP 是集群的 IP,我将 IP 与 NodePort 配对已分配。
$ kubectl cluster-info
Kubernetes master is running at https://172.17.0.4

$ curl http://172.17.0.4:32224
Client is running!!!

$ curl http://172.17.0.4:32224/hello?firstName=Cedric
Hello Cedric

如有任何疑问,请在评论中告诉我!