【问题标题】:communication between two PODs in a single node(minikube )单个节点中两个 POD 之间的通信(minikube)
【发布时间】:2018-12-05 02:27:59
【问题描述】:

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

例如:

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

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

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

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

感谢您的帮助

【问题讨论】:

    标签: docker kubernetes devops minikube


    【解决方案1】:

    我必须在 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 的任何请求都将由端口 8761 上的某个 pod B 提供服务(请注意,端口和目标端口可以相同,这只是一个示例)。

    作为旁注,对于 pod A,您将有类似的内容:

    kind: Service
    apiVersion: v1
    metadata:
      name: my-pod-a-service
    spec:
      selector:
        app: MyPodAApp
      ports:
      - protocol: TCP
        port: 80
        targetPort: 8080
    

    由于您以服务为目标,因此您可以将相同的传入端口 (80) 映射到两个服务,并且 kubernetes 会注意每个服务都到达适当的 pod,只要在 pod 上正确设置了 pod 选择器。

    【讨论】:

      【解决方案2】:

      如果部署和服务名称之间存在正确映射,则只需对 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 describe service hello-node

      为您提供 IP 字段(与 Endpoints 不同)。这实际上是一个暴露的 IP 用于与 pod 通信。这意味着如果您运行,则在 hello world 2 容器内

      curl <IP from service> : 8080
      

      返回 Hello World!

      希望这会有所帮助。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-01-25
        • 2020-10-28
        • 2023-01-15
        • 2018-02-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-25
        相关资源
        最近更新 更多