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:
Instale
kubectl.Instalar mongosh
Complete el procedimiento de clústeres de GKE o el equivalente.
Completar el procedimiento de certificados TLS o el equivalente.
Completa el procedimiento de Istio Service mesh o el equivalente.
Completa el procedimiento Implementar el operador de 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=mdbexport 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.
kubectl apply --context "${K8S_CLUSTER_0_CONTEXT_NAME}" -n "${MDB_NAMESPACE}" -f - <<EOFapiVersion: cert-manager.io/v1kind: Certificatemetadata: name: mdb-certspec: dnsNames: - "*.${MDB_NAMESPACE}.svc.cluster.local" duration: 240h0m0s issuerRef: name: my-ca-issuer kind: ClusterIssuer renewBefore: 120h0m0s secretName: cert-prefix-mdb-cert usages: - server auth - client authEOFImplemente 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.
kubectl apply --context "${K8S_CLUSTER_0_CONTEXT_NAME}" -n "${MDB_NAMESPACE}" -f - <<EOFapiVersion: mongodb.com/v1kind: MongoDBMultiClustermetadata: name: ${RS_RESOURCE_NAME}spec: type: ReplicaSet version: ${MONGODB_VERSION} opsManager: configMapRef: name: mdb-org-project-config credentials: mdb-org-owner-credentials duplicateServiceObjects: false persistent: true backup: mode: enabled externalAccess: {} security: certsSecretPrefix: cert-prefix tls: ca: ca-issuer authentication: enabled: true modes: ["SCRAM"] clusterSpecList: - clusterName: ${K8S_CLUSTER_0_CONTEXT_NAME} members: 2 - clusterName: ${K8S_CLUSTER_1_CONTEXT_NAME} members: 1 - clusterName: ${K8S_CLUSTER_2_CONTEXT_NAME} members: 2EOFVerifica que el recurso MongoDBMultiCluster esté ejecutándose.
Ejecute el siguiente comando para confirmar que el recurso MongoDBMultiCluster se está ejecutando.
echo; echo "Waiting for MongoDB to reach Running phase..."kubectl --context "${K8S_CLUSTER_0_CONTEXT_NAME}" -n "${MDB_NAMESPACE}" wait --for=jsonpath='{.status.phase}'=Running "mdbmc/${RS_RESOURCE_NAME}" --timeout=900secho; echo "Pods running in cluster ${K8S_CLUSTER_0_CONTEXT_NAME}"kubectl --context "${K8S_CLUSTER_0_CONTEXT_NAME}" -n "${MDB_NAMESPACE}" get podsecho; echo "Pods running in cluster ${K8S_CLUSTER_1_CONTEXT_NAME}"kubectl --context "${K8S_CLUSTER_1_CONTEXT_NAME}" -n "${MDB_NAMESPACE}" get podsecho; echo "Pods running in cluster ${K8S_CLUSTER_2_CONTEXT_NAME}"kubectl --context "${K8S_CLUSTER_2_CONTEXT_NAME}" -n "${MDB_NAMESPACE}" get podsCree un usuario de MongoDB y una contraseña.
Ejecuta el siguiente comando para crear un usuario y una contraseña de MongoDB. Utiliza contraseñas seguras para tus implementaciones.
kubectl apply --context "${K8S_CLUSTER_0_CONTEXT_NAME}" -n "${MDB_NAMESPACE}" -f - <<EOFapiVersion: v1kind: Secretmetadata: name: rs-user-passwordtype: OpaquestringData: password: password---apiVersion: mongodb.com/v1kind: MongoDBUsermetadata: name: rs-userspec: passwordSecretKeyRef: name: rs-user-password key: password username: "rs-user" db: "admin" mongodbResourceRef: name: ${RS_RESOURCE_NAME} roles: - db: "admin" name: "root"EOF
kubectl --context "${K8S_CLUSTER_0_CONTEXT_NAME}" wait --for=jsonpath='{.status.phase}'=Updated -n "${MDB_NAMESPACE}" mdbu/rs-user --timeout=300sVerifica la conectividad.
Ejecuta el siguiente comando mongosh para asegurarte de que puedes acceder a la instancia en ejecución de MongoDB.
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}")"
mkdir -p certskubectl get --context "${K8S_CLUSTER_0_CONTEXT_NAME}" -n "${MDB_NAMESPACE}" cm/ca-issuer -o=jsonpath='{.data.ca-pem}' > certs/ca.crt
for attempt in 1 2 3 4 5 6; do if mongosh --host "${external_ip}" --username rs-user --password password --tls --tlsCAFile certs/ca.crt --tlsAllowInvalidHostnames --eval "db.runCommand({connectionStatus : 1})"; then break fi if (( attempt < 6 )); then echo "mongosh auth failed (attempt ${attempt}/6), retrying in 10s..." >&2 sleep 10 fidone{ authInfo: { authenticatedUsers: [ { user: 'rs-user', db: 'admin' } ], authenticatedUserRoles: [ { role: 'root', db: 'admin' } ] }, ok: 1, '$clusterTime': { clusterTime: Timestamp({ t: 1792488045, i: 9 }), signature: { hash: Binary.createFromBase64('5Am92cV+a0dA3rfbIC4sR+v2BU4=', 0), keyId: Long('7698677527451009030') } }, operationTime: Timestamp({ t: 1792488045, i: 9 })}