Recomendamos implementar una malla de servicio para facilitar la conectividad entre recursos en una implementación de clúster fragmentado de múltiples clústeres; sin embargo, si prefiere implementar una implementación de clúster fragmentado de múltiples clústeres sin una malla de servicio, puede seguir esta guía para configurar la red requerida entre recursos de múltiples clústeres.
Las implementaciones de clústeres particionados en varios clústeres de Kubernetes sin una malla de servicios requieren que cada proceso se exponga externamente y esté configurado para identificarse mediante el nombre de host disponible externamente. Si la red de cada nombre de host está debidamente configurada (es decir, el tráfico al conectarse a cualquier nombre de host dado se enruta a un proceso/pod específico), entonces todos los demás procesos de MongoDB y clientes pueden conectarse a todos los procesos del clúster. Si bien los clientes se conectarán sólo a procesos mongos, es necesario exponer otros componentes porque, en la implementación de clústeres, todos los procesos deben poder conectarse entre sí en el clúster.
Procedimiento
Configura los namespace en cada clúster de Kubernetes.
Recomendamos que utilices el
kubectl mongodbplugin para realizar la configuración necesaria (es decir, RBAC, cuentas de servicio y el secreto de Kubernetes para el Operador de Kubernetes que contiene credenciales para otros clústeres de Kubernetes) automáticamente en todos los clústeres. Ver Cluster compartimentado en varios clústeres para obtener más información.
Instala y configura el Operador de Kubernetes.
Puedes seguir este procedimiento paralelo de la guía de implementación de Multi-Cluster Ops Manager.
Implementar recurso MongoDB.
Como se muestra en el siguiente ejemplo, configura el type y el topology como type=ShardedCluster y topology=MultiCluster.
apiVersion: mongodb.com/v1 kind: MongoDB metadata: annotations: mongodb.com/v1.architecture: non-static name: mdb-sharded namespace: ls spec: shardCount: 1 topology: MultiCluster type: ShardedCluster version: 8.0.4 credentials: my-credentials opsManager: configMapRef: name: my-project persistent: true security: authentication: agents: mode: X509 enabled: true internalCluster: X509 modes: - X509 certsSecretPrefix: prefix tls: ca: issuer-ca enabled: true externalAccess: {} configSrv: clusterSpecList: - clusterName: kind-e2e-cluster-1 externalAccess: externalDomain: kind-e2e-cluster-1.interconnected externalService: {} members: 1 - clusterName: kind-e2e-cluster-2 externalAccess: externalDomain: kind-e2e-cluster-2.interconnected externalService: {} members: 1 - clusterName: kind-e2e-cluster-3 externalAccess: externalDomain: kind-e2e-cluster-3.interconnected externalService: {} members: 1 mongos: clusterSpecList: - clusterName: kind-e2e-cluster-1 externalAccess: externalDomain: kind-e2e-cluster-1.interconnected externalService: {} members: 1 - clusterName: kind-e2e-cluster-2 externalAccess: externalDomain: kind-e2e-cluster-2.interconnected externalService: {} members: 1 - clusterName: kind-e2e-cluster-3 externalAccess: externalDomain: kind-e2e-cluster-3.interconnected externalService: {} members: 1 shard: clusterSpecList: - clusterName: kind-e2e-cluster-1 externalAccess: externalDomain: kind-e2e-cluster-1.interconnected externalService: {} members: 1 - clusterName: kind-e2e-cluster-2 externalAccess: externalDomain: kind-e2e-cluster-2.interconnected externalService: {} members: 1 - clusterName: kind-e2e-cluster-3 externalAccess: externalDomain: kind-e2e-cluster-3.interconnected externalService: {} members: 1
Detalles y consideraciones de ejemplo
El ejemplo anterior no está listo para producción. Tenga en cuenta los siguientes detalles y consideraciones:
El dominio en el ejemplo (
kind-e2e-cluster-3.interconnected) es artificial y debe ser reemplazado por el dominio correspondiente accesible externamente.La configuración utiliza TLS (no es posible exponer de forma segura los procesos externos de MongoDB sin TLS) y509 autenticación x. Esto se puede configurar arbitrariamente según las necesidades. Consulte la sección de Cifrado y Autenticación correspondiente para obtener más información.
Los certificados TLS en el clúster segmentado deben emitirse para los siguientes componentes:
Cada set de réplicas de partición
Conjunto de réplicas del servidor de configuración
Mongos
Cada certificado TLS (secretos
-certde tipo TLS, proporcionados manualmente o emitidos por cert-manager) debe proporcionarse en el clúster de Kubernetes donde se ejecuta el operador de Kubernetes. Desde allí, el operador de Kubernetes replica automáticamente los recursos necesarios (secretos-cert-pemgenerados) a los demás clústeres de Kubernetes.Cada certificado TLS para cada componente debe contener todos los nombres de host de todos los procesos del set de réplicas de ese componente. Por ejemplo, el certificado emitido para la primera partición (índice 0) debe tener en el campo SANs del certificado los siguientes nombres de host (para cada clúster en el que esté implementado; el nombre del pod sigue la convención
mdb-sharded-<shardIdx>-<clusterIdx>-<podIdxInThisCluster>).mdb-sharded-0-0-0.kind-e2e-cluster-1.interconnectedmdb-sharded-0-1-0.kind-e2e-cluster-2.interconnectedmdb-sharded-0-2-0.kind-e2e-cluster-3.interconnected
Para referencia, todos los procesos del clúster fragmentado implementado con el ejemplo proporcionado están configurados con los siguientes nombres de host:
mdb-sharded-0-0-0.kind-e2e-cluster-1.interconnected (shard-0) mdb-sharded-0-1-0.kind-e2e-cluster-2.interconnected (shard-0) mdb-sharded-0-2-0.kind-e2e-cluster-3.interconnected (shard-0) mdb-sharded-config-0-0.kind-e2e-cluster-1.interconnected (cs) mdb-sharded-config-1-0.kind-e2e-cluster-2.interconnected (cs) mdb-sharded-config-2-0.kind-e2e-cluster-3.interconnected (cs) mdb-sharded-mongos-0-0.kind-e2e-cluster-1.interconnected (mongos) mdb-sharded-mongos-1-0.kind-e2e-cluster-2.interconnected (mongos) mdb-sharded-mongos-2-0.kind-e2e-cluster-3.interconnected (mongos) Cada
externalService:se define con un objeto predeterminado{}.Esto significa que el Operador de Kubernetes crea los Servicios Externos (servicios creados para cada pod que debería utilizarse para enrutar el tráfico externo a) con los valores por defecto:
type: LoadBalancerports: 27017,27018para fines de copia de seguridad
Dependiendo de la configuración del clúster y del controlador del balanceador de carga en el clúster de Kubernetes, utilizar el tipo LoadBalancer para servicios externos provocará el provisionamineto de recursos de balanceador de carga para cada uno de los procesos en los clústeres fragmentados. Esto podría llevar a una gran cantidad de recursos LoadBalancer asignados. En la implementación mínima (1 mongos, set de réplicas del servidor de configuración de 3nodos, 1 partición de 3nodos en el set de réplicas) se crean 7 servicios LoadBalancer.
Para minimizar la cantidad de recursos de LoadBalancer que se crean, recomendamos que configure el acceso externo con servicios ClusterIP, como se muestra en el siguiente ejemplo:
- clusterName: kind-e2e-cluster-3 externalAccess: externalDomain: kind-e2e-cluster-3.interconnected externalService: type: ClusterIP Con cada proceso (pod) teniendo un servicio externo ClusterIP asociado, necesitas crear un componente proxy de "punto de entrada" externo al clúster de Kubernetes, que puede ser cualquier proxy (por ejemplo, HAProxy, Nginx) que soporte enrutamiento TLS Passthrough.
El componente proxy debe implementarse en cada clúster de Kubernetes y exponerse externamente en un nombre de host definido para los componentes en cada clúster:
En el ejemplo anterior, cada componente (mongos, servidor de configuración, particiones) definido para
kind-e2e-cluster-3usa externalDomain:externalDomain: kind-e2e-cluster-3.interconnectedEsto significa que el componente proxy debe estar configurado para recibir todas las conexiones a
*.kind-e2e-cluster-3.interconnected.Cada conexión tendrá un nombre de host que siga la convención de nombres
<pod-name>.<externalDomain>, por ejemplo:Partición pod:
mdb-sharded-0-2-0.kind-e2e-cluster-2.interconnected (mdb-sharded-<shardIdx>-<clusterIdx>-<podIdx>
El componente proxy debe estar configurado de manera que cualquier tráfico (en los puertos
27017o27018) sea enrutado (a nivel TCP, sin re-encriptar el tráfico) al servicio externo respectivo.Por ejemplo, para
mdb-sharded-0-2-0-svc-external, puede utilizarse una regla genérica al configurar el envío como<pod-name>.kind-e2e-cluster-2.interconnectedredirigido a<pod-name>-mdb-sharded-0-2-0-svc-external.
Ten en cuenta que el
externalDomainutilizado en el ejemplo es artificial. Debe ser reemplazado por un nombre de dominio apropiado.El operador implementa todos los procesos en los clústeres de Kubernetes junto con todos los servicios externos necesarios.
Cada servicio externo en cada clúster debe recibir tráfico externo en los dominios externos definidos. Hasta que la red esté completamente configurada, el clúster no se configurará correctamente, porque para que el replicaset esté configurado, los procesos mongod deben poder conectarse entre sí para fines de replicación.
Al utilizar dominios externos, toda la red (para replicación y para la conectividad de MongoDB Agent a MongoDB) se enruta por defecto a través del dominio externo, lo que puede no ser eficiente. Una de las formas de mejorarlo es configurar la red o la resolución de DNS dentro del clúster para que los nombres de host externos de los pods desplegados en los mismos clústeres de Kubernetes se resuelvan en la dirección IP local del clúster de los servicios externos.