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
如何复现?
- 就运行
./start.bat
- 然后我创建我的部署并在 kubectl 上公开它们。
- 您可以使用此地址访问该服务:
http://localhost:8080/hello?firstName=cedric
但它不起作用:'(
- 我添加了第二种方法 (http://localhost:8080/check?address=host.docker.internal&port=8081) 来尝试不同的 address/port 组合来连接到服务器,但它始终无法正常工作.
- 我还尝试了两个公开服务之间的简单 http 连接,它工作正常,所以不只是 ip/port 不匹配:(
如果您对如何使 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
如有任何疑问,请在评论中告诉我!
我在 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) 来尝试不同的 address/port 组合来连接到服务器,但它始终无法正常工作.
- 我还尝试了两个公开服务之间的简单 http 连接,它工作正常,所以不只是 ip/port 不匹配:(
如果您对如何使 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
如有任何疑问,请在评论中告诉我!