如何将数据从Pod中的容器发送到单独Pod中的容器 - 在同一个集群中?

问题描述 投票:1回答:2

我有一个React前端和一个node.js后端。每个都位于k8中同一群集内的不同Pod中的独立容器中。我想在它们之间发送数据而不必使用IP地址。我知道Kubernetes有一个功能,可以让你在同一个集群内的pod之间进行通信,我认为它与创建的Service文件中定义的选择器标签有关。

我为我的React应用程序创建了一个ClusterIp服务,为我的服务器创建了另一个ClusterIp。我为我的应用程序创建了一个入口文件。我知道我的入口工作,因为我可以访问我的用户界面,我可以点击我的服务器的健康检查端点 - 所以我知道他们正确地暴露在外面的世界。我的问题是如何在k8内部进行内部通信

在我的反应应用程序中,我试图编写axios.post(“/ api / test”,{value:“TestValue”});但是我的api / test服务器中的端点永远不会受到影响。

Backend Server Cluster IP - - - - 
    
    

apiVersion: v1
kind: Service
metadata:
  name: server-model-cluster-ip-service
spec:
  type: ClusterIP
  selector:
    component: server-model
  ports:
    - port: 8050
      targetPort: 8050

React UI Cluster IP - - - - apiVersion: v1 kind: Service metadata: name: react-ui-cluster-ip-service spec: type: ClusterIP selector: component: react-ui ports: - port: 3000 targetPort: 3000

入口文件 - - - - -

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: ingress-service
  annotations:
    kubernetes.io/ingress.class: nginx
    nginx.ingress.kubernetes.io/rewrite-target: /$1
spec:
  rules:
    - http:
        paths:
          - path: /api/?(.*)
            backend:
              serviceName: react-ui-cluster-ip-service
              servicePort: 8050
          - path: /server/?(.*)
            backend:
              serviceName: server-model-cluster-ip-service
              servicePort: 8050

我理解标签选择器是将我的React Cluster IP映射到我的UI的部署,将我的服务器集群IP映射到我的服务器部署。我很瘦我说我可以使用选择器以某种方式将轴/ http请求发送到其他pod如...

axiompost(“/ RECEIVE / api / test”,{jack:“Test”);

任何人都可以告诉我,如果我完全错了或缺少明显的东西请:)

kubernetes google-cloud-platform
2个回答
0
投票

在这部分入口服务名称中,react-ui-cluster-ip-service就是在服务规范文件中提到的3000端口上运行的。

但是你正在向正确的服务名称发送流量,但端口是错误的。

   - path: /api/?(.*)
                backend:
                  serviceName: react-ui-cluster-ip-service
                  servicePort: 8050

我认为由于这个原因,你无法向/api/?发送请求

从服务规范文件中,您还可以删除type:clusterIP,并且可以使用唯一的服务名称来解析kubernetes集群中的服务。

回答你的问题标题:容器与pod可以在localhost上交谈,而separtate pod内的容器可以通过服务名称进行交谈,无需添加服务类型clusterIPNodeport


0
投票

我这里没有什么顾虑。

正如@Harsh Manvar在他的回答中提到的,Kubernetes代表了发现内部services的机制,它通过IP地址或相关的DNS服务名称保证同一集群内的Pod之间的相互通信。因此,您可以从特定的前端Pod到达您的后端服务器。不涉及Ingress,因为Ingress控制器保留为边缘路由器,并将来自群集外部的HTTP和HTTPS网络流量暴露给相应的Kubernetes服务。

您还在Ingress对象中使用了基于特定路径的路由规则的重写表达式。在这种情况下,重写似乎是以下列方式产生的:server-model-cluster-ip-service/api/test重写为server-model-cluster-ip-service/test URI,这应该是您后端服务的最终路径占位符。实际上,您从React UI Pod调用axios.post("server-model-cluster-ip-service/api/test", { value: "TestValue" })请求可能无法命中目标后端服务。

我只是给了一些点来考虑如何继续进行更进一步的troubleshooting,至少你可以登录到前端Pod并相应地检查与目标后端服务的连接。

© www.soinside.com 2019 - 2024. All rights reserved.