Las implementaciones de MongoDB en clústeres multi-Kubernetes le permiten agregar instancias de MongoDB en clústeres globales que abarcan múltiples regiones geográficas para una mayor disponibilidad y distribución global de datos.
Requisitos previos
Antes de comenzar el siguiente procedimiento, realice las siguientes acciones:
Instalar
kubectl.Instalar Mongosh
Completar la Procedimiento de clústeres de GKE o equivalente.
Complete el procedimiento de Certificados TLS o equivalente.
Complete el procedimiento de malla de servicio Istio o equivalente.
Complete el procedimiento Implementar el operador MongoDB.
Complete el procedimiento de Multi-Cluster Ops Manager. Puede omitir este paso si usa Cloud Manager en lugar de Ops Manager.
Establezca las variables de entorno necesarias 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
Puede encontrar todo el código fuente incluido en el repositorio del operador Kubernetes de MongoDB.
Procedimiento
Crear un certificado 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
Implementar el MongoDBMultiCluster recurso.
spec.credentialsEstablezca,, definidospec.opsManager.configMapRef.name en el procedimiento Multi-Cluster Ops Manager; defina la configuración de seguridad e implemente el MongoDBMultiCluster recurso. En el siguiente ejemplo de código, duplicateServiceObjects se establece en false para habilitar el proxy DNS en Istio.
Nota
Para habilitar la resolución de DNS entre clústeres mediante 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
Verifique que el MongoDBMultiCluster recurso esté ejecutándose.
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.
Ejecute el siguiente comando para crear un usuario y una contraseña de MongoDB. Utilice contraseñas seguras para sus 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
Verificar la conectividad.
Ejecute el siguiente comando mongosh para asegurarse de que puede acceder a su instancia de MongoDB en ejecución.
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: 1765972900, i: 9 }), signature: { hash: Binary.createFromBase64('qIChICPU9KLlu7pdZH67Bvc8wwI=', 0), keyId: Long('7584795846827311110') } }, operationTime: Timestamp({ t: 1765972900, i: 9 }) }