Как подключиться к MongoDB на локальном хосте из Minikube - PullRequest
0 голосов
/ 27 марта 2020

Я узнаю о Kubernetes, пытаюсь отойти от docker - из-за использования Kubernetes, но возникают проблемы с подключением к MongoDB, работающему на localhost.

У меня нет проблем с подключением по следующему docker -compose.yaml с использованием 'network_mode: "host"'

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

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

Но у меня проблемы в Кубернетесе. Я использовал Kompose для преобразования docker -композит.

//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: {}

Я также получаю внешний IP-адрес, когда я добавил тип в LoadBalencer, и я также попытался создание типа службы ExternalName и NodePort для Mon go, как показано в Рекомендации Kubernetes: сопоставление внешних служб :

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

Я ссылался на подобные посты здесь, но я не делаю точно знаю, что нужно сделать, и следующие посты также не работают для меня, так как я не знаю, что я делаю неправильно:

Я также попытался создать mon go -serivce, как во 2-м посте, вот так:

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

Пожалуйста, помогите !. Спасибо.

1 Ответ

0 голосов
/ 02 апреля 2020

Как подключиться с хоста к Pod в Minikube

Если проблема в том, что вы не можете получить доступ к своим Pod (через service) на Minikube.

Давайте сначала проверим ваш Service.

$ kubectl get service eureka
NAME     TYPE           CLUSTER-IP      EXTERNAL-IP    PORT(S)          AGE
eureka   LoadBalancer   10.104.196.32   <pending>      8080:30167/TCP   25m

Обратите внимание, что при запуске Minikube служба LoadBalancer не получает внешний IP-адрес.

В местном масштабе Minikube не интегрируется с другим сервисом для запуска внешних балансировщиков нагрузки.

Но в большинстве других сред, когда вы используете Kubernetes LoadBalancer, он обеспечит балансировщик нагрузки, внешний по отношению к вашему кластеру, например Elasti c Load Balancer (ELB) в AWS, или Облачный балансировщик нагрузки в GKE.

Поскольку Minikube не интегрируется с отдельным локальным балансировщиком нагрузки, вы должны попросить Minikube смоделировать соединение с использованием сервиса minikube:

$ minikube service eureka

Это предоставит вам IP-адрес Minikube и номер порта для маршрутов Minikube к «eureka», поэтому вы можете скопировать и вставить его в браузер / другое приложение для тестирования приложения.

Дополнительно информацию можно найти в документации Minikube :

Чтобы получить доступ к развертыванию hello-minikube, предоставьте его в качестве службы:

kubectl expose deployment hello-minikube --type=NodePort --port=8080

Получить URL-адрес открытой службы для просмотра сведений о службе:

служба minikube hello-minikube --url

РЕДАКТИРОВАТЬ

Как подключиться от Pod к localhost на Minikube.Host

не возникает проблем с подключением с использованием следующего docker -compose.yaml с помощью 'network_mode: "host"'

Правда.

Если вы используете сетевой режим host для контейнера, сетевой стек этого контейнера не изолирован от хоста Docker (контейнер совместно использует сетевое пространство имен хоста), и контейнер не получает своего собственного IP-адрес выделен. Поэтому, если вы запускаете контейнер, который привязывается к порту 80, и используете host сеть, приложение контейнера доступно на порту 80 на IP-адресе хоста.

Поскольку minikube выполняет все из виртуальной машины , сетевое взаимодействие может стать довольно сложным

После запуска Minikube и создания его сети вы сможете посещать сервер localhost на 127.0.0.1 и 192.168.99.1. (Если нет, последующие шаги не будут работать). В случае успеха это означает, что виртуальная машина Minikube может получить доступ к локальному хосту вашего хоста на 192.168.99.1 (127.0.0.1 из Minikube все равно будет localhost)

1073 * для Minicube, поэтому в данном случае вместо localhost ваше приложение должно подключиться к 192.168.99.1.
kind: Service
apiVersion: v1
metadata:
  name: mongo
spec:
  type: ExternalName
  externalName: host.docker.internal

Пожалуйста, убедитесь, что host.docker.internal разрешен в IP-адрес хост-машины.

Кроме того, вы можете отредактировать /etc/hosts Minikube и добавить любое доменное имя для этого IP, чтобы вы могли подключиться к нему.

Надеюсь, это объясняет, как получить доступ к вашему приложению извне и получить доступ к "localhost" при использовании Minikube.

...