Не удается подключиться к модулю Mongodb в Куберне (соединение отказано)
У меня есть несколько удаленных виртуальных машин, на которых я хочу развернуть несколько экземпляров Mongodb, а затем сделать их доступными удаленно, но по некоторым причинам я не могу заставить эту работу работать.
Вот шаги, которые я предпринял:
- Я запустил модуль Kubernetes под управлением Mongodb на удаленной виртуальной машине.
- Затем я показал его через сервис Kubernetes NodePort.
- Затем я попытался подключиться к экземпляру Mongodb со своего ноутбука, но это не сработало.
Вот команда, которую я использовал для подключения:
$ mongo host:NodePort
(под "хозяином" я подразумеваю мастера Кубернетес).
И вот его вывод:
MongoDB shell version v4.0.3
connecting to: mongodb://host:NodePort/test
2018-10-24T21:43:41.462+0200 E QUERY [js] Error: couldn't connect to server host:NodePort, connection attempt failed: SocketException:
Error connecting to host:NodePort :: caused by :: Connection refused :
connect@src/mongo/shell/mongo.js:257:13
@(connect):1:6
exception: connect failed
От мастера Kubernetes я удостоверился, что стручок Mongodb работал. Затем я запустил оболочку в контейнере и проверил, что сервер Mongodb работает правильно. Более того, ранее я предоставлял удаленный доступ к серверу Mongodb, указав параметр "--bind-ip=0.0.0.0" в его описании yaml. Чтобы убедиться, что эта опция была применена, я запустил эту команду внутри экземпляра Mongodb из той же оболочки:
db._adminCommand( {getCmdLineOpts: 1}
И вот вывод:
{
"argv" : [
"mongod",
"--bind_ip",
"0.0.0.0"
],
"parsed" : {
"net" : {
"bindIp" : "0.0.0.0"
}
},
"ok" : 1
}
Таким образом, сервер Mongodb должен быть доступен удаленно.
Я не могу понять, вызвана ли эта проблема Кубернетесом или Монгодбом.
В качестве теста я выполнил те же самые шаги, используя вместо этого MySQL, и это сработало (то есть я запустил модуль MySQL и открыл его для службы Kubernetes, чтобы сделать его доступным удаленно, а затем успешно подключился к нему из своего ноутбук). Это привело бы меня к мысли, что виновником является Монгодб, но я не уверен. Может быть, я просто делаю глупую ошибку где-то.
Может ли кто-нибудь помочь мне пролить свет на это? Или подскажите как отладить эту проблему?
РЕДАКТИРОВАТЬ:
Вот вывод kubectl describe deployment <mongo-deployment>
команда, согласно вашему запросу:
Name: mongo-remote
Namespace: default
CreationTimestamp: Thu, 25 Oct 2018 06:31:24 +0000
Labels: name=mongo-remote
Annotations: deployment.kubernetes.io/revision=1
Selector: name=mongo-remote
Replicas: 1 desired | 1 updated | 1 total | 1 available | 0 unavailable
StrategyType: RollingUpdate
MinReadySeconds: 0
RollingUpdateStrategy: 1 max unavailable, 1 max surge
Pod Template:
Labels: name=mongo-remote
Containers:
mongocontainer:
Image: mongo:4.0.3
Port: 5000/TCP
Host Port: 0/TCP
Command:
mongod
--bind_ip
0.0.0.0
Environment: <none>
Mounts: <none>
Volumes: <none>
Conditions:
Type Status Reason
---- ------ ------
Available True MinimumReplicasAvailable
OldReplicaSets: <none>
NewReplicaSet: mongo-remote-655478448b (1/1 replicas created)
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal ScalingReplicaSet 15m deployment-controller Scaled up replica set mongo-remote-655478448b to 1
Для полноты приведем описание развертывания в yaml:
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: mongo-remote
spec:
replicas: 1
template:
metadata:
labels:
name: mongo-remote
spec:
containers:
- name: mongocontainer
image: mongo:4.0.3
imagePullPolicy: Always
command:
- "mongod"
- "--bind_ip"
- "0.0.0.0"
ports:
- containerPort: 5000
name: mongocontainer
nodeSelector:
kubernetes.io/hostname: xxx
1 ответ
Я нашел ошибку (и, как я подозревал, она была глупой).
Проблема была в описании развертывания yaml. Поскольку порт не был указан в mongod
Команда mongodb прослушивала порт по умолчанию (27017), но контейнер прослушивал другой указанный порт (5000).
Таким образом, решение состоит в том, чтобы установить параметр containerPort в качестве порта по умолчанию для mongodb, например:
command:
- "mongod"
- "--bind_ip"
- "0.0.0.0"
ports:
- containerPort: 27017
name: mongocontainer
Или установить порт mongodb как порт контейнера, например:
command:
- "mongod"
- "--bind_ip"
- "0.0.0.0"
- "--port"
- "5000"
ports:
- containerPort: 5000
name: mongocontainer