我必须在 minikube 中的两个 POD 之间进行通信,这两个 POD 暴露在两个不同的端口中,但位于单个节点中。
例如:
现在,在 kubernetes 中,它动态分配端口,例如:POD A: 30069 和 POD B: 30070
这里的问题是:从POD A(30069)访问POD B时,它不会自动映射POD B(30070)的kubernetes端口。相反,POD B 尝试在 8761 端口中打开。
如果我的描述令人困惑,请道歉。如果您无法理解我的问题,请随时重新检查。
感谢您的帮助
我必须在 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。
如果部署和服务名称之间存在正确的映射,则只需使用对 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!
希望这有帮助。
我在将 Mongodb 服务与 Nestjs 服务(在同一个 k8s 节点中)连接时遇到了这个问题。请记住将 27017 端口分配给 MondoDB 的
port:
中的 targetPort:
和 service.yaml
。如果您将 port:
分配给其他东西,它将不起作用。