El siguiente procedimiento describe cómo conectarse a un recurso MongoDB implementado en Kubernetes desde fuera del clúster de Kubernetes.
Requisito previo
Versiones compatibles de MongoDB
Para poder acceder a sus bases de datos fuera de Kubernetes, deben ejecutar MongoDB 4.2.3 o posterior.
Considerations
Configurar anulaciones de la sonda de preparación
Si crea servicios personalizados que requieren acceso externo a recursos personalizados de MongoDB implementados por el operador de Kubernetes y utiliza sondas de preparación en Kubernetes, configure publishNotReadyAddresses configuración en Kubernetes a true.
La publishNotReadyAddresses configuración indica que un agente que interactúa con los puntos finales para este servicio debe ignorar la condición de listo del servicio.Estado. Establecer publishNotReadyAddresses en true anula el comportamiento de la sonda de preparación configurada para el Pod que aloja su servicio.
Por defecto, la configuración publishNotReadyAddresses está establecida en false. En este caso, cuando los Pods que alojan los recursos personalizados de MongoDB en Kubernetes Operator pierden conectividad con Cloud Manager u Ops Manager, las pruebas de disponibilidad configuradas para estos Pods fallan. Sin embargo, cuando se define el ajuste publishNotReadyAddresses a true:
Kubernetes no apaga el servicio cuya sonda de preparación falla.
Kubernetes considera que todos los puntos finales están listos incluso si las sondas de los pods que alojan los servicios para estos puntos finales indican que no están listos.
Los recursos personalizados de MongoDB todavía están disponibles para operaciones de lectura y escritura.
Tip
Referencia de la API de Kubernetes y buscar
publishNotReadyAddresses
Procedimiento
El siguiente procedimiento lo guiará a través del proceso de configuración de la conectividad externa para su implementación mediante el uso de las opciones de configuración integradas en el Operador de Kubernetes.
La forma en que se conecta a un recurso MongoDB que el operador de Kubernetes implementó desde fuera del clúster de Kubernetes depende del recurso.
Para conectarse a su recurso independiente MongoDB implementado por el operador de Kubernetes desde fuera del clúster de Kubernetes:
Implemente un recurso independiente con el operador de Kubernetes.
Si no ha implementado un recurso independiente, siga las instrucciones para implementar uno.
Este procedimiento utiliza el siguiente ejemplo:
20 21 apiVersion: mongodb.com/v1 22 kind: MongoDB 23 metadata: 24 name: <my-standalone> 25 spec: 26 version: "4.2.2-ent" 27 opsManager: 28 configMapRef: 29 name: <configMap.metadata.name> 30 # Must match metadata.name in ConfigMap file 31 credentials: <mycredentials> 32 type: Standalone 33 ...
Cree un servicio externo para el pod MongoDB.
Para conectarse a su recurso independiente desde un recurso externo, configure el ajuste spec.externalAccess:
externalAccess: {}
Esta configuración indica al operador de Kubernetes que cree un servicio LoadBalancer externo para el pod de MongoDB en su recurso independiente. Este servicio externo proporciona un punto de entrada para conexiones externas. Al agregar esta configuración sin valores, se crea un servicio externo con los siguientes valores predeterminados:
Campo | Valor | Descripción |
|---|---|---|
|
| Nombre del servicio externo. No se puede cambiar este valor. |
|
| Crea un servicio LoadBalancer externo. |
|
| Un puerto |
|
| Especifica que los registros DNS se crean incluso si el pod no está listo. No se establece en |
Opcionalmente, si necesita agregar valores al servicio o anular los valores predeterminados, especifique:
Anotaciones específicas de su proveedor de nube, en
spec.externalAccess.externalService.annotationsAnulaciones para la especificación del servicio,
spec.externalAccess.externalService.specen.
Por ejemplo, las siguientes configuraciones anulan los valores predeterminados del servicio externo para configurar su recurso independiente para crear servicios NodePort que expongan el pod MongoDB:
externalAccess: externalService: annotations: # cloud-specific annotations for the service spec: type: NodePort # default is LoadBalancer port: 27017 # you can specify other spec overrides if necessary
Tip
Para obtener más información, consulte las anotaciones y ServiceSpec en la documentación de Kubernetes.
Verificar los servicios externos.
En su recurso independiente, ejecute el siguiente comando para verificar que el operador de Kubernetes haya creado el servicio externo para su implementación.
kubectl get services
El comando devuelve una lista de servicios similar a la siguiente salida. Para cada pod de base de datos del clúster, el operador de Kubernetes crea un servicio externo llamado <pod-name>-0-svc-external. Este servicio se configura según los valores y las anulaciones que proporcione en la especificación del servicio externo.
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE <my-standalone>-0-svc-external LoadBalancer 10.102.27.116 <lb-ip-or-fqdn> 27017:27017/TCP 8m30s
Dependiendo de la configuración de su clúster o del proveedor de nube, la dirección IP del servicio LoadBalancer es una dirección IP accesible externamente o FQDN. Puede usar la dirección IP o el FQDN para enrutar el tráfico desde su dominio externo.
Pruebe la conexión al recurso independiente.
Para conectarse a su implementación desde fuera del clúster de Kubernetes, use MongoDB Shell (mongosh) y especifique la dirección del pod de MongoDB que expuso a través del dominio externo.
Ejemplo
Si tiene un FQDN externo <my-standalone>.<external-domain> de, puede conectarse a esta instancia de clúster fragmentado desde fuera del clúster de Kubernetes mediante el siguiente comando:
mongosh "mongodb://<my-standalone>.<external-domain>"
Importante
Este procedimiento explica la forma más sencilla de habilitar la conectividad externa. Puede usar otras utilidades en producción.
Para conectarse a su recurso de conjunto de réplicas MongoDB implementado por el operador de Kubernetes desde fuera del clúster de Kubernetes:
Implemente un conjunto de réplicas con el operador de Kubernetes.
Si no ha implementado un conjunto de réplicas, siga las instrucciones para implementar uno.
Debe habilitar TLS para el conjunto de réplicas proporcionando un valor para la spec.security.certsSecretPrefix configuración. El conjunto de réplicas debe usar un certificado de CA personalizado spec.security.tls.ca almacenado con.
Cree un servicio externo para los pods de MongoDB.
Para conectarse a su conjunto de réplicas desde un recurso externo, configure el ajuste spec.externalAccess:
externalAccess: {}
Esta configuración indica al operador de Kubernetes que cree un servicio LoadBalancer externo para los pods de MongoDB en su conjunto de réplicas. Este servicio externo proporciona un punto de entrada para las conexiones externas. Al agregar esta configuración sin valores, se crea un servicio externo con los siguientes valores predeterminados:
Campo | Valor | Descripción |
|---|---|---|
|
| Nombre del servicio externo. No se puede cambiar este valor. |
|
| Crea un servicio LoadBalancer externo. |
|
| Un puerto |
|
| Especifica que los registros DNS se crean incluso si el pod no está listo. No se establece en |
Opcionalmente, si necesita agregar valores al servicio o anular los valores predeterminados, especifique:
Anotaciones específicas de su proveedor de nube, en
spec.externalAccess.externalService.annotationsAnulaciones para la especificación del servicio,
spec.externalAccess.externalService.specen.
Por ejemplo, las siguientes configuraciones anulan los valores predeterminados del servicio externo para configurar su conjunto de réplicas para crear servicios NodePort que expongan los pods de MongoDB:
externalAccess: externalService: annotations: # cloud-specific annotations for the service spec: type: NodePort # default is LoadBalancer port: 27017 # you can specify other spec overrides if necessary
Tip
Para obtener más información, consulte las anotaciones y ServiceSpec en la documentación de Kubernetes.
Agregue nombres alternativos de sujeto a sus certificados TLS.
Agregue cada nombre DNS externo al certificado SAN.
Verificar los servicios externos.
En su conjunto de réplicas, ejecute el siguiente comando para verificar que el operador de Kubernetes haya creado el servicio externo para su implementación.
kubectl get services
El comando devuelve una lista de servicios similar a la siguiente salida. Para cada pod de base de datos del clúster, el operador de Kubernetes crea un servicio externo llamado <pod-name>-<pod-idx>-svc-external. Este servicio se configura según los valores y las anulaciones que se proporcionan en la especificación del servicio externo.
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE <my-replica-set>-0-svc-external LoadBalancer 10.102.27.116 <lb-ip-or-fqdn> 27017:27017/TCP 8m30s
Según la configuración de su clúster o su proveedor de nube, la dirección IP del servicio LoadBalancer es una dirección IP o FQDN accesible externamente. Puede usar la dirección IP o el FQDN para enrutar el tráfico desde su dominio externo.
Copie el recurso del conjunto de réplicas de muestra.
Cambie la configuración de este archivo YAML para que coincida con la configuración del conjunto de réplicas deseada.
1 2 apiVersion: mongodb.com/v1 3 kind: MongoDB 4 metadata: 5 name: <my-replica-set> 6 spec: 7 members: 3 8 version: "4.2.2-ent" 9 type: ReplicaSet 10 opsManager: 11 configMapRef: 12 name: <configMap.metadata.name> 13 credentials: <mycredentials> 14 persistent: true
15 security: 16 tls: 17 enabled: true 18 connectivity: 19 replicaSetHorizons: 20 - "example-website": "web1.example.com:30907" 21 - "example-website": "web2.example.com:32350" 22 - "example-website": "web3.example.com:31185" 23 ...
Pegue la sección de ejemplo copiada en su recurso de conjunto de réplicas existente.
Abre el editor de texto de preferencia y pega la especificación del objeto al final del archivo recurso, en la sección spec.
Cambie las configuraciones resaltadas a sus valores preferidos.
Clave | Tipo | Necesidad | Descripción | Ejemplo |
|---|---|---|---|---|
spec.connectivity | Colección | Condicional | Agregue este parámetro y sus valores si necesita que se acceda a su base de datos fuera de Kubernetes. Esta configuración le permite proporcionar diferentes configuraciones de DNS dentro y fuera del clúster de Kubernetes. El operador de Kubernetes utiliza DNS de horizonte dividido para los miembros del conjunto de réplicas. Esta función permite la comunicación tanto dentro como fuera del clúster de Kubernetes. Puede agregar múltiples asignaciones externas por host. Requisitos de horizonte dividido
| |
spec.security | string | Requerido | Agregue el |
|
Confirme los nombres de host externos y los valores de servicios externos en su recurso de conjunto de réplicas.
Confirme que los nombres de host externos en la configuración sean spec.connectivity.replicaSetHorizons correctos.
Los nombres de host externos deben coincidir con los nombres DNS de los nodos de trabajo de Kubernetes. Estos pueden ser cualquier nodo del clúster de Kubernetes. Los nodos de Kubernetes utilizan enrutamiento interno si el pod se ejecuta en otro nodo.
Establezca los puertos en en los valores del servicio spec.connectivity.replicaSetHorizons externo.
Ejemplo
15 security: 16 tls: 17 enabled: true 18 connectivity: 19 replicaSetHorizons: 20 - "example-website": "web1.example.com:30907" 21 - "example-website": "web2.example.com:32350" 22 - "example-website": "web3.example.com:31185" 23 ...
Guarde el archivo de configuración del conjunto de réplicas.
Actualice y reinicie la implementación del conjunto de réplicas.
En cualquier directorio, invoque el siguiente comando de Kubernetes para actualizar y reiniciar su conjunto de réplicas:
kubectl apply -f <replica-set-conf>.yaml
Pruebe la conexión al conjunto de réplicas.
En el entorno de desarrollo, para cada host de un conjunto de réplicas, ejecute el siguiente comando:
mongosh --host <my-replica-set>/web1.example.com \ --port 30907 --ssl \ --sslAllowInvalidCertificates
Nota
No utilice la bandera --sslAllowInvalidCertificates en producción.
En producción, para cada host en un conjunto de réplicas, especifique el certificado TLS y la CA para conectarse de forma segura a las herramientas o aplicaciones del cliente:
mongosh --host <my-replica-set>/web1.example.com \ --port 30907 \ --tls \ --tlsCertificateKeyFile server.pem \ --tlsCAFile ca-pem
Si la conexión se realiza correctamente, debería ver:
Enterprise <my-replica-set> [primary]
Para conectarse a su recurso de clúster fragmentado MongoDB implementado por el operador de Kubernetes desde fuera del clúster de Kubernetes:
Implemente un clúster fragmentado con el operador de Kubernetes.
Si no ha implementado un clúster fragmentado, siga las instrucciones para implementar uno.
Debe habilitar TLS para el clúster fragmentado configurando los siguientes ajustes:
Clave | Tipo | Necesidad | Descripción | Ejemplo |
|---|---|---|---|---|
spec.security | string | Requerido | Agregue el |
|
spec.security.tls | Colección | Opcional | Lista de todos los dominios que deben agregarse a los certificados TLS de cada pod en esta implementación. Al configurar este parámetro, cada CSR que el operador de Kubernetes transforma en un certificado TLS incluye un SAN con el |
|
Cree un servicio externo para los mongos pods.
Para conectarse a su clúster fragmentado desde un recurso externo, configure el ajuste spec.externalAccess:
externalAccess: {}
Esta configuración le indica al Operador de Kubernetes que cree un servicio externo LoadBalancer para los mongos pods en tu clúster compartido. El servicio externo proporciona un punto de entrada para conexiones externas. Añadir esta configuración sin valores crea un servicio externo con los siguientes valores por defecto:
Campo | Valor | Descripción |
|---|---|---|
|
| Nombre del servicio externo. No se puede cambiar este valor. |
|
| Crea un servicio LoadBalancer externo. |
|
| Un puerto |
|
| Especifica que los registros DNS se crean incluso si el pod no está listo. No se establece en |
Opcionalmente, si necesita agregar valores al servicio o anular los valores predeterminados, especifique:
Anotaciones específicas de su proveedor de nube, en
spec.externalAccess.externalService.annotationsAnulaciones para la especificación del servicio,
spec.externalAccess.externalService.specen.
Por ejemplo, los siguientes ajustes anulan los valores por defecto del servicio externo para configurar tu clúster de modo que cree servicios NodePort que expongan los Pods mongos:
externalAccess: externalService: annotations: # cloud-specific annotations for the service spec: type: NodePort # default is LoadBalancer port: 27017 # you can specify other spec overrides if necessary
Tip
Para obtener más información, consulte las anotaciones y ServiceSpec en la documentación de Kubernetes.
Agregue nombres alternativos de sujeto a sus certificados TLS.
Agregue cada nombre DNS externo al certificado SAN.
Cada host de MongoDB utiliza las siguientes SAN:
<my-sharded-cluster>-<shard>-<pod-index>.<external-domain> <my-sharded-cluster>-config-<pod-index>.<external-domain> <my-sharded-cluster>-mongos-<pod-index>.<external-domain>
La instancia de mongos utiliza el siguiente SAN:
<my-sharded-cluster>-mongos-<pod-index>-svc-external.<external-domain>
Configure el spec.security.tls.additionalCertificateDomains ajuste de forma similar al siguiente ejemplo. Cada certificado TLS que utilice debe incluir el SAN correspondiente para el fragmento, el servidor de configuración o la mongos instancia. El operador de Kubernetes valida su configuración.
1 2 apiVersion: mongodb.com/v1 3 kind: MongoDB 4 metadata: 5 name: <my-sharded-cluster> 6 spec: 7 version: "4.2.2-ent" 8 opsManager: 9 configMapRef: 10 name: <configMap.metadata.name> 11 # Must match metadata.name in ConfigMap file 12 shardCount: 2 13 mongodsPerShardCount: 3 14 mongosCount: 2 15 configServerCount: 3 16 credentials: my-secret 17 type: ShardedCluster 18 externalAccess: {} 19 security: 20 tls: 21 certsSecretPrefix: <prefix> 22 additionalCertificateDomains: 23 - "<external-domain>" 24 ...
Verificar los servicios externos.
En su clúster fragmentado, ejecute el siguiente comando para verificar que el operador de Kubernetes haya creado los servicios externos para su implementación.
kubectl get services
El comando devuelve una lista de servicios similar a la siguiente salida. Para cada mongos instancia del clúster, el operador de Kubernetes crea un servicio externo <pod-name>-<pod-idx>-svc-external llamado. Este servicio se configura según los valores y las anulaciones que proporcione en la especificación del servicio externo.
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE <my-sharded-cluster>-mongos-0-svc-external LoadBalancer 10.102.27.116 <lb-ip-or-fqdn> 27017:27017/TCP 8m30s <my-sharded-cluster>-mongos-1-svc-external LoadBalancer 10.102.27.116 <lb-ip-or-fqdn> 27017:27017/TCP 8m30s
Según la configuración de su clúster o su proveedor de nube, la dirección IP del servicio LoadBalancer es una dirección IP o FQDN accesible externamente. Puede usar la dirección IP o el FQDN para enrutar el tráfico desde su dominio externo. Este ejemplo tiene dos mongos instancias; por lo tanto, el operador de Kubernetes crea dos servicios externos.
Pruebe la conexión al clúster fragmentado.
Para conectarse a su implementación desde fuera del clúster de Kubernetes, use MongoDB Shell (mongosh) y especifique las direcciones de las mongos instancias que ha expuesto a través del dominio externo.
Ejemplo
Si tiene un FQDN externo de <my-sharded-cluster>-mongos-0-svc-external.<external-domain> dirección y <my-sharded-cluster>-mongos-1-svc-external.<external-domain> (comando: mongodb://<my-sharded-cluster>-mongos-0-svc-external.,<external-domain> <my-sharded-cluster>-mongos-1-svc-external.),<external-domain> puede conectarse a esta instancia de clúster fragmentado desde fuera del clúster de Kubernetes mediante el siguiente comando:
mongosh ""