gpt4 book ai didi

java - kubernetes 中的 Grpc 连接不起作用 => 不可用 : Network closed for unknown reason

转载 作者:行者123 更新时间:2023-12-02 11:42:24 25 4
gpt4 key购买 nike

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

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

如何复现?

  • 只需运行./start.bat
  • 然后我创建我的部署并在 kubectl 上公开它们。
  • 您可以使用此地址访问该服务:http://localhost:8080/hello?firstName=cedric但它不起作用:'(
  • 我添加了第二种方法 (http://localhost:8080/check?address=host.docker.internal&port=8081) 来尝试不同的地址/端口组合来连接到服务器,但它始终不起作用。
  • 我还尝试了两个公开服务之间的简单 http 连接并且工作正常,所以不仅仅是 ip/port 不匹配:(

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

最佳答案

  • 您的部署 yaml 缺少将流量适本地路由到 pod 的服务部分。
  • 此外,部署不会传递 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

如果您有任何问题,请在评论中告诉我!

关于java - kubernetes 中的 Grpc 连接不起作用 => 不可用 : Network closed for unknown reason,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62512989/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com