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 de 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/dbPero 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 conjuntos de réplicas 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...
Intenté el reenvío de puertos e intenté conectarme con mi host local de esta manera:
kubectl port-forward svc/database-mongodb-0-external 27017:27017Luego traté de establecer una conexión como esta y fallé también
//Unsuccessful //MongoError: Authentication failed. mongodb://username:password@localhost:27017/databaseTambién probé los parámetros de consulta ?replicaSet=rs0 en ambos casos. Pero sin suerte.
No intenté abrir un LoadBalancer. ¿Hay alguna forma de establecer una conexión remota con mi controlador Ingress-Nginx a mis servicios MongoDB ? No sé si es posible, pero traté de 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 si es 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: trueSi entendí correctamente, desea exponer su conjunto de réplicas 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 usando su primer intento:
mongodb://<user>:<password>@localhost:27017Para responder a su pregunta final, debe buscar en la página de documentación oficial , hay algunos valores para que el gráfico de timón exponga su mongodb:
service.type=LoadBalancerexternalAccess.enabled=trueexternalAccess.autoDiscovery.enabledPuede jugar con esas variables para encontrar la forma más adecuada de exponer su 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 se preocupe por este último punto si está utilizando un servicio de kubernetes administrado en la nube, ya que tendrá esta función lista para usar.
Para acceder a MongoDB implementado como conjunto de réplicas desde fuera del clúster de K8, es necesario implementar un servicio por pod. Le recomiendo que lea esta sección de los documentos para comprender la topología: https://github.com/bitnami/charts/tree/master/bitnami/mongodb#architecture
Para implementarlo, puede 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 mi controlador Ingress-Nginx a mis servicios MongoDB? No sé si es posible, pero traté de 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 si es posible!
Acerca de esto, no es posible porque Ingress sirve solo tráfico HTTP mientras que MongoDB no opera sobre HTTP