Предоставление и подключение MongoDB ReplicaSet, работающего от имени K8S Statefulset - PullRequest
0 голосов
/ 05 июля 2019

Я развернул набор реплик MongoDB как StatefulSet в Кубернетесе.Я использую кластер Bare Metal K8S и поэтому использую MetalLB для предоставления сервисов типа LoadBalancer.В случае моей установки MongoDB-RS службы выглядят следующим образом:

NAME              TYPE           CLUSTER-IP      EXTERNAL-IP     PORT(S)           AGE
mongo-0           LoadBalancer   10.43.199.127   172.16.24.151   27017:31118/TCP   55m
mongo-1           LoadBalancer   10.43.180.131   172.16.24.152   27017:31809/TCP   55m
mongo-2           LoadBalancer   10.43.156.124   172.16.24.153   27017:30312/TCP   55m

Это работает, как и ожидалось, но проблема возникает при подключении к RS с внешнего клиента:

➜  ~ mongo "mongodb://172.16.24.151:27017,172.16.24.152:27017,172.16.24.153:27017/?replicaSet=rs0"
MongoDB shell version v4.0.10
connecting to: mongodb://172.16.24.151:27017,172.16.24.152:27017,172.16.24.153:27017/?gssapiServiceName=mongodb&replicaSet=rs0
2019-07-05T10:47:27.058+0200 I NETWORK  [js] Starting new replica set monitor for rs0/172.16.24.151:27017,172.16.24.152:27017,172.16.24.153:27017
2019-07-05T10:47:27.106+0200 I NETWORK  [js] Successfully connected to 172.16.24.153:27017 (1 connections now open to 172.16.24.153:27017 with a 5 second timeout)
2019-07-05T10:47:27.106+0200 I NETWORK  [ReplicaSetMonitor-TaskExecutor] Successfully connected to 172.16.24.151:27017 (1 connections now open to 172.16.24.151:27017 with a 5 second timeout)
2019-07-05T10:47:27.136+0200 I NETWORK  [ReplicaSetMonitor-TaskExecutor] changing hosts to rs0/10.42.2.155:27017,10.42.3.147:27017,10.42.4.108:27017 from rs0/172.16.24.151:27017,172.16.24.152:27017,172.16.24.153:27017
2019-07-05T10:47:52.654+0200 W NETWORK  [js] Unable to reach primary for set rs0
2019-07-05T10:47:52.654+0200 I NETWORK  [js] Cannot reach any nodes for set rs0. Please check network connectivity and the status of the set. This has happened for 1 checks in a row.
2019-07-05T10:47:52.654+0200 E QUERY    [js] Error: connect failed to replica set rs0/172.16.24.151:27017,172.16.24.152:27017,172.16.24.153:27017 :
connect@src/mongo/shell/mongo.js:344:17

Atв какой-то момент говорится «изменение хостов на rs0 / 10.42.2.155: 27017,10.42.3.147: 27017,10.42.4.108: 27017».Так как эти IP-адреса являются внутренними для кластера, после этого соединения не будет установлено соединение.

Есть предложения, что я могу сделать?

1 Ответ

0 голосов
/ 05 июля 2019

Вы используете LoadBalancer, который не является сессионным сеансом, вы можете использовать контроллер nginx для предоставления loadbalancer, основанному на nginx, с возможностью устанавливать привязку липкого сеанса на основе клиента или файла cookie.

https://github.com/kubernetes/ingress-nginx

Другой вариант - использовать другой контейнер в качестве прокси-сервера mongo, например, вы можете использовать контейнер HAPoxy, в котором вы конфигурируете HAProxy для прослушивания TCP-соединений через порт 27017, и в качестве бэкэнда 3 различных сервиса mongo остаютсявам нужно настроить healtheck в HAProxy, чтобы процесс определения количества бэкенов был жив.

...