如何从 Kubernetes 集群内部访问主机的本地主机

27
在这个应用程序中,nodejs pods在kubernetes内部运行,而mongodb本身位于主机外部的localhost上。
虽然确实不是一个好的设计,但只适用于dev环境。在生产环境中,将有一个独立的mongodb服务器,因此在endpoint中具有非回环ip的选项,因此在生产中不会出现问题。
考虑了以下选项作为dev环境:
1. 使用localhost连接字符串连接到mongodb,但它将引用pod自己的localhost而不是主机的localhost。 2. 使用无头服务并在endpoint中提供localhost IP和端口。但是,endpoint不允许回环。
请建议是否有一种方法可以从集群(pod / nodejs应用程序)内部访问主机的localhost上的mongodb数据库。

你能说明一下你正在使用哪个环境吗?另外,你有检查过以下链接吗:https://dev59.com/KVMI5IYBdhLWcg3w2_ZT 和 https://stackoverflow.com/questions/60882006/how-to-connect-to-mongodb-running-on-localhost-from-minikube? - Malgorzata
@Malgorzata 我正在使用Ubuntu 20.04,在其中使用multipass创建了kubernetes节点。虽然情况不同,但我可以从您的链接中学到如何配置mongo以侦听另一个IP地址,即172.17.0.1:27017。有了这个,我可以创建一个无头服务,并在端点中提到172.17.0.1:27017。它应该可以工作,因为它似乎不是回环IP。让我明天更新您它的工作情况。 - GLK
@Malgorzata,它正在工作,但我不得不使用10.62.176.1而不是172.17.0.1,因为multipass接口使用了这个端口。感谢你的提示,如果你愿意,你可以将其作为我的采纳答案发送。 - GLK
很高兴听到这个消息,我已经将它发布为一个答案。 - Malgorzata
我只是使用我的本地IP地址(192.168...)而不是回环地址(127.0...),就成功了。 - megalucio
4个回答

21

我正在使用Windows上的Docker,对我而言,只需使用host.docker.internal而不是localhost似乎就可以正常工作。

例如,我的mongodb连接字符串看起来像这样:

mongodb://host.docker.internal:27017/mydb

顺便说一下,我的 hosts 文件包括以下几行(我没有添加,我猜测是 docker desktop 安装时自动添加的):

# Added by Docker Desktop
192.168.1.164 host.docker.internal
192.168.1.164 gateway.docker.internal

没错,我也是用我的本地IP地址(192.168...)而不是回环地址(127.0...)来使它工作的。 - megalucio

17

127.0.0.1 是一个 localhost(lo0) 接口的 IP 地址。Hosts,nodes 和 pods 都有自己的 localhost 接口,它们之间没有连接。

你的 mongodb 运行在主机上,不能使用 localhost (或其 IP 范围) 在集群 pod 内部或 vm 内部访问。

在您的情况下,在集群内创建一个无头服务和其对应的 Endpoint:

你的 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>

我已经在评论区添加了你提到的IP。

创建服务和端点之后,您可以在此群集中的任何Pod内使用 mongodb-service 名称和端口 <您正在使用的multipass端口> 作为目标点。

请看:mysql-localhostmongodb-localhost


我尝试了你的解决方案,它起作用了,谢谢。但是我注意到现在有一些困扰我的事情。在我的主机的cni0 netns中,它有IP地址10.244.0.1。我尝试连接它而不使用服务,它也可以工作。所以,服务现在似乎有点过于复杂了。这是我第一次设置kubernetes,并且它仅在单个节点上运行。我错过了什么吗? - dareka

3
如果您正在使用minikube部署本地的kubernetes,您可以使用变量host.minikube.internal来访问您的本地环境。

0

我可以提供另一种解决方案,使用Ingressexternal-service,这可能会对你们中的一些人有所帮助。

我使用特殊的Kustomize覆盖在本地部署我的完整系统。

当我想要用在我的IDE中本地运行的服务替换其中一个部署时,我执行以下操作:

我添加了一个ExternalName服务,它转发到host.docker.internal

kind: Service
apiVersion: v1
metadata:
  name: backend-ide
spec:
  type: ExternalName
  externalName: host.docker.internal

我重新配置了我的入口,将我的 Web 应用程序的某些请求转发到这个外部服务:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: backend-ingress
spec:
  ingressClassName: nginx
  rules:
    - host: url.used.by.webapp.com
      http:
        paths:
          - path: /customerportal/api(/|$)(.*)
            pathType: Prefix
            backend:
              service:
                name: backend-ide
                port:
                  number: 8080

同样的方式,我可以访问主机上的所有其他端口。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接