如何从 kubernetes 集群内部访问主机的 localhost

GLK*_*GLK 28 networking docker kubernetes

在此应用程序中,nodejs pod 在 kubernetes 内部运行,而 mongodb 本身作为 localhost 位于主机外部。

这确实不是一个好的设计,但它只适用于开发环境。在生产中,将有一个单独的 mongodb 服务器,因为这样的选项可以在端点中具有非环回 IP,因此在生产中不会出现问题。

已考虑以下开发环境选项

  1. 使用 localhost 连接字符串连接到 mongodb,但它将引用 pod 自己的 localhost,而不是主机的 localhost

  2. 使用无头服务并在端点中提供本地主机 IP 和端口。但是端点不允许环回

建议是否有一种方法可以从集群内部(pod/nodejs 应用程序)访问主机本地主机上的 mongodb 数据库。

jon*_*iba 23

我在 docker for windows 上运行,对我来说,只使用host.docker.internal而不是localhost似乎工作得很好。

例如,我的 mongodb 连接字符串如下所示:

mongodb://host.docker.internal:27017/mydb
Run Code Online (Sandbox Code Playgroud)

顺便说一句,我的hosts文件包含以下几行(我没有添加,我猜docker desktop安装是这样做的):

# Added by Docker Desktop
192.168.1.164 host.docker.internal
192.168.1.164 gateway.docker.internal
Run Code Online (Sandbox Code Playgroud)


Mal*_*ata 17

127.0.0.1localhost( lo0) 接口 IP 地址。主机、节点和 Pod 都有自己的 localhost 接口,并且彼此不连接。

您的 mongodb 主机正在主机上运行,​​无法使用 localhost (或其 IP 范围)从集群 Pod 内部或虚拟机内部进行访问。

在您的情况下,在集群内为其创建一个无头服务和端点:

您的 mongodb-service.yaml 文件应如下所示:

apiVersion: v1
kind: Service
metadata:
   name: mongodb-service
spec:
   clusterIP: None
   ports:
   - protocol: TCP
     port: <multipass-port-you-are-using>
     targetPort: <multipass-port-you-are-using>
   selector:  
     name:  example
   type: ClusterIP
---
apiVersion: v1
kind: Endpoints
metadata:
  name: mongodb-service
subsets:
  - addresses:
    - ip: 10.62.176.1
    ports:
      - port: <multipass-port-you-are-using>
Run Code Online (Sandbox Code Playgroud)

我已经添加了您在评论部分提到的IP。

创建服务和端点后,您可以使用 该集群的任何 pod 内的mongodb-service 名称和端口 <multipass-port-you-are-using> 作为目标点。

看一下:mysql-localhostmongodb-localhost