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

Posted

技术标签:

【中文标题】如何从 kubernetes 集群内部访问主机的 localhost【英文标题】:How to access host's localhost from inside kubernetes cluster 【发布时间】:2021-03-15 07:35:53 【问题描述】:

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

这确实不是很好的设计,但它只适用于开发环境。在生产中,会有一个单独的 mongodb 服务器,因此可以选择在端点中使用非环回 ip,因此在生产中不会有问题。

已考虑开发环境的以下选项

    使用localhost连接字符串连接mongodb,但是会引用pod自己的localhost而不是host的localhost

    使用无头服务并在端点中提供 localhost ip 和端口。但是端点不允许环回

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

【问题讨论】:

你能指定你在哪个环境下工作吗?你也检查过:***.com/questions/55164223/…***.com/questions/60882006/…? @Malgorzata Am usnig Ubuntu 20.04,并在使用多通道创建的 kubernetes 节点上。虽然场景不同,但我可以从您的链接中使用的是配置 mongo 以侦听另一个 ip,即 172.17.0.1:27017 ,这样我可以创建一个无头服务,并在端点中提及 172.17.0.1:27017 。它应该可以工作,因为它似乎不是环回 ip。让我明天告诉你它是如何工作的。 @Malgorzata 它的工作,而不是使用 172.17.0.1 我不得不使用 10.62.176.1 因为多通道接口使用这个端口。感谢您的提示,如果您愿意,可以将其作为我接受的答案发送。 很高兴听到这个消息,我已将其发布为答案。 【参考方案1】:

127.0.0.1localhost(lo0) 接口 IP 地址。主机、节点和 pod 都有自己的 localhost 接口,它们之间没有相互连接。

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

在您的情况下,在集群内为其创建一个 headless service 和端点:

您的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 名称和端口 &lt;multipass-port-you-are-using&gt; 作为目标点。

看看:mysql-localhost,mongodb-localhost。

【讨论】:

我尝试了您的解决方案,它奏效了,谢谢。但我现在注意到了一些困扰我的事情。在我主机的 cni0 netns 中,它的 ip 为 10.244.0.1。我尝试在没有服务的情况下连接它并且它有效。所以,现在服务似乎有点过于复杂了。这是我第一次设置 kubernetes,它还运行在单个节点上。我错过了什么吗?【参考方案2】:

我在 docker for windows 上运行,对我来说,只使用 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

【讨论】:

【参考方案3】:

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

【讨论】:

以上是关于如何从 kubernetes 集群内部访问主机的 localhost的主要内容,如果未能解决你的问题,请参考以下文章

关于Kubernetes中Service Account的一些笔记:Pod内部如何访问K8s集群

关于Kubernetes中Service Account的一些笔记:Pod内部如何访问K8s集群

如何通过 ssh 隧道使用 kubectl 通过我的 kubernetes API 访问我的内部 ELB?

无法通过 Kubernetes 集群中的主机名连接到 MariaDB

KUBERNETES02_集群安装逻辑前置环境搭建一主两从部署dashboard访问页面

KUBERNETES02_集群安装逻辑前置环境搭建一主两从部署dashboard访问页面