单个节点中的两个POD之间的通信(minikube)

时间:2018-06-26 11:20:32

标签: docker kubernetes devops minikube

我必须在minikube中的两个POD之间进行通信,这两个POD暴露在两个不同的端口中,但是在单个节点中。

例如:

  • POD A使用8080端口,这是登录页面。
  • 我们从POD A通过使用8761端口的超链接访问PODB。

现在,它在kubernetes中动态分配端口,例如:POD A:30069和POD B:30070

这里的问题:从POD A(30069)访问POD B时,它不会自动映射POD B的kubernetes端口(30070)。而是POD B尝试在8761端口中打开。

很抱歉,如果我的描述令人困惑。如果您无法回答我的问题,请随时重新检查。

感谢您的帮助

2 个答案:

答案 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!

希望这会有所帮助。