我必须在minikube中的两个POD之间进行通信,这两个POD暴露在两个不同的端口中,但是在单个节点中。
例如:
现在,它在kubernetes中动态分配端口,例如:POD A:30069和POD B:30070
这里的问题:从POD A(30069)访问POD B时,它不会自动映射POD B的kubernetes端口(30070)。而是POD B尝试在8761端口中打开。
很抱歉,如果我的描述令人困惑。如果您无法回答我的问题,请随时重新检查。
感谢您的帮助
答案 0 :(得分:6)
我必须在minikube中的两个POD之间进行通信,这两个POD暴露在两个不同的端口中,但是在单个节点中。
基于您要进行Pod间通信且Pod驻留在同一节点上的事实,您可能会采用几种(相当可疑且脆弱的)方法,例如主机名和nodePort暴露。为了更符合kubernetes的方法和建议,我建议使用Service而不是直接从Pod级别公开端口。
您可以在the official documenatation中阅读有关服务的更多信息,服务使用示例如下:
kind: Service
apiVersion: v1
metadata:
name: my-pod-b-service
spec:
selector:
app: MyPodBApp
ports:
- protocol: TCP
port: 80
targetPort: 8761
此规范将创建一个名为my-pod-b-service
的新服务对象,该对象针对带有app=MyPodBApp
标签的任何Pod上的TCP端口8761。有了来自Pod A的主机my-pod-b-service
和端口80
的任何请求,端口B 8761
上的Pod B就会为它服务(请注意,port和targetPort可以相同,只是一个例子)。
作为旁注,对于吊舱A,您将具有以下内容:
kind: Service
apiVersion: v1
metadata:
name: my-pod-a-service
spec:
selector:
app: MyPodAApp
ports:
- protocol: TCP
port: 80
targetPort: 8080
既然您将服务定位为目标,就可以将相同的传入端口(80)映射到这两个服务,并且只要在Pod上正确设置了Pod选择器,kubernetes就会注意将每个端口都连接到适当的Pod。
答案 1 :(得分:0)
如果部署和服务名称之间存在正确的映射,则只需使用对name:port的curl请求即可进行通信。
例如,
创建部署
kubectl create deployment hello-node --image=gcr.io/hello-minikube-zero-install/hello-node
将其暴露在端口8080上
kubectl expose deployment hello-node --type=NodePort --port=8080
另一个具有相同映像但名称不同的部署
create deployment hello-node2 --image=gcr.io/hello-minikube-zero-install/hello-node
将其暴露在端口8080上暴露部署hello-node2 --type = NodePort --port = 8080
获取pod并在hello-node2部署中启动一个终端
kubectl get pods
kubectl exec -it <hello-node2-pod-name> -- /bin/bash
您将进入hello world 2 pod的容器
curl hello-node:8080 returns Hello World!
如果仔细看,kubectl还可以描述服务hello-node
为您提供一个IP字段(这是终结点的不同形式)。这实际上是用于与Pod通信的公开IP。这意味着您可以在hello world 2容器中运行
curl <IP from service> : 8080
返回Hello World!
希望这会有所帮助。