Las implementaciones de MongoDB multinube en clústeres de Kubernetes permiten añadir instancias de MongoDB en clústeres globales que abarcan varias regiones geográficas para aumentar la disponibilidad y la distribución global de los datos.
Requisitos previos
Antes de comenzar el siguiente procedimiento, tome las siguientes acciones:
Instalar
kubectl.Instalar Mongosh
Completar el Procedimiento de clústeres de GKE o equivalente.
Completar el procedimiento de certificados TLS o el equivalente.
Completa el procedimiento de Istio Service mesh o el equivalente.
Complete el procedimiento Implementar el operador MongoDB.
Completa el procedimiento de Multi-clúster Ops Manager. Puedes omitir este paso si usas Cloud Manager en lugar de Ops Manager.
Configura las variables de entorno requeridas de la siguiente manera:
# This script builds on top of the environment configured in the setup guides. # It depends (uses) the following env variables defined there to work correctly. # If you don't use the setup guide to bootstrap the environment, then define them here. # ${K8S_CLUSTER_0_CONTEXT_NAME} # ${K8S_CLUSTER_1_CONTEXT_NAME} # ${K8S_CLUSTER_2_CONTEXT_NAME} # ${MDB_NAMESPACE} export RS_RESOURCE_NAME=mdb export MONGODB_VERSION="8.0.5-ent"
Código fuente
Se puede encontrar todo el código fuente incluido en el repositorio de MongoDB Kubernetes operador.
Procedimiento
Cree un certificado de CA.
Ejecute el siguiente script para crear el certificado CA requerido con su emisor de certificados.
1 kubectl apply --context "${K8S_CLUSTER_0_CONTEXT_NAME}" -n "${MDB_NAMESPACE}" -f - <<EOF 2 apiVersion: cert-manager.io/v1 3 kind: Certificate 4 metadata: 5 name: mdb-cert 6 spec: 7 dnsNames: 8 - "*.${MDB_NAMESPACE}.svc.cluster.local" 9 duration: 240h0m0s 10 issuerRef: 11 name: my-ca-issuer 12 kind: ClusterIssuer 13 renewBefore: 120h0m0s 14 secretName: cert-prefix-mdb-cert 15 usages: 16 - server auth 17 - client auth 18 EOF
Implemente el recurso MongoDBMultiCluster.
Configure spec.credentials, spec.opsManager.configMapRef.name, que definió en el procedimiento de Multi-Cluster Ops Manager; defina sus configuraciones de seguridad e implemente el recurso MongoDBMultiCluster. En la siguiente muestra de código, duplicateServiceObjects se establece en false para habilitar el proxy de 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.
1 kubectl apply --context "${K8S_CLUSTER_0_CONTEXT_NAME}" -n "${MDB_NAMESPACE}" -f - <<EOF 2 apiVersion: mongodb.com/v1 3 kind: MongoDBMultiCluster 4 metadata: 5 name: ${RS_RESOURCE_NAME} 6 spec: 7 type: ReplicaSet 8 version: ${MONGODB_VERSION} 9 opsManager: 10 configMapRef: 11 name: mdb-org-project-config 12 credentials: mdb-org-owner-credentials 13 duplicateServiceObjects: false 14 persistent: true 15 backup: 16 mode: enabled 17 externalAccess: {} 18 security: 19 certsSecretPrefix: cert-prefix 20 tls: 21 ca: ca-issuer 22 authentication: 23 enabled: true 24 modes: ["SCRAM"] 25 clusterSpecList: 26 - clusterName: ${K8S_CLUSTER_0_CONTEXT_NAME} 27 members: 2 28 - clusterName: ${K8S_CLUSTER_1_CONTEXT_NAME} 29 members: 1 30 - clusterName: ${K8S_CLUSTER_2_CONTEXT_NAME} 31 members: 2 32 EOF
Verifica que el recurso MongoDBMultiCluster esté en funcionamiento.
Ejecute el siguiente comando para confirmar que el recurso MongoDBMultiCluster se está ejecutando.
1 echo; echo "Waiting for MongoDB to reach Running phase..." 2 kubectl --context "${K8S_CLUSTER_0_CONTEXT_NAME}" -n "${MDB_NAMESPACE}" wait --for=jsonpath='{.status.phase}'=Running "mdbmc/${RS_RESOURCE_NAME}" --timeout=900s 3 echo; echo "Pods running in cluster ${K8S_CLUSTER_0_CONTEXT_NAME}" 4 kubectl --context "${K8S_CLUSTER_0_CONTEXT_NAME}" -n "${MDB_NAMESPACE}" get pods 5 echo; echo "Pods running in cluster ${K8S_CLUSTER_1_CONTEXT_NAME}" 6 kubectl --context "${K8S_CLUSTER_1_CONTEXT_NAME}" -n "${MDB_NAMESPACE}" get pods 7 echo; echo "Pods running in cluster ${K8S_CLUSTER_2_CONTEXT_NAME}" 8 kubectl --context "${K8S_CLUSTER_2_CONTEXT_NAME}" -n "${MDB_NAMESPACE}" get pods
Cree un usuario y una contraseña de MongoDB.
Ejecuta el siguiente comando para crear un usuario y una contraseña de MongoDB. Utiliza contraseñas seguras para tus implementaciones.
1 kubectl apply --context "${K8S_CLUSTER_0_CONTEXT_NAME}" -n "${MDB_NAMESPACE}" -f - <<EOF 2 apiVersion: v1 3 kind: Secret 4 metadata: 5 name: rs-user-password 6 type: Opaque 7 stringData: 8 password: password 9 --- 10 apiVersion: mongodb.com/v1 11 kind: MongoDBUser 12 metadata: 13 name: rs-user 14 spec: 15 passwordSecretKeyRef: 16 name: rs-user-password 17 key: password 18 username: "rs-user" 19 db: "admin" 20 mongodbResourceRef: 21 name: ${RS_RESOURCE_NAME} 22 roles: 23 - db: "admin" 24 name: "root" 25 EOF 26 27 kubectl --context "${K8S_CLUSTER_0_CONTEXT_NAME}" wait --for=jsonpath='{.status.phase}'=Updated -n "${MDB_NAMESPACE}" mdbu/rs-user --timeout=300s
Verifica la conectividad.
Ejecuta el siguiente comando mongosh para asegurarte de que puedes acceder a la instancia en ejecución de MongoDB.
1 external_ip="$(kubectl get --context "${K8S_CLUSTER_0_CONTEXT_NAME}" -n "${MDB_NAMESPACE}" svc "${RS_RESOURCE_NAME}-0-0-svc-external" -o=jsonpath="{.status.loadBalancer.ingress[0].ip}")" 2 3 mkdir -p certs 4 kubectl get --context "${K8S_CLUSTER_0_CONTEXT_NAME}" -n "${MDB_NAMESPACE}" cm/ca-issuer -o=jsonpath='{.data.ca-pem}' > certs/ca.crt 5 6 mongosh --host "${external_ip}" --username rs-user --password password --tls --tlsCAFile certs/ca.crt --tlsAllowInvalidHostnames --eval "db.runCommand({connectionStatus : 1})"
{ authInfo: { authenticatedUsers: [ { user: 'rs-user', db: 'admin' } ], authenticatedUserRoles: [ { role: 'root', db: 'admin' } ] }, ok: 1, '$clusterTime': { clusterTime: Timestamp({ t: 1747925179, i: 1 }), signature: { hash: Binary.createFromBase64('T1ZP+QUFgBXayfOsRI6XFdEmjKI=', 0), keyId: Long('7507281432415305733') } }, operationTime: Timestamp({ t: 1747925179, i: 1 }) }