Utilice el inicio rápido para implementar un conjunto de réplicas de MongoDB en tres clústeres de nodos de Kubernetes mediante GKE (Google Kubernetes Motor) y Istio servicio mesh.
Antes de empezar:
Revisa la lista de servicios y herramientas de múltiples clústeres de Kubernetes
Completar los prerrequisitos
Nota
Los siguientes procedimientos delimitan el alcance de tu implementación de MongoDB en un clúster multi-Kubernetes a un solo namespace nombrado mongodb. Puede configurar su implementación de clúster multi-Kubernetes de MongoDB para monitorear recursos en múltiples namespaces o todos los namespaces.
¿Prefieres aprender mirando?
Sigue este tutorial en vídeo que demuestra cómo crear una implementación de MongoDB multi-clúster de Kubernetes.
Duración: 12 minutos
Implementación de un conjunto de réplicas de MongoDB en varios clústeres de Kubernetes
Requisitos previos
Antes de crear una implementación de MongoDB en clústeres multi-Kubernetes mediante la guía de inicio rápido, complete las siguientes tareas:
Revise los requisitos generales previos
Asegúrate de cumplir con el requisito previo general antes de continuar. Para obtener más información, consulta Requisitos previos generales.
Establece las variables de entorno y las zonas de GKE
Establece las variables de entorno con los nombres de clúster y las zonas de GKE disponibles donde implementas los clústeres, como en este ejemplo:
export MDB_GKE_PROJECT={GKE project name} export MDB_CENTRAL_CLUSTER_ZONE="us-west1-a" export MDB_CLUSTER_1_ZONE="us-west1-b" export MDB_CLUSTER_2_ZONE="us-east1-b" export MDB_CLUSTER_3_ZONE="us-central1-a" export MDB_CENTRAL_CLUSTER_FULL_NAME="gke_${MDB_GKE_PROJECT}_${MDB_CENTRAL_CLUSTER_ZONE}_${MDB_CENTRAL_CLUSTER}" export MDB_CLUSTER_1_FULL_NAME="gke_${MDB_GKE_PROJECT}_${MDB_CLUSTER_1_ZONE}_${MDB_CLUSTER_1}" export MDB_CLUSTER_2_FULL_NAME="gke_${MDB_GKE_PROJECT}_${MDB_CLUSTER_2_ZONE}_${MDB_CLUSTER_2}" export MDB_CLUSTER_3_FULL_NAME="gke_${MDB_GKE_PROJECT}_${MDB_CLUSTER_3_ZONE}_${MDB_CLUSTER_3}"
Configura clústeres de GKE
Configurar los clústeres de GKE (Google Kubernetes Engine):
Configura tu cuenta de Google Cloud.
Si aún no lo has hecho, crea un proyecto de Google Cloud, habilita la facturación en el proyecto, habilita los Artifact Registry y GKE APIs, y lanza Cloud Shell siguiendo los procedimientos relevantes en la Guía rápida de Google Kubernetes Engine en la documentación de Google Cloud.
Crea un clúster operador y clústeres nodos.
Crea un clúster de operador y uno o más clústeres nodos, especificando las zonas de GKE, el número de nodos y los tipos de instancia, como en estos ejemplos:
gcloud container clusters create $MDB_CENTRAL_CLUSTER \ --zone=$MDB_CENTRAL_CLUSTER_ZONE \ --num-nodes=5 \ --machine-type "e2-standard-2"
gcloud container clusters create $MDB_CLUSTER_1 \ --zone=$MDB_CLUSTER_1_ZONE \ --num-nodes=5 \ --machine-type "e2-standard-2"
gcloud container clusters create $MDB_CLUSTER_2 \ --zone=$MDB_CLUSTER_2_ZONE \ --num-nodes=5 \ --machine-type "e2-standard-2"
gcloud container clusters create $MDB_CLUSTER_3 \ --zone=$MDB_CLUSTER_3_ZONE \ --num-nodes=5 \ --machine-type "e2-standard-2"
Obtener credenciales de autenticación de usuario para los clústeres principal y de nodos.
Obtén las credenciales de autenticación del usuario para los clústeres central y nodo de Kubernetes y guarda las credenciales. Más adelante, usará estas credenciales para ejecutar comandos kubectl en estos clústeres.
Ejecute los siguientes comandos:
gcloud container clusters get-credentials $MDB_CENTRAL_CLUSTER \ --zone=$MDB_CENTRAL_CLUSTER_ZONE gcloud container clusters get-credentials $MDB_CLUSTER_1 \ --zone=$MDB_CLUSTER_1_ZONE gcloud container clusters get-credentials $MDB_CLUSTER_2 \ --zone=$MDB_CLUSTER_2_ZONE gcloud container clusters get-credentials $MDB_CLUSTER_3 \ --zone=$MDB_CLUSTER_3_ZONE
Implementar un recurso MongoDBMultiCluster
Selecciona la pestaña correspondiente en función de si deseas encriptar las conexiones del set de réplicas en tus implementaciones de MongoDB en clústeres multi-Kubernetes usando TLS certificados.
Puedes utilizar los siguientes procedimientos en este TLS-Encrypted Connections tab:
Implementar un recurso
MongoDBMultiClusterRenovar certificados TLS para un recurso de
MongoDBMultiCluster
Estos procedimientos establecen conexiones cifradas con TLSentre hosts de MongoDB en un set de réplicas, y entre aplicaciones cliente e implementaciones de MongoDB.
Antes de comenzar, debe tener certificados válidos para el cifrado TLS.
Cree el secreto para el certificado TLS de su recurso MongoDBMultiCluster.
Ejecute el comando kubectl para crear un nuevo secreto que almacene el certificado de recurso MongoDBMultiCluster:
kubectl --context $MDB_CENTRAL_CLUSTER_FULL_NAME \ --namespace=<metadata.namespace> \ create secret tls <prefix>-<metadata.name>-cert \ --cert=<resource-tls-cert> \ --key=<resource-tls-key>
Nota
Debe anteponer sus secretos con <prefix>-<metadata.name>.
Por ejemplo, si le llamas a tu implementación my-deployment y estableces el prefijo en mdb, debes nombrar el secreto TLS para las comunicaciones TLS del cliente mdb-my-deployment-cert. Además, debes nombrar el secreto TLS para la autenticación interna del clúster (si está habilitada) mdb-my-deployment-clusterfile.
Cree el ConfigMap para vincular su CA con su recurso MongoDBMultiCluster.
Ejecute el comando kubectl para vincular su CA a su recurso MongoDBMultiCluster . Especifica el archivo del certificado CA al que siempre debes asignar el nombre ca-pem para el recurso MongoDBMultiCluster:
kubectl --context $MDB_CENTRAL_CLUSTER_FULL_NAME \ --namespace=<metadata.namespace> \ create configmap custom-ca -from-file=ca-pem=<your-custom-ca-file>
Ejecuta el plugin kubectl mongodb.
Por defecto, el Operador de Kubernetes está restringido al namespace mongodb. Cuando ejecutas el siguiente comando, el plugin kubectl mongodb:
Crea un clúster de operador, tres clústeres de nodo y un namespace etiquetado
mongodben cada uno de los clústeres.Crea un ConfigMap por defecto con el nombre predefinido
mongodb-kubernetes-operator-member-listque contiene todos los nodos de clústeres. No se puede cambiar el nombre del ConfigMap.Crea las cuentas de servicio y roles necesarias para ejecutar cargas de trabajo de bases de datos en los clústeres nodos.
Ejecute el kubectl mongodb plugin:
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="mongodb" \ --central-cluster-namespace="mongodb" \ --create-service-account-secrets \ --install-database-roles=true
opcional: Establece el webhook de inyección Istio en cada clúster de nodos.
Si utiliza Istio, ejecute el siguiente comando en el clúster operador, especificando el contexto para cada uno de los clústeres nodos en la implementación. Para habilitar la inyección sidecar en Istio, los siguientes comandos añaden las etiquetas istio-injection=enabled a los namespaces mongodb de cada clúster miembro. Si utilizas otro service mesh, configúralo para gestionar el tráfico de red en los namespaces creados.
kubectl label \ --context=$MDB_CLUSTER_1_FULL_NAME \ namespace mongodb \ istio-injection=enabled
kubectl label \ --context=$MDB_CLUSTER_2_FULL_NAME \ namespace mongodb \ istio-injection=enabled
kubectl label \ --context=$MDB_CLUSTER_3_FULL_NAME \ namespace mongodb \ istio-injection=enabled
Configura kubectl para usar el namespace del clúster del operador.
Si no lo has hecho ya, ejecuta los siguientes comandos para ejecutar todos los comandos kubectl en el clúster de operador en el espacio de nombres por defecto.
kubectl config use-context $MDB_CENTRAL_CLUSTER_FULL_NAME kubectl config set-context $(kubectl config current-context) \ --namespace=mongodb
Implementa los Controladores de MongoDB para Kubernetes Operator en el clúster del operador.
Despliega los Controladores de MongoDB para el Operador de Kubernetes en el clúster de operadores en el namespace mongodb con Helm o kubectl.
Agregue el repositorio MongoDB Helm Charts para Kubernetes a Helm.
helm repo add mongodb https://mongodb.github.io/helm-charts Utiliza los Helm Charts de MongoDB para Kubernetes para implementar el operador de Kubernetes.
helm upgrade \ --install \ mongodb-kubernetes-operator-multi-cluster \ mongodb/mongodb-kubernetes \ --namespace mongodb \ --set namespace=mongodb \ --version <mongodb-kubernetes-operator-version> \ --set operator.name=mongodb-kubernetes-operator-multi-cluster \ --set operator.createOperatorServiceAccount=false \ --set operator.createResourcesServiceAccountsAndRoles=false \ --set "multiCluster.clusters={$MDB_CLUSTER_1_FULL_NAME,$MDB_CLUSTER_2_FULL_NAME,$MDB_CLUSTER_3_FULL_NAME}" \ --set multiCluster.performFailover=false
Aplica los recursos personalizados del operador de Kubernetes.
kubectl apply -f https://raw.githubusercontent.com/mongodb/mongodb-kubernetes/master/public/crds.yaml Descargue la plantilla YAML del Kubernetes operador.
curl https://raw.githubusercontent.com/mongodb/mongodb-kubernetes/master/public/mongodb-kubernetes-multi-cluster.yaml -o operator.yaml Opcional: Personaliza la plantilla YAML del Operador de Kubernetes.
Para aprender sobre la configuración opcional de la instalación del operador de Kubernetes, consulta MongoDB Controllers for Kubernetes Operator kubectl y oc Configuración de instalación.
Aplicar el archivo YAML del operador de Kubernetes.
kubectl apply -f operator.yaml Verifica que el operador de Kubernetes está implementado.
Para verificar que el Operador de Kubernetes se instaló correctamente, ejecuta el siguiente comando y verifica el resultado:
kubectl describe deployments mongodb-kubernetes-operator -n <metadata.namespace> oc describe deployments mongodb-kubernetes-operator -n <metadata.namespace> Por defecto, las implementaciones existen en el namespace
mongodb. Si aparece el siguiente mensaje de error, asegúrate de utilizar el namespace correcto:Error from server (NotFound): deployments.apps "mongodb-kubernetes-operator" not found Para solucionar problemas de tu operador de Kubernetes, consulta Revisión de registros del operador de Kubernetes y otros temas de solución de problemas.
Importante
Si necesitas eliminar el operador Kubernetes o el namespace, primero debes eliminar los recursos de MongoDB.
Cree una clave secreta para utilizar con Ops Manager y cree un ConfigMap.
Cree un secreto para que el operador de Kubernetes pueda crear y actualizar objetos en tu Proyecto Ops Manager. Para obtener más información, consulta Crear credenciales para el Operador de Kubernetes.
Crea un ConfigMap para vincular el Operador de Kubernetes a tu Proyecto de Ops Manager. Para obtener más información, consulta Crear un proyecto por implementación de MongoDB utilizando un ConfigMap.
Implemente el recurso MongoDBMultiCluster.
Configura spec.credentials, spec.opsManager.configMapRef.name y configuraciones de seguridad y implementa el recurso MongoDBMultiCluster. En el siguiente ejemplo de código, duplicateServiceObjects se establece en true para habilitar el proxy DNS en Istio.
Nota
Para habilitar la resolución DNS entre clústeres a través de la malla de servicios Istio, este tutorial crea objetos de servicio con una única dirección ClusterIP por cada Pod de Kubernetes.
kubectl apply -f - <<EOF apiVersion: mongodb.com/v1 kind: MongoDBMultiCluster metadata: name: multi-replica-set spec: version: 8.0.0 type: ReplicaSet persistent: false duplicateServiceObjects: true credentials: my-credentials opsManager: configMapRef: name: my-project security: certsSecretPrefix: <prefix> tls: ca: custom-ca clusterSpecList: - clusterName: ${MDB_CLUSTER_1_FULL_NAME} members: 3 - clusterName: ${MDB_CLUSTER_2_FULL_NAME} members: 2 - clusterName: ${MDB_CLUSTER_3_FULL_NAME} members: 3 EOF
El operador de Kubernetes copia el ConfigMap con la CA que creaste en pasos previos a cada clúster nodo, genera un secreto PEM concatenado y lo distribuye a los clústeres nodo.
Verifique que los recursos MongoDBMultiCluster estén en ejecución.
Para clústeres nodos, ejecuta los siguientes comandos para verificar que los Pods de MongoDB estén en estado en ejecución:
kubectl get pods \ --context=$MDB_CLUSTER_1_FULL_NAME \ --namespace mongodb kubectl get pods \ --context=$MDB_CLUSTER_2_FULL_NAME \ --namespace mongodb kubectl get pods \ --context=$MDB_CLUSTER_3_FULL_NAME \ --namespace mongodb En el clúster del operador, ejecuta el siguiente comando para verificar que el recurso
MongoDBMultiClusterse encuentre en estado activo:kubectl --context=$MDB_CENTRAL_CLUSTER_FULL_NAME \ --namespace mongodb \ get mdbmc multi-replica-set -o yaml -w
Renew TLS Certificates for a MongoDBMultiCluster recurso
Renueva tus certificados TLS periódicamente utilizando el siguiente procedimiento.
Renueva el secreto para un recurso MongoDBMultiCluster.
Ejecuta este comando kubectl para renovar un secreto existente que almacena los certificados para el recurso MongoDBMultiCluster:
kubectl --context $MDB_CENTRAL_CLUSTER_FULL_NAME \ --namespace=<metadata.namespace> \ create secret tls <prefix>-<metadata.name>-cert \ --cert=<resource-tls-cert> \ --key=<resource-tls-key> \ --dry-run=client \ -o yaml | kubectl apply -f -
Este procedimiento no cifra las conexiones entre los hosts de MongoDB en un set de réplicas, ni entre las aplicaciones cliente y las implementaciones de MongoDB.
Ejecuta el plugin kubectl mongodb.
Por defecto, el Operador de Kubernetes está restringido al namespace mongodb. Cuando ejecutas el siguiente comando, el plugin kubectl mongodb:
Crea un clúster de operador, tres clústeres de nodo y un namespace etiquetado
mongodben cada uno de los clústeres.Crea un ConfigMap por defecto con el nombre predefinido
mongodb-kubernetes-operator-member-listque contiene todos los nodos de clústeres. No se puede cambiar el nombre del ConfigMap.Crea las cuentas de servicio y roles necesarias para ejecutar cargas de trabajo de bases de datos en los clústeres nodos.
Ejecute el kubectl mongodb plugin:
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="mongodb" \ --central-cluster-namespace="mongodb" \ --create-service-account-secrets \ --install-database-roles=true
opcional: Establece el webhook de inyección Istio en cada clúster de nodos.
Si utiliza Istio, ejecute el siguiente comando en el clúster operador, especificando el contexto para cada uno de los clústeres nodos en la implementación. Para habilitar la inyección sidecar en Istio, los siguientes comandos añaden las etiquetas istio-injection=enabled a los namespaces mongodb de cada clúster miembro. Si utilizas otro service mesh, configúralo para gestionar el tráfico de red en los namespaces creados.
kubectl label \ --context=$MDB_CLUSTER_1_FULL_NAME \ namespace mongodb \ istio-injection=enabled
kubectl label \ --context=$MDB_CLUSTER_2_FULL_NAME \ namespace mongodb \ istio-injection=enabled
kubectl label \ --context=$MDB_CLUSTER_3_FULL_NAME \ namespace mongodb \ istio-injection=enabled
Configura kubectl para usar el namespace del clúster del operador.
Si no lo has hecho ya, ejecuta los siguientes comandos para ejecutar todos los comandos kubectl en el clúster de operador en el espacio de nombres por defecto.
kubectl config use-context $MDB_CENTRAL_CLUSTER_FULL_NAME kubectl config set-context $(kubectl config current-context) \ --namespace=mongodb
Implementa los Controladores de MongoDB para Kubernetes Operator en el clúster del operador.
Despliega los Controladores de MongoDB para el Operador de Kubernetes en el clúster de operadores en el namespace mongodb con Helm o kubectl.
Agregue el repositorio MongoDB Helm Charts para Kubernetes a Helm.
helm repo add mongodb https://mongodb.github.io/helm-charts Utiliza los Helm Charts de MongoDB para Kubernetes para implementar el operador de Kubernetes.
helm upgrade \ --install \ mongodb-kubernetes-operator-multi-cluster \ mongodb/mongodb-kubernetes \ --namespace mongodb \ --set namespace=mongodb \ --version <mongodb-kubernetes-operator-version> \ --set operator.name=mongodb-kubernetes-operator-multi-cluster \ --set operator.createOperatorServiceAccount=false \ --set operator.createResourcesServiceAccountsAndRoles=false \ --set "multiCluster.clusters={$MDB_CLUSTER_1_FULL_NAME,$MDB_CLUSTER_2_FULL_NAME,$MDB_CLUSTER_3_FULL_NAME}" \ --set multiCluster.performFailover=false
Aplica los recursos personalizados del operador de Kubernetes.
kubectl apply -f https://raw.githubusercontent.com/mongodb/mongodb-kubernetes/master/public/crds.yaml Descargue la plantilla YAML del Kubernetes operador.
curl https://raw.githubusercontent.com/mongodb/mongodb-kubernetes/master/public/mongodb-kubernetes-multi-cluster.yaml -o operator.yaml Opcional: Personaliza la plantilla YAML del Operador de Kubernetes.
Para aprender sobre la configuración opcional de la instalación del operador de Kubernetes, consulta MongoDB Controllers for Kubernetes Operator kubectl y oc Configuración de instalación.
Aplicar el archivo YAML del operador de Kubernetes.
kubectl apply -f operator.yaml Verifica que el operador de Kubernetes está implementado.
Para verificar que el Operador de Kubernetes se instaló correctamente, ejecuta el siguiente comando y verifica el resultado:
kubectl describe deployments mongodb-kubernetes-operator -n <metadata.namespace> oc describe deployments mongodb-kubernetes-operator -n <metadata.namespace> Por defecto, las implementaciones existen en el namespace
mongodb. Si aparece el siguiente mensaje de error, asegúrate de utilizar el namespace correcto:Error from server (NotFound): deployments.apps "mongodb-kubernetes-operator" not found Para solucionar problemas de tu operador de Kubernetes, consulta Revisión de registros del operador de Kubernetes y otros temas de solución de problemas.
Importante
Si necesitas eliminar el operador Kubernetes o el namespace, primero debes eliminar los recursos de MongoDB.
Cree una clave secreta para utilizar con Ops Manager y cree un ConfigMap.
Cree un secreto para que el operador de Kubernetes pueda crear y actualizar objetos en tu Proyecto Ops Manager. Para obtener más información, consulta Crear credenciales para el Operador de Kubernetes.
Crea un ConfigMap para vincular el Operador de Kubernetes a tu Proyecto de Ops Manager. Para obtener más información, consulta Crear un proyecto por implementación de MongoDB utilizando un ConfigMap.
Implemente el recurso MongoDBMultiCluster.
Configura spec.credentials, spec.opsManager.configMapRef.name y configuraciones de seguridad y implementa el recurso MongoDBMultiCluster. En el siguiente ejemplo de código, duplicateServiceObjects se establece en true para habilitar el proxy DNS en Istio.
Nota
Para habilitar la resolución DNS entre clústeres a través de la malla de servicios Istio, este tutorial crea objetos de servicio con una única dirección ClusterIP por cada Pod de Kubernetes.
kubectl apply -f - <<EOF apiVersion: mongodb.com/v1 kind: MongoDBMultiCluster metadata: name: multi-replica-set spec: version: 8.0.0 type: ReplicaSet persistent: false duplicateServiceObjects: true credentials: my-credentials opsManager: configMapRef: name: my-project security: certsSecretPrefix: <prefix> tls: ca: custom-ca clusterSpecList: - clusterName: ${MDB_CLUSTER_1_FULL_NAME} members: 3 - clusterName: ${MDB_CLUSTER_2_FULL_NAME} members: 2 - clusterName: ${MDB_CLUSTER_3_FULL_NAME} members: 3 EOF
El operador de Kubernetes copia el ConfigMap con la CA que creaste en pasos previos a cada clúster nodo, genera un secreto PEM concatenado y lo distribuye a los clústeres nodo.
Verifique que los recursos MongoDBMultiCluster estén en ejecución.
Para clústeres nodos, ejecuta los siguientes comandos para verificar que los Pods de MongoDB estén en estado en ejecución:
kubectl get pods \ --context=$MDB_CLUSTER_1_FULL_NAME \ --namespace mongodb kubectl get pods \ --context=$MDB_CLUSTER_2_FULL_NAME \ --namespace mongodb kubectl get pods \ --context=$MDB_CLUSTER_3_FULL_NAME \ --namespace mongodb En el clúster del operador, ejecuta el siguiente comando para verificar que el recurso
MongoDBMultiClusterse encuentre en estado activo:kubectl --context=$MDB_CENTRAL_CLUSTER_FULL_NAME \ --namespace mongodb \ get mdbmc multi-replica-set -o yaml -w
Próximos pasos
Después de implementar tu set de réplicas de MongoDB en tres clústeres miembro de Kubernetes, puedes agregar un usuario de base de datos para poder conectarte a tu base de datos de MongoDB. Consulta Administrar usuarios de base de datos.