过去几天一直被这个错误卡住!
我有一个HTTP服务器,旨在通过客户端与gRPC服务器连接。当我启动gRPC服务器并启动HTTP服务器时,它在我的本地机器上运行良好。但是,当我尝试在集群中部署它时,HTTP服务器无法连接错误消息error receiving stream from timer rpc error: code = Unavailable desc = connection error: desc = "transport: Error while dialing dial tcp 10.109.237.114:5996: connect: connection refused"
我发现特别奇怪的是,如果我从集群转发gRPC服务器,我的本地HTTP服务器连接到它很好。检查集群内的连接,我可以看到端口是打开的,但它仍然拒绝连接。netstat巡检图像
指出
- 在minikube和DOKS上体验这个问题
- 在M1 mac上构建这些图像。
- 没有gRPC认证=>
rpc.DialContext(ctx, serverAddress, grpc.WithTransportCredentials(insecure.NewCredentials()))
GRPC SERVER FILE
apiVersion: apps/v1
kind: Deployment
metadata:
name: x-service
labels:
type: xx
service: x-svc
spec:
replicas: 1
selector:
matchLabels:
type: xx
service: x-svc
template:
metadata:
labels:
type:xx
service: x-svc
spec:
containers:
- name: x-api
image: x/image
---
apiVersion: v1
kind: Service
metadata:
name: x-service
spec:
ports:
- protocol: TCP
port: 5996
targetPort: 5996
selector:
type: xx
service: x-svc
HTTP SERVER FILE
apiVersion: apps/v1
kind: Deployment
metadata:
name: b-service
labels:
type: be
service: be-svc
spec:
replicas: 1
selector:
matchLabels:
type: be
service: be-svc
template:
metadata:
labels:
type: be
service: be-svc
spec:
containers:
- name: bapi
image: x/grpc
imagePullPolicy: Always
env:
- name: X_ADDRESS
value: x-service:5996
---
apiVersion: v1
kind: Service
metadata:
name: b-api-svc
spec:
type: NodePort
ports:
- port: 8080
selector:
type: be
service: be-svc
几天前,我遇到了和你类似的情况:在本地,您可以通过端口转发与gRPC服务通信,但它无法在集群内(pod之间)通信">
如果两个pod都在同一个集群中,您应该使用服务名称和端口号,而不是主机名。在您的情况下,这应该是x-service:5996
。如果有名称空间,应该是x-service.<enter-namespace-here>:5996
在Java上下文中,您的代码应该类似于:
ManagedChannel channel = ManagedChannelBuilder
.forTarget("x-service:5996")
.usePlaintext()
.build();
如果我是正确的,在k8s集群中,您的pod可以使用它们的服务名称(和端口)相互交互。但是,如果您想通过Ingress建立通信,请查看此文档https://doc.traefik.io/traefik/routing/providers/kubernetes-ingress/
希望对你有帮助。