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

时间:2019-04-24 21:19:21

标签: kubernetes google-cloud-platform

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

我为我的React应用程序创建了一个ClusterIp服务,为我的服务器创建了另一个ClusterIp。我已经为我的应用程序创建了一个入口文件。我知道我的入口可以访问我的UI,并且可以访问服务器的运行状况检查终结点-因此我知道它们正确地暴露在外界中。我的问题是如何在k8内部进行内部沟通

在我的React应用中,我尝试编写  axios.post(“ / api / test”,{       值:“ 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

反应UI群集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的Deployment,以及将我的Server Cluster IP映射到我的Server的Deployment的映射。我说的很对,我可以使用选择器以某种方式将axis / http请求发送到其他Pod,例如

axios.post(“ / PODNAME / api / test”,{       值:“ TestValue”     });

有人可以告诉我我是否完全错误或缺少明显的内容:)

2 个答案:

答案 0 :(得分:0)

正如您在服务规范文件中提到的,入口服务名称react-ui-cluster-ip-service的此部分位于端口3000上。

但是在您中,您正在将流量发送到正确的服务名称,但是端口是错误的。

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

我认为由于这个原因,您无法将请求发送到/api/?

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

您的问题的答案:带有pod的容器可以在localhost上进行对话,而单独的pod内的容器可以通过服务名进行对话,因此无需将服务类型添加为clusterIPNodeport

答案 1 :(得分:0)

我这里没什么问题。

正如@Harsh Manvar在他的回答中提到的那样,Kubernetes代表一种发现内部services的机制,该机制可以通过IP地址或相关的DNS服务名称来保证同一群集中Pod之间的相互通信。因此,您可能能够在不涉及Ingress的情况下从特定的前端Pod到达后端服务器,因为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并相应地检查与目标后端服务的连接。