mongoose: cómo exponer la conexión remota de la réplica de MongoDB configurada dentro del clúster de Kubernetes

CorePress2024-01-24  10

Implementé un conjunto de réplicas de MongoDB en mi clúster de Kubernetes. El conjunto de réplicas de MongoDB se puede conectar fácilmente con la ayuda del ClusterIP interno dentro del clúster. Incluso lo conecto a mi cliente mongo-express.

//Successfull and working fine internally
mongodb://db-mongodb-0.mycompany-mongodb-headless:27017/db

Pero tengo que establecer una conexión remota para pruebas locales y otros servicios. Estoy usando el gráfico de timón de MongoDB proporcionado por Bitnami. Abrí un NodePort para mis dos réplicas configuradas en 30001 y 30002.

Mi primer intento de establecer una conexión remota fue:

Intenté conectarme con mi NodePort previamente abierto. Actualmente estoy usando Mongoose Client. Los puertos de nodo disponibles de mis dos conjuntos de réplicas son: 30001, 30002.

//Unsuccessful
mongoose
  .connect(
    `mongodb://username:password@<EXTERNAL_IP>:30001,<EXTERNAL_IP>:30002/mydb`,
    {
      useNewUrlParser: true,
      useUnifiedTopology: true,
    }
  )

Entonces mi segundo intento fue...

Probé el reenvío de puertos e intenté conectarme con mi servidor local de esta manera-

kubectl port-forward svc/database-mongodb-0-external 27017:27017

Luego intenté establecer una conexión como esta y también fallé

//Unsuccessful 
//MongoError: Authentication failed.
mongodb://username:password@localhost:27017/database

También probé los parámetros de consulta ?replicaSet=rs0 en ambos casos. Pero no hubo suerte.

No intenté abrir un LoadBalancer. ¿Hay alguna forma de establecer una conexión remota con mi controlador Ingress-Nginx y mis servicios MongoDB? No sé si es posible, pero intenté reenviar mis servicios sin cabeza a un subdominio. Pero ese subdominio dice eso: parece que está intentando acceder a MongoDB a través de HTTP en el puerto del controlador nativo. ¡No estoy seguro de que sea posible!

Pero finalmente, mi única pregunta es: ¿cómo puedo establecer o exponer una conexión remota con mi conjunto de réplicas de MongoDB que está configurado en un clúster de Kubernetes?

Mis últimos valores de Bitnami/Mongodb son

architecture: replicaset
auth:
  rootPassword: 12341234
  username: abcd
  password: 1234234
  database: abcd
  replicaSetKey: abcd
persistence:
  enabled: true
  size: 3Gi
externalAccess:
  enabled: true
  autoDiscovery:
    enabled: true
  service:
    type: NodePort
    nodePorts: ['30001', '30002']
rbac:
  create: true

¿Puede proporcionarnos los valores.yaml de la implementación del gráfico de timón? Estoy usando el gráfico de timón bitnami y puedo conectarlo desde afuera.

- Giovanni Patruno

27 de marzo de 2021 a las 9:57

1

He actualizado la pregunta con mis valores YAML para su referencia. Gracias por responder. Realmente lo aprecio.

- Md Fazlul Karim

27/03/2021 a las 13:30

Repetidamente recibo MongoError: Error de autenticación cuando la conexión con [ mongodb://db-mongodb-0.db-mongodb-headless:27017/db ] se realiza correctamente internamente.

- Md Fazlul Karim

27/03/2021 a las 13:59

¿Necesita demandar al¿Puertos de nodo? Creo que es mejor mantener el equilibrador de carga. ¿Está administrado su clúster? Además, si necesita aplicar el nuevo manifiesto, asegúrese de realizar una instalación nueva y de eliminar el PVS porque están almacenando algunas configuraciones y no se eliminan automáticamente con el comando helm eliminar.

- Giovanni Patruno

27/03/2021 a las 14:27

Sí, mi clúster está administrado. Ha identificado un problema importante. No pensé en eso. Haré una instalación nueva y daré una actualización aquí. Gracias de nuevo.

- Md Fazlul Karim

27/03/2021 a las 18:53



------------------------------------

Si entendí correctamente, desea exponer su conjunto de réplicas de MongoDB a una conexión remota.

Estoy trabajando activamente con el gráfico de timón de Bitnami MongoDB y puedo conectarme fácilmente localmente al gráfico de timón en el primer intento:

Reenvío el servicio sin cabeza asignando los puertos 27017:27017 Simplemente me conecto al localhost usando nombre de usuario y contraseña, la única diferencia con mi cadena de conexión es que no especifico la base de datos: mongodb://<user>:<password>@localhost:27017

Para responder a su pregunta final, debe buscar en la página de documentación oficial, hay pocos valores para el timón chart para exponer tu mongodb:

service.type=Equilibrador de carga acceso externo.enabled=true acceso externo.descubrimiento automático.habilitado

Puedes jugar con esas variables para encontrar la forma más adecuada de exponer tu MongoDB de forma remota.

Tenga en cuenta que si configura LoadBalancer y autoDiscovery habilitados, debe asegurarse de que su clúster k8s tenga un LoadBalancer delante (ELB en el caso de Amazon EKS). No te preocupes por este último punto si estás utilizando un servicio de Kubernetes administrado en la nube, ya que tendrás esta característica lista para usar.

2

Intenté establecer la detección automática y el acceso externo como verdaderos. Lo intenté sin mencionar la base de datos también. Pero no hubo suerte. ¿Puedes compartir conmigo tus valores actuales de bitnami/mongodb? He añadido el mío en la pregunta.

- Md Fazlul Karim

27/03/2021 a las 13:49

Seguro: replicaCount: 2, arquitectura: replicaset, arbiter.enabled: false, rbac.create: true, persistence.enabled: true, persistence.size: 8Gi. Como puede ver, no estoy exponiendo el clúster externamente.pero con el port-forward funciona bien.

- Giovanni Patruno

27/03/2021 a las 14:26



------------------------------------

Para acceder a MongoDB implementado como conjunto de réplicas desde fuera del clúster K8, es necesario implementar un servicio por pod. Te recomiendo que leas esta sección de los documentos para comprender la topología: https://github.com/bitnami/charts/tree/master/bitnami/mongodb#architecture

Para implementarlo, puedes seguir esto: https://github.com/bitnami/charts/tree/master/bitnami/mongodb#replicaset-accessing-mongodb-nodes-from-outside-the-cluster

No intenté abrir un LoadBalancer. ¿Hay alguna forma de establecer una conexión remota con¿Con mi controlador Ingress-Nginx a mis servicios MongoDB? No sé si es posible, pero intenté reenviar mis servicios sin cabeza a un subdominio. Pero ese subdominio dice eso: parece que está intentando acceder a MongoDB a través de HTTP en el puerto del controlador nativo. ¡No estoy seguro de que sea posible!

Acerca de esto, no es posible porque Ingress solo sirve tráfico HTTP mientras que MongoDB no opera a través de HTTP

1

Muy apreciado. Lo investigaré.

- Md Fazlul karim

30/03/2021 a las 17:01

randomThread
javascript - ¿Cómo puedo crear una galería de portafolio con filtrado en mi sitio web sin romper el resto de mi código? / ¿Por qwebpack - Error de Watchpack (análisis inicial): Error: EACCES: permiso denegado, lstat, /mnt/c/DumpStack.log.tmp,c# - intentando hacer un bucle de menúcesiumjs - Cesium JS no puede elegir terreno en un castillo de arenaCálculo de la longitud de la cadena en bitsphp - La relación de muchos a muchos de Laravel 8 no funciona (no se generan errores)declaración if: media de una lista con una condición en PythonPython: asigna valores en una matriz a su índice ordenadohtml: uso de consulta de medios para ejecutar