Para agentes de IA: hay un índice de documentación disponible en https://www.mongodb.com/es/docs/llms.txt — versiones en markdown de todas las páginas están disponibles agregando .md a cualquier ruta URL.
Docs Menu

Prerrequisitos de implementación Multi-clúster

Antes de crear una implementación de MongoDB en varios clústeres de Kubernetes utilizando el inicio rápido o un procedimiento de implementación, completa las siguientes tareas.

Para obtener más información sobre los requisitos previos específicos del inicio rápido, consulte Requisitos previos de inicio rápido.

Consulta arquitecturas de hardware compatibles.

Clona el Repositorio de Controladores MongoDB para Kubernetes operador y consulta la etiqueta de la versión actual:

git clone https://github.com/mongodb/mongodb-kubernetes.git
cd mongodb-kubernetes
git checkout 1.10.0

Establezca las variables de entorno con los nombres de los clústeres donde implemente los clústeres, como en este ejemplo:

export MDB_CENTRAL_CLUSTER_FULL_NAME="mdb-central"
export MDB_CLUSTER_1_FULL_NAME="mdb-1"
export MDB_CLUSTER_2_FULL_NAME="mdb-2"
export MDB_CLUSTER_3_FULL_NAME="mdb-3"

Instala las siguientes herramientas:

  1. Instala Go v1.17 o posterior.

  2. Instalar Helm.

Para utilizar una implementación de MongoDB de múltiples clústeres de Kubernetes, debe tener un conjunto específico de Kubernetes Roles, ClusterRoles, RoleBindings, ClusterRoleBindings, y ServiceAccounts, que se pueden configurar de cualquiera de las siguientes maneras:

  • Sigue la Guía Rápida de Multi-Kubernetes-Cluster, que te indica cómo utilizar el Plugin de MongoDB para crear automáticamente los objetos requeridos y aplicarlos a los clústeres apropiados dentro de tu implementación multi-Kubernetes-cluster de MongoDB.

  • Usa Helm para configurar los Roles y cuentas de servicio requeridos de Kubernetes para cada clúster nodo:

    helm template --show-only \
    templates/database-roles.yaml \
    mongodb/mongodb-kubernetes \
    --set namespace=mongodb | \
    kubectl apply -f - \
    --context=$MDB_CLUSTER_1_FULL_NAME \
    --namespace mongodb
    helm template --show-only \
    templates/database-roles.yaml \
    mongodb/mongodb-kubernetes \
    --set namespace=mongodb | \
    kubectl apply -f - \
    --context=$MDB_CLUSTER_2_FULL_NAME \
    --namespace mongodb
    helm template --show-only \
    templates/database-roles.yaml \
    mongodb/mongodb-kubernetes \
    --set namespace=mongodb | \
    kubectl apply -f - \
    --context=$MDB_CLUSTER_3_FULL_NAME \
    --namespace mongodb
  • Crea manualmente los archivos .yaml de objetos de Kubernetes y añade los Roles de Kubernetes requeridos y las cuentas de servicio a tu implementación de MongoDB multi-Kubernetes con el comando kubectl apply. Esto puede ser necesario para ciertos flujos de trabajo altamente automatizados. MongoDB proporciona archivos de configuración de muestra.

    Para recursos personalizados dirigidos a un subconjunto de namespaces:

    Para recursos personalizados con ámbito de namespace a nivel de clúster:

    Cada archivo define múltiples recursos. Para apoyar su implementación, debe reemplazar los valores de marcador de posición en los siguientes campos:

    • subjects.namespace en cada recurso RoleBinding o ClusterRoleBinding

    • metadata.namespace en cada recurso de ServiceAccount

    Después de modificar las definiciones, aplícalas ejecutando el siguiente comando para cada archivo:

    kubectl apply -f <fileName>

Por defecto, el operador de Kubernetes multiclúster está limitado al namespace en el que se instala. El Kubernetes operador concilia el recurso MongoDBMultiCluster implementado en el mismo namespace que el Kubernetes operador.

Cuando ejecutes el complemento kubectl de MongoDB como parte del inicio rápido multiclúster y no modifiques los ajustes del complemento de kubectl mongodb, el complemento:

Una vez que el Operador de Kubernetes crea la implementación de MongoDB de clústeres múltiples en Kubernetes, el Operador de Kubernetes comienza a monitorear los recursos MongoDB en el mongodb namespace.

Para configurar el operador de Kubernetes con los permisos correctos para implementar en un subconjunto o en todos los espacios de nombres, ejecuta el siguiente comando y especifica los espacios de nombres que deseas que el operador de Kubernetes supervise.

kubectl mongodb multicluster setup \
--central-cluster="${MDB_CENTRAL_CLUSTER_FULL_NAME}" \
--member-clusters="${MDB_CLUSTER_1_FULL_NAME},${MDB_CLUSTER_2_FULL_NAME},${MDB_CLUSTER_3_FULL_NAME}" \
--member-cluster-namespace="mongodb2" \
--central-cluster-namespace="mongodb2" \
--create-service-account-secrets \
--cluster-scoped="true"

Cuando instales el despliegue de MongoDB en clústeres múltiples de Kubernetes en uno o más namespaces, podrás configurar el Operador de Kubernetes para:

Nota

Instale y configure una sola instancia de un operador de Kubernetes y configúrela para monitorear uno, varios o todos los recursos personalizados en diferentes subconjuntos de namespaces que no se superpongan. Ver también ¿MongoDB admite ejecutar más de una instancia de Kubernetes operador?

Si estableces el alcance de la implementación de MongoDB en múltiples clústeres de Kubernetes en varios namespaces, puedes configurar el Operador de Kubernetes para monitorear los recursos MongoDB en estos espacios de nombres en la implementación de MongoDB en múltiples clústeres de Kubernetes.

Establece el spec.template.spec.containers.name.env.name:WATCH_NAMESPACE en el mongodb-kubernetes.yaml archivo del repositorio de GitHub de MongoDB Controllers for Kubernetes operador a la lista de namespaces separada por comas que deseas que el Kubernetes operador observe:

WATCH_NAMESPACE: "$namespace1,$namespace2,$namespace3"

Si estableces el alcance de la implementación multi-Kubernetes clúster MongoDB para todos los namespaces en lugar del namespace por defecto mongodb, puedes configurar el Kubernetes operador para observar los recursos MongoDB en todos los namespaces en la implementación multi-Kubernetes clúster MongoDB.

Establece el spec.template.spec.containers.name.env.name:WATCH_NAMESPACE en mongodb-kubernetes.yaml a "*". Debes incluir las comillas dobles (") alrededor del asterisco (*) en el archivo YAML.

WATCH_NAMESPACE: "*"

Una malla de servicios permiten la comunicación entre clústeres entre los miembros del set de réplicas desplegados en diferentes clústeres de Kubernetes. Utilizar una malla de servicios simplifica en gran medida la creación de implementaciones de MongoDB en varios clústeres de Kubernetes, y es la forma recomendada de implementar MongoDB en varios clústeres de Kubernetes. Sin embargo, si tu organización de TI no utiliza una malla de servicios, puedes implementar un set de réplicas en una implementación de MongoDB en varios clústeres de Kubernetes sin ella.

Según tu entorno, realiza lo siguiente:

Independientemente del tipo de implementación, una implementación de MongoDB en Kubernetes debe establecer las siguientes conexiones:

  • Desde el agente MongoDB Ops Manager en el pod hasta su proceso mongod, para activar la gestión del ciclo de vida y la supervisión de la implementación de MongoDB.

  • Desde el Ops Manager MongoDB Agent en el Pod hasta la instancia de Ops Manager, para habilitar la automatización.

  • Entre todos los procesos mongod, para permitir la replicación.

Cuando el operador de Kubernetes implementa los recursos de MongoDB, trata estos requisitos de conectividad de la siguiente manera, dependiendo del tipo de implementación:

  • En una única implementación de clúster de Kubernetes, el operador de Kubernetes configura los nombres de host en el set de réplicas como FQDNde un servicio sin cabeza. Se trata de un servicio único que resuelve el DNS de una dirección IP directa de cada Pod que aloja una instancia de MongoDB por el FQDN del Pod, de la siguiente manera: <pod-name>.<replica-set-name>-svc.<namespace>.svc.cluster.local.

  • En una implementación de MongoDB que utiliza múltiples clústeres de Kubernetes y una malla de servicios, el Operador de Kubernetes crea un StatefulSet independiente para cada miembro del set de réplicas de MongoDB en el clúster de Kubernetes. Un malla de servicios permite la comunicación entre los procesos mongod a través de diferentes clústeres de Kubernetes.

    El uso de una malla de servicios permite que la implementación de MongoDB en múltiples clústeres de Kubernetes pueda:

    • Lograr la resolución global de nombres de host DNS en todos los clústeres de Kubernetes y establecer conectividad entre ellos. Para cada Pod de implementación de MongoDB en cada clúster de Kubernetes, el operador de Kubernetes crea un servicio ClusterIP a través de la configuración spec.duplicateServiceObjects: true en el recurso MongoDBMultiCluster. Cada proceso tiene un nombre de host definido para el FQDN de este servicio: <pod-name>-svc.<namespace>.svc.cluster.local. Estos nombres de host se resuelven desde DNS a la ClusterIP de un servicio en cada clúster de nodos.

    • Establezca comunicación entre Pods en diferentes clústeres de Kubernetes. Como resultado, los nodos del conjunto de réplicas alojados en diferentes clústeres forman un único set de réplicas en estos clústeres.

  • En una implementación multiclúster de Kubernetes MongoDB sin un service mesh, el Operador de Kubernetes utiliza las siguientes configuraciones de recursos de MongoDBMultiCluster para exponer de forma externa todos sus procesos de mongod. Esto habilita la resolución DNS de nombres de host entre diferentes clústeres de Kubernetes y establece conectividad entre los Pods que se enrutan a través de las redes que conectan estos clústeres.

Instala Istio en un modo multi-primario en diferentes redes, usando la documentación de Istio. Istio es una malla de servicios que simplifica la resolución de DNS y ayuda a establecer la comunicación entre clústeres nodos de Kubernetes en una implementación MongoDB en clústeres múltiples de Kubernetes. Si decides usar un Service Mesh, necesitas instalarlo. Si no puedes utilizar un mesh de servicios, omite esta sección y utiliza dominios externos y configura DNS para habilitar conectividad externa.

Además, ofrecemos el script de ejemplo install_istio_separate_network. Este script se basa en la documentación de Istio y proporciona un ejemplo de instalación que utiliza el modo multi-primario en diferentes redes. No garantizamos el mantenimiento del script con futuras versiones de Istio. Si eliges usar el script, revisa la documentación más reciente de Istio para la instalación de un multiclúster, y, si es necesario, adapta el script para que coincida con la documentación y tu implementación. Si usas otra solución de servicio mallado, crea tu propio script para configurar redes separadas que faciliten la resolución de DNS.

Si no utilizas un servicio mallado, realiza lo siguiente para habilitar la conectividad externa hacia y entre los procesos de mongod y el MongoDB Agent del Ops Manager:

  • Cuando crees una implementación de MongoDB de clúster múltiple de Kubernetes, usa spec.clusterSpecList.externalAccess.externalDomain configuración para especificar un dominio externo e instruir al Operador de Kubernetes para configurar los nombres de host para mongod procesos en el siguiente patrón:

    <pod-name>.<externalDomain>

    Nota

    Solo puedes especificar dominios externos para nuevas implementaciones. No se pueden cambiar los dominios externos después de configurar una implementación multi-Kubernetes de clúster de MongoDB.

    Después de que configures un dominio externo de esta manera, los agentes de MongoDB de Ops Manager y los procesos mongod utilizan este dominio para conectarse entre sí.

  • Personaliza los servicios externos que el operador de Kubernetes crea para cada pod en el clúster de Kubernetes. Utiliza la configuración global dentro de spec.externalAccess configuraciones y las anulaciones específicas del clúster de Kubernetes en spec.clusterSpecList.externalAccess.externalService configuraciones.

  • Configure los nombres de host de los Pods en una zona DNS para garantizar que cada Pod de Kubernetes que aloja un proceso mongod permita establecer una conexión externa con los otros procesos mongod en una implementación de MongoDB en clústeres múltiples de Kubernetes. Un Pod se considera "expuesto externamente" cuando puede conectarse a un proceso mongod utilizando el nombre de host <pod-name>.<externalDomain> en los puertos 27017 (este es el puerto de base de datos por defecto) y 27018 (este es el puerto de base de datos + 1). También es posible que deba configurar reglas de firewall para permitir el tráfico TCP en los puertos 27017 y 27018.

Después de completar estos prerrequisitos, podrá implementar un clúster multi-Kubernetes sin un "service mesh".

Sigue los pasos de este procedimiento para verificar que los FQDNdel servicio sean accesibles en los clústeres de Kubernetes.

En este ejemplo, implementas una aplicación de muestra definida en sample-service.yaml en dos clústeres de Kubernetes.

1

Crea un namespace en cada uno de los clústeres de Kubernetes para implementar el sample-service.yaml.

kubectl create --context="${CTX_CLUSTER_1}" namespace sample
kubectl create --context="${CTX_CLUSTER_2}" namespace sample

Nota

En ciertas soluciones de malla de servicios, es posible que debas anotar o etiquetar el namespace.

2
kubectl apply --context="${CTX_CLUSTER_1}" \
-f sample-service.yaml \
-l service=helloworld1 \
-n sample
kubectl apply --context="${CTX_CLUSTER_2}" \
-f sample-service.yaml \
-l service=helloworld2 \
-n sample
3
kubectl apply --context="${CTX_CLUSTER_1}" \
-f sample-service.yaml \
-l version=v1 \
-n sample
4

Verifique que el Pod de hosting CLUSTER_1 esté en el estado Running.

kubectl get pod --context="${CTX_CLUSTER_1}" \
-n sample \
-l app=helloworld
5
kubectl apply --context="${CTX_CLUSTER_2}" \
-f sample-service.yaml \
-l version=v2 \
-n sample
6

Verifique que el Pod de hosting CLUSTER_2 esté en el estado Running.

kubectl get pod --context="${CTX_CLUSTER_2}" \
-n sample \
-l app=helloworld
7

Implementa el pod en CLUSTER_1 y verifica que puedes acceder a la aplicación de muestra en CLUSTER_2.

kubectl run --context="${CTX_CLUSTER_1}" \
-n sample \
curl --image=radial/busyboxplus:curl \
-i --tty \
curl -sS helloworld2.sample:5000/hello

Deberías ver una salida similar a este ejemplo:

Hello version: v2, instance: helloworld-v2-758dd55874-6x4t8
8

Implementa el pod en CLUSTER_2 y verifica que puedes acceder a la aplicación de muestra en CLUSTER_1.

kubectl run --context="${CTX_CLUSTER_2}" \
-n sample \
curl --image=radial/busyboxplus:curl \
-i --tty \
curl -sS helloworld1.sample:5000/hello

Deberías ver una salida similar a este ejemplo:

Hello version: v1, instance: helloworld-v1-758dd55874-6x4t8

Como parte de la Guía de inicio rápido, implementas un recurso de Ops Manager en el clúster central.

Si planeas asegurar tu implementación de MongoDB en múltiples clústeres de Kubernetes utilizando cifrado TLS, completa las siguientes tareas para habilitar la autenticación interna del clúster y generar certificados TLS para los clústeres nodos y el MongoDB Agent:

Nota

Debes tener en tu poder el certificado CA y la clave que has utilizado para firmar tus certificados TLS.

1

Utiliza una de las siguientes opciones:

  • Genere un certificado wildcard TLS que incluya los nombres de host de los servicios que el Operador de Kubernetes crea para cada pod en la implementación.

    Si generas certificados wildcard, puedes seguir usando los mismos certificados cuando aumentes el tamaño o rebalancees nodos en los clústeres miembros de Kubernetes, por ejemplo para recuperación ante desastres.

    Por ejemplo, agrega el nombre de host en un formato similar al siguiente al SAN:

    *.<namespace>.svc.cluster.local
  • Para cada servicio de Kubernetes que el operador de Kubernetes genera de manera correspondiente para cada Pod en cada clúster de nodos, agregue SANs al certificado. En su certificado TLS, el SAN para cada servicio de Kubernetes debe utilizar el siguiente formato:

    <metadata.name>-<member_cluster_index>-<n>-svc.<namespace>.svc.cluster.local

    donde n varía desde 0 hasta clusterSpecList[member_cluster_index].members - 1.

2

Para el certificado TLS de MongoDB Agent:

  • El nombre común en el certificado TLS no debe estar vacío.

  • La organización y la unidad organizacional combinadas en cada certificado TLS deben diferir de la organización y la unidad organizacional en el certificado TLS para sus miembros del set de réplicas.

Importante

El Operador de Kubernetes utiliza kubernetes.io/tls secretos para almacenar certificados TLS y llaves privadas para recursos de Ops Manager y MongoDB. A partir de la versión 1.17.0 del operador de Kubernetes, el operador de Kubernetes ya no admite archivos PEM concatenados almacenados como secretos opacos.

Puede elegir crear y mantener los archivos de recursos necesarios para la

MongoDBMultiCluster Recursos

implementación en un entorno GitOps.

Si utiliza un flujo de trabajo GitOps, no podrá usar el complemento kubectl mongodb, que configura automáticamente el control de acceso basado en roles (RBAC) y crea el archivo kubeconfig que permite que el clúster central se comunique con sus clústeres miembros. En su lugar, deberá configurar manualmente o crear su propia automatización para configurar los archivos RBAC y kubeconfig siguiendo el procedimiento y los ejemplos de Configurar recursos para GitOps.

Las siguientes secciones de requisitos previos describen cómo instalar el plugin kubectl MongoDB en caso de que no se use GitOps o cómo configurar recursos para GitOps si lo hace.

Usa el plugin kubectl mongodb para:

Nota

Si usas GitOps, no puedes usar el plugin kubectl mongodb. En su lugar, sigue el procedimiento en Configura recursos para GitOps.

Para instalar el plugin kubectl mongodb:

1

Descargue la versión deseada del paquete del operador de Kubernetes desde la Página de lanzamiento del Repositorio del operador MongoDB Controllers for Kubernetes.

El nombre del paquete utiliza este patrón: kubectl-mongodb_{{ .Version }}_{{ .Os }}_{{ .Arch }}.tar.gz.

Utilice uno de los siguientes paquetes:

  • kubectl-mongodb_{{ .Version }}_darwin_amd64.tar.gz

  • kubectl-mongodb_{{ .Version }}_darwin_arm64.tar.gz

  • kubectl-mongodb_{{ .Version }}_linux_amd64.tar.gz

  • kubectl-mongodb_{{ .Version }}_linux_arm64.tar.gz

2

Desempaqueta el paquete, como en el siguiente ejemplo:

tar -zxvf kubectl-mongodb_<version>_darwin_amd64.tar.gz
3

Encuentra el binario kubectl-mongodb en el directorio desenpaquetado y muévelo a su destino deseado, dentro del PATH para el usuario del Operador de Kubernetes, como se muestra en el siguiente ejemplo:

mv kubectl-mongodb /usr/local/bin/kubectl-mongodb

Ahora puedes ejecutar el plugin kubectl mongodb usando los siguientes comandos:

kubectl mongodb multicluster setup
kubectl mongodb multicluster recover

Para obtener más información sobre los flags compatibles, consulte la Referencia de MongoDB kubectl plugin.

Si utilizas un flujo de trabajo GitOps, no podrás utilizar el plugin kubectl mongodb para configurar automáticamente el Control de Acceso Basado en Roles (RBAC) o el archivo kubeconfig que permite que el clúster central se comunique con sus clústeres nodos. En su lugar, deberás configurar y aplicar manualmente los siguientes archivos de recursos o compilar tu propia automatización basada en la información a continuación.

Nota

Para saber cómo el plugin kubectl mongodb automatiza los siguientes pasos, consulte el código fuente del plugin en el repositorio del operador de Kubernetes de MongoDB.

Para configurar RBAC y el kubeconfig para GitOps:

1

Utiliza estos ejemplos de recursos RBAC para crear los tuyos. Para aprender más sobre estos recursos de RBAC, consulta Entender los roles y las vinculaciones de roles de Kubernetes.

Para aplicarlos a tus clústeres centrales y nodos con GitOps, puedes usar una herramienta como Argo CD.

2

El operador de Kubernetes realiza un seguimiento de sus clústeres miembros utilizando un archivo ConfigMap . Copia, modifica y aplica el siguiente ejemplo de ConfigMap:

apiVersion: v1
kind: ConfigMap
data:
cluster1: ""
cluster2: ""
metadata:
namespace: <namespace>
name: mongodb-kubernetes-operator-member-list
labels:
multi-cluster: "true"
3

El operador de Kubernetes, que se ejecuta en el clúster central, se comunica con los Pods en los clústeres nodo a través de la API de Kubernetes. Para que esto funcione, el operador de Kubernetes necesita un kubeconfig archivo que contenga los tokens de la cuenta de servicio de los clústeres de nodos. Cree este archivo kubeconfig siguiendo estos pasos:

  1. Obtén una lista de cuentas de servicio configuradas en el namespace del Operador de Kubernetes. Por ejemplo, si eliges usar el namespace mongodb por defecto, puedes obtener las cuentas de servicio usando el siguiente comando:

    kubectl get serviceaccounts -n mongodb
  2. Obtén el secreto para cada cuenta de servicio que pertenezca a un clúster de miembros.

    kubectl get secret <service-account-name> -n mongodb -o yaml
  3. En cada secreto de cuenta de servicio, copie el CA certificado y el token. Por ejemplo, copie <ca_certificate> y <token> del secreto, como se muestra en el siguiente ejemplo:

    apiVersion: v1
    kind: Secret
    metadata:
    name: my-service-account
    namespace: mongodb
    data:
    ca.crt: <ca_certificate>
    token: <token>
  4. Copia el siguiente ejemplo kubeconfig para el clúster central y reemplaza los marcadores de posición con las <ca_certificate> y <token> que copiaste de los secretos de cuenta de servicio ejecutando los comandos que se indican a continuación.

    apiVersion: v1
    clusters:
    - cluster:
    certificate-authority:
    server: https://
    name: kind-e2e-cluster-1
    - cluster:
    certificate-authority:
    server: https://
    name: kind-e2e-cluster-2
    contexts:
    - context:
    cluster: kind-e2e-cluster-1
    namespace: mongodb
    user: kind-e2e-cluster-1
    name: kind-e2e-cluster-1
    - context:
    cluster: kind-e2e-cluster-2
    namespace: mongodb
    user: kind-e2e-cluster-2
    name: kind-e2e-cluster-2
    kind: Config
    users:
    - name: kind-e2e-cluster-1
    user:
    token:
    - name: kind-e2e-cluster-2
    user:
    token:

    Completa los siguientes comandos kubectl con los valores correctos y ejecútalos para actualizar tu archivo de ejemplo kubeconfig.

    kubectl config --kubeconfig=kubeconfig set-cluster kind-e2e-cluster-1 --certificate-authority=<cluster-1-ca.crt>
    kubectl config --kubeconfig=kubeconfig set-cluster kind-e2e-cluster-2 --certificate-authority=<cluster-2-ca.crt>
    kubectl config --kubeconfig=kubeconfig set-credentials kind-e2e-cluster-1 --token=<cluster-1-token>
    kubectl config --kubeconfig=kubeconfig set-credentials kind-e2e-cluster-2 --token=<cluster-2-token>
  5. Cree un secreto en el clúster central que monte en el Operador de Kubernetes como se ilustra en la gráfica de referencia de Helm. Por ejemplo:

    kubectl --context="${CTX_CENTRAL_CLUSTER}" -n <operator-namespace> create secret --from-file=kubeconfig=<path-to-kubeconfig-file> <kubeconfig-secret-name>