我已经在Go中实现了gRPC客户端服务器。现在,我已经在Kubernetes中将它们设置为客户端和服务器Pod,客户端连接到服务器。我已经在PC上使用流浪汉(centos / 7)设置了该群集。我的问题是客户端希望访问端口8090(此端口上服务的服务器)并向服务器发送消息,但是由于它们位于不同的Pod中,因此客户端无法访问localhost 8090,因此Pod失败。我该如何解决这个问题?
func main() {
conn, err := grpc.Dial(":8090", grpc.WithInsecure())
if err != nil {
log.Fatalf("did not connect :%v", err)
}
cli := proto.NewPingClient(conn)
如图所示,它尝试拨打8090,但无法将其映射到服务器Pod的本地主机。
答案 0 :(得分:1)
localhost
仅可用于寻址在单个Pod中运行的一组容器。
Pod到Pod的通信应通过Service。
以下示例服务会将流量转发到所有标有app: grpc-app
的Pod。
apiVersion: v1
kind: Service
metadata:
name: grpc-service
spec:
selector:
app: grpc-app
ports:
- protocol: TCP
port: 8090
targetPort: 8090
然后,您将具有DNS主机名来访问服务。
grpc-service.<namespace>.svc.<cluster-domain>
通常是
grpc-service.default.svc.cluster.local
func main() {
conn, err := grpc.Dial("name-of-your-grpc-service:8090", grpc.WithInsecure())
if err != nil {
log.Fatalf("did not connect :%v", err)
}
cli := proto.NewPingClient(conn)
答案 1 :(得分:0)
不能,您需要使用kubernetes服务对象,然后使用dns将代理的IP获取到另一个Pod。 Pod在同一Pod的容器之间在自己内部共享localhost,仅此而已。
答案 2 :(得分:0)
此问题的最标准解决方案是忘记连接到localhost,然后创建连接到同一名称空间中所选服务器pod的ClusterIP服务:
apiVersion: v1
kind: Service
metadata:
name: server-service
labels:
app: your-label
spec:
type: ClusterIP
ports:
- port: 8090
targetPort: 8090
protocol: TCP
selector:
app: your-label
请记住在广告连播说明中使用相同的metadata.labels.app
值,否则两者将不会相互连接。
如果您已正确配置群集,并且CoreDNS已启动并正在运行,并且您在同一命名空间中运行客户端和服务器Pod,则应该能够使用server-service:8090
访问服务器。