Отображение и подключение MongoDB ReplicaSet, работающего как K8S Statefulset

Я развернул MongoDB ReplicaSet как StatefulSet в Kubernetes. Я использую кластер 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

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

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


person Daniel Stefanovski    schedule 05.07.2019    source источник
comment
Привет, IP-адреса вашего кластера - 10.43.199.127 ... и его подключение к 10.42.2.155. это даже не подключение к IP-адресу кластера   -  person Suresh Vishnoi    schedule 05.07.2019
comment
ой, не понимал этого. Это еще более странно, я думаю   -  person Daniel Stefanovski    schedule 05.07.2019
comment
что это за IP?   -  person Suresh Vishnoi    schedule 05.07.2019
comment
Не могли бы вы предоставить результат kubectl get pods -o wide? Это могут быть IP-адреса модулей.   -  person mario    schedule 11.07.2019


Ответы (1)


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

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

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

person wolmi    schedule 05.07.2019