#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
сделать , но у меня все та же проблема с подключением