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

问题描述 投票:0回答:3

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

例如:

  • POD A 使用 8080 端口,这是登陆页面。
  • 从 POD A,我们通过使用 8761 端口的超链接访问 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
3个回答
6
投票

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

基于您想要 Pod 间通信以及 Pod 驻留在同一节点上的事实,您可以采用多种(相当有问题且脆弱的)方法,例如主机名和节点端口暴露。为了更符合 kubernetes 方法和建议,我建议使用 Service,而不是直接从 Pod 级别公开端口。

您可以在官方文档中阅读有关服务的更多信息,服务使用示例如下:

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 提供服务(请注意,端口和 targetPort 可以相同,这只是一个示例)。

顺便说一句,对于 pod 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。


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 会描述 service hello-node

为您提供一个 IP 字段(与端点不同)。这实际上是一个用于与 Pod 通信的公开 IP。这意味着如果你运行的话,就会在 hello world 2 容器内

curl <IP from service> : 8080

返回Hello World!

希望这有帮助。


0
投票

我在将 Mongodb 服务与 Nestjs 服务(在同一个 k8s 节点中)连接时遇到了这个问题。请记住将 27017 端口分配给 MondoDB 的

port:
中的
targetPort:
service.yaml
。如果您将
port:
分配给其他东西,它将不起作用。

© www.soinside.com 2019 - 2024. All rights reserved.