kubernetes - 如何从 Minikube 连接到本地主机上运行的 MongoDB

标签 kubernetes google-kubernetes-engine kubectl minikube

我正在学习 Kubernetes,正在尝试从 docker-compose 迁移到使用 Kubernetes,但在连接到本地主机上运行的 MongoDB 时遇到问题。

通过使用 'network_mode: "host"'' 使用以下 docker-compose.yaml 连接没有任何问题

//docker-compose.yaml
    version: '3'
    services:

      eureka:
        image: sage-eureka
        ports:
          - "8080:8080"
        network_mode: "host"

但是我在 Kubernetes 中遇到了问题。我用过Kompose转换 docker-compose。

//application.properties
    spring.data.mongodb.host=localhost (tried adding mongo instead of localhost when used ExternalName and ClusterIP)
    spring.data.mongodb.port=27017
    spring.data.mongodb.database=MyMongo

// eureka-service.yaml
apiVersion: v1
kind: Service
metadata:
  annotations:
    kompose.cmd: kompose convert
    kompose.version: 1.21.0 (992df58d8)
  creationTimestamp: null
  labels:
    io.kompose.service: eureka
  name: eureka
spec:
  ports:
  - name: "8080"
    port: 8080
    targetPort: 8080
  - name: "27017"
    port: 27017
    targetPort: 27017
  selector:
    io.kompose.service: eureka
status:
  loadBalancer: {}

//eureka-deployment.yaml

 apiVersion: apps/v1
    kind: Deployment
    metadata:
      annotations:
        kompose.cmd: kompose convert
        kompose.version: 1.21.0 (992df58d8)
      creationTimestamp: null
      labels:
        io.kompose.service: eureka
      name: eureka
    spec:
      replicas: 1
      selector:
        matchLabels:
          io.kompose.service: eureka
      strategy: {}
      template:
        metadata:
          annotations:
            kompose.cmd: kompose convert
            kompose.version: 1.21.0 (992df58d8)
          creationTimestamp: null
          labels:
            io.kompose.service: eureka
        spec:
          hostNetwork: true
          dnsPolicy: Default
          containers:
          - args:
            - --spring.profiles.active=local
            image: sage-eureka
            imagePullPolicy: Never
            name: sageeureka
            ports:
            - containerPort: 8080
            - containerPort: 27017
            resources: {}
          restartPolicy: Always
          serviceAccountName: ""
          volumes: null
    status: {}

当我向 LoadBalencer 添加类型时,我也获得了外部 IP 地址,并且我还尝试为 Mongo 创建服务类型ExternalName 和 NodePort,如 Kubernetes best practices: mapping external services 所示。 :

eureka       ClusterIP      10.102.22.91   <none>                 8080/TCP,27017/TCP   45h
kubernetes   ClusterIP      10.96.0.1      <none>                 443/TCP              4d2h
mongo        ExternalName   <none>         host.docker.internal   <none>               45h

我在这里提到了类似的帖子,但我不知道到底需要做什么,并且遵循这些帖子对我来说也不起作用,因为我不知道我做错了什么:

我还尝试创建 mongo-serivce,如第二篇文章中所示:

kind: Service
apiVersion: v1
metadata:
  name: mongo
spec:
  type: ExternalName
  externalName: host.docker.internal

请帮忙!谢谢。

最佳答案

Connect to local database from inside minikube cluster 类似的解决方案

问题是 host.minikube.internal (不是 host.docker.internal - 这是针对 docker 桌面上的 kubernetes 主机)在 kubernetes 容器中不可见不知何故。看这个issue 。它仅在 minikube ssh 实例中可见。

因此需要一种解决方法来将此主机附加到 k8s 内的容器。

或者只是将 k8s 容器中的 IP 地址硬编码为主机。从命令 minikube ssh 'grep host.minikube.internal/etc/hosts | 查找 IP 地址剪切-f1'

例如,如果 IP 为 192.168.65.2。然后使用这个ip作为k8s容器中的服务主机,而不是127.0.0.1/localhost

关于kubernetes - 如何从 Minikube 连接到本地主机上运行的 MongoDB,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60882006/

相关文章:

kubernetes - 通过 ClusterIP 访问 pod

kubernetes - 如何使有问题的 pod 离线以进行故障排除

AWS 上挂载卷的 Mysql k8s Pod 失败

kubernetes - 提取容器 ID 时出错 - 源值不包含匹配器的 logs_path '/var/lib/docker/containers/'

kubernetes - 我可以在 K8s DNS 中添加服务名称别名,就像在 Docker 中链接可以具有别名一样吗?

ssl - 谷歌容器引擎中的 Kubernetes 负载均衡器 SSL 终止?

kubernetes - Nginx入口无法服务

kubernetes - eksctl 停留在等待节点加入集群

kubernetes - 在将Hyperledger Fabric对等方部署到Kubernetes时获取 “cannot init crypto”

docker - GKE docker容器内缺少NET I/O统计值