Модуль с доступом к Mongo через локальный хост, но без имени службы

#mongodb #kubernetes #networking #minikube #kubernetes-service

Вопрос:

Эта проблема возникает только в кластере, созданном с настройками мини-куба по умолчанию, но не в удаленном кластере, созданном с помощью Kops.

Я запускаю эту установку в кластере мини-кубов на виртуальной машине. У меня есть модуль под управлением MongoDB в моем пространстве имен и служба, указывающая на него:

 kind: Deployment
apiVersion: apps/v1
metadata:
  name: mongo
  namespace: platform
  labels:
    app: mongo
spec:
  replicas: 1
  selector:
    matchLabels:
      app: mongo
  template:
    metadata:
      labels:
        app: mongo
    spec:
      containers:
        - name: mongo
          image: mongo
          env:
          - name: MONGO_INITDB_ROOT_USERNAME
            value: root
          - name: MONGO_INITDB_ROOT_PASSWORD
            value: password

---
apiVersion: v1
kind: Service
metadata:
  name: mongo
  namespace: platform
spec:
  selector:
    app: mongo
  ports:
    - protocol: TCP
      port: 27017
 

Когда я запускаю оболочку внутри контейнера mongo, я могу подключиться к базе данных с помощью

 mongo mongodb://root:password@localhost:27017
 

но это не работает с

 $ mongo mongodb://root:password@mongo:27017
MongoDB shell version v4.4.1
connecting to: mongodb://mongo:27017/?compressors=disabledamp;gssapiServiceName=mongodb
Error: couldn't connect to server mongo:27017, connection attempt failed: SocketException: Error connecting to mongo:27017 (10.110.155.65:27017) :: caused by :: Connection timed out :
connect@src/mongo/shell/mongo.js:374:17
@(connect):2:6
exception: connect failed
exiting with code 1
 

Я проверил службу, и она указывает на правильный адрес:

 $ kubectl describe service mongo --namespace platform
Name:              mongo
Namespace:         platform
Labels:            <none>
Annotations:       <none>
Selector:          app=mongo
Type:              ClusterIP
IP:                10.110.155.65
Port:              <unset>  27017/TCP
TargetPort:        27017/TCP
Endpoints:         172.17.0.9:27017
Session Affinity:  None
Events:            <none>
$ kubectl describe pod mongo-6c79f887-5khnc | grep IP   
IP:           172.17.0.9
 

And using this endpoint directly works, too:

 mongo mongodb://root:password@172.17.0.9:27017
 

As a sidenote, I have other pods services running webservers in the same namespace, which work as expected through the service.

Addition

Я запускаю команды mongo ... подключения из контейнера/модуля MongoDB. Я также попробовал все эти команды подключения из других модулей в том же пространстве имен. Всегда с одним и тем же результатом: использование IP работает, использование mongo для разрешения dns не работает.

В качестве теста я скопировал точно такую же конфигурацию модуля/службы, но с сервером nginx вместо mongodb:

 ...
---
kind: Deployment
apiVersion: apps/v1
metadata:
  name: nginx
  namespace: debug-mongo
  labels:
    app: nginx
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
        - name: nginx
          image: nginx

---
apiVersion: v1
kind: Service
metadata:
  name: nginx
  namespace: debug-mongo
spec:
  selector:
    app: nginx
  ports:
    - protocol: TCP
      port: 80
 

И curl nginx:80 успешно возвращает страницу nginx по умолчанию.

Комментарии:

1. капсула, которой ты управляешь, монго mongodb://root:password@mongo:27017 команда выполняется в другом пространстве имен ?

2. Я запускаю mongo ... команду внутри контейнера/модуля mongo. Вот почему работает соединение с локальным хостом. Я добавлю еще немного контекстной информации!

3. существуют ли какие-либо сетевые политики, применяемые к вашему пространству имен?

4. Нет, все это по умолчанию, так как Миникуб настраивает его

Ответ №1:

Ладно, забыл, что я говорил раньше. Вам нужно установить для параметра ClusterIP служб значение нет.

 spec:
  clusterIP: None
 

Служба K8s с ip-адресом кластера действует как балансировщик нагрузки, и монго, я полагаю, не может так работать.

Комментарии:

1. В этом есть смысл. Но, похоже, это невозможно использовать mongo для bindIp . Я запускаю контейнер с помощью команды mongod --bind_ip mongo , но теперь при запуске я получаю это сообщение об ошибке: Error setting up listener","attr":{"error":{"code":9001,"codeName":"SocketException","errmsg":"Cannot assign requested address"

2. Я попробовал это mongod --bind_ip_all сделать , но у меня все та же проблема с подключением