我有一个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” });
有人可以告诉我我是否完全错误或缺少明显的内容:)
答案 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内的容器可以通过服务名进行对话,因此无需将服务类型添加为clusterIP
和Nodeport
答案 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并相应地检查与目标后端服务的连接。