我有一个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”);
任何人都可以告诉我,如果我完全错了或缺少明显的东西请:)
在这部分入口服务名称中,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内的容器可以通过服务名称进行交谈,无需添加服务类型clusterIP
&Nodeport
我这里没有什么顾虑。
正如@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并相应地检查与目标后端服务的连接。