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

ddrv8njm  于 2022-11-21  发布在  Kubernetes
关注(0)|答案(4)|浏览(239)

在 这个 应用 程序 中 , nodejs pod 在 kubernetes 内部 运行 , 而 mongodb 本身 作为 localhost 位于 主机 外部 。
这 确实 不是 一 个 好 的 设计 , 但 它 只 适用 于 开发 环境 。 在 生产 中 , 将 有 一 个 单独 的 mongodb 服务 器 , 因为 这样 的 选项 在 端点 中 有 一 个 非 环 回 IP , 所以 在 生产 中 不会 有 问题 。
已 考虑 开发 环境 的 以下 选项
1.使用 localhost 连接 字符 串 连接 到 mongodb , 但 它 将 引用 pod 自己 的 localhost , 而 不是 主机 的 localhost
1.使用 headless 服务 并 在 终结 点 中 提供 localhost IP 和 端口 。 但是 终结 点 不 允许 环 回
建议 是否 有 办法 从 集群 内部 访问 主机 localhost 上 的 mongodb 数据 库 ( pod/nodejs 应用 程序 ) 。

hfwmuf9z

hfwmuf9z1#

127.0.0.1localhostlo0)接口IP地址。主机,节点和机组都有自己的本地主机接口,并且彼此不连接。
您的mongodb正在主机上运行,无法使用localhost(或其IP范围)从群集pod内部或从vm内部进行访问。
在您的情况下,在集群内为其创建一个无头服务和端点:
您的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-port-you-are-using>作为目标点。
看一看:一个一个

hsgswve4

hsgswve42#

我在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
wnavrhmk

wnavrhmk3#

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

z2acfund

z2acfund4#

我可以再添加一个具有入口外部服务的解决方案,这可能会对你们中的一些人有所帮助。
我使用特殊的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

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

相关问题