Para que la implementación de Ops Manager y la base de datos de la aplicación en múltiples clústeres sean resilientes a caídas de centros de datos completos o zonas enteras, implemente la aplicación Ops Manager y la base de datos de la aplicación en múltiples clústeres de Kubernetes.
Para obtener más información sobre la arquitectura, las redes, las limitaciones y el rendimiento de las implementaciones de múltiples clústeres de Kubernetes para los recursos de Ops Manager, consulte:
Overview
Al implementar la aplicación Ops Manager y la base de datos de la aplicación mediante el procedimiento de esta sección, usted:
Utilice GKE (Google Kubernetes Engine)y la malla de servicios Istio como herramientas que ayudan a demostrar la implementación de múltiples clústeres de Kubernetes.
Instale el operador de Kubernetes en uno de los clústeres de Kubernetes miembros, conocido como el clúster del operador. Este clúster actúa como un concentrador en el patrón "Hub and Spoke" que utiliza el operador de Kubernetes para gestionar implementaciones en varios clústeres de Kubernetes.
Implementar el clúster de operadores en el
$OPERATOR_NAMESPACEy configure este clúster para vigilar$NAMESPACEy administrar todos los clústeres Kubernetes miembros.Implemente la base de datos de la aplicación y la aplicación Ops Manager en un clúster de Kubernetes de un solo miembro para demostrar la similitud entre una implementación multiclúster y una implementación de un solo clúster. Una implementación de un solo clúster con
spec.topologyy configuradosspec.applicationDatabase.topologycomoMultiClusterprepara la implementación para agregar más clústeres de Kubernetes.Implemente un conjunto de réplicas adicional de la base de datos de la aplicación en el segundo nodo del clúster de Kubernetes para mejorar la resiliencia de la base de datos de la aplicación. También implementa una instancia adicional de la aplicación de Ops Manager en el segundo nodo del clúster de Kubernetes.
Crear certificados válidos para CifradoTLS y establecimiento de conexiones cifradas TLS hacia y desde la aplicación Ops Manager, así como entre los miembros del conjunto de réplicas de la base de datos de la aplicación. Al ejecutarse mediante HTTPS, Ops Manager se ejecuta en el puerto
8443de forma predeterminada.Habilite la copia de seguridad con almacenamiento compatible con S e implemente el Daemon de copia de seguridad en3 el tercer clúster de Kubernetes miembro. Para simplificar la configuración3de los buckets de almacenamiento compatibles con S, implemente el operador MinIO. Habilite el Daemon de copia de seguridad solo en un clúster miembro de su implementación. Sin embargo, puede configurar otros clústeres miembros para que también alojen los recursos del Daemon de copia de seguridad. Solo se admiten las copias de seguridad S en implementaciones multiclúster de Ops Manager.3
Requisitos previos
Instalar herramientas
Antes de poder comenzar la implementación, instale las siguientes herramientas necesarias:
Instalar Helm. Es necesario instalar Helm para instalar el operador de Kubernetes.
Instalar Kustomize. Es necesario instalar Kustomize para el operador MinIO.
Prepare el proyecto de GCP para usarlo en la creación de clústeres de GKE (Google Kubernetes Engine). En el siguiente procedimiento, creará tres nuevos clústeres de GKE, con un total de siete
e2-standard-4máquinas virtuales de Spot de bajo coste.Instalar gcloud CLI.
Autorizar en gcloud CLI
Instale gcloud CLI y autorícelo:
gcloud auth login
Instalar el kubectl mongodb complemento
El complemento kubectl mongodb automatiza la configuración de los clústeres de Kubernetes. Esto permite al operador de Kubernetes implementar recursos, roles y servicios necesarios para las cuentas de la aplicación Ops Manager, la base de datos de la aplicación y los recursos de MongoDB en estos clústeres.
Para instalar el complemento kubectl mongodb:
Descargue la versión del paquete Kubernetes Operator que desee.
Descargue la versión del paquete Kubernetes Operator que desee desde la página de lanzamiento del repositorio de Kubernetes Operator de MongoDB Enterprise.
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.gzkubectl-mongodb_{{ .Version }}_darwin_arm64.tar.gzkubectl-mongodb_{{ .Version }}_linux_amd64.tar.gzkubectl-mongodb_{{ .Version }}_linux_arm64.tar.gz
Localice el kubectl mongodb binario del complemento y cópielo en su destino deseado.
Busque el binario kubectl-mongodb en el directorio descomprimido y muévalo a su destino deseado, dentro de PATH para el usuario Operador de Kubernetes, como se muestra en el siguiente ejemplo:
mv kubectl-mongodb /usr/local/bin/kubectl-mongodb
Ahora puedes ejecutar el complemento kubectl mongodb usando los siguientes comandos:
kubectl mongodb multicluster setup kubectl mongodb multicluster recover
Para obtener más información sobre los indicadores admitidos, consulte la Referencia del complemento kubectl de MongoDB.
Clonar el repositorio de operadores de Kubernetes de MongoDB Enterprise
Clona el Repositorio MongoDB Enterprise Kubernetes Operator, cambia al directorio mongodb-enterprise-kubernetes y comprueba la versión actual.
git clone https://github.com/mongodb/mongodb-enterprise-kubernetes.git cd mongodb-enterprise-kubernetes git checkout 1.25 cd public/samples/ops-manager-multi-cluster
Importante
Algunos pasos de esta guía solo funcionan si los ejecuta desde el directorio public/samples/ops-manager-multi-cluster.
Configurar variables de entorno
Todos los pasos de esta guía hacen referencia a las variables de entorno definidas en env_variables.sh.
1 export MDB_GKE_PROJECT="### Set your GKE project name here ###" 2 3 export NAMESPACE="mongodb" 4 export OPERATOR_NAMESPACE="mongodb-operator" 5 6 comma-separated key=value pairs 7 export OPERATOR_ADDITIONAL_HELM_VALUES="" 8 9 Adjust the values for each Kubernetes cluster in your deployment. 10 The deployment script references the following variables to get values for each cluster. 11 export K8S_CLUSTER_0="k8s-mdb-0" 12 export K8S_CLUSTER_0_ZONE="europe-central2-a" 13 export K8S_CLUSTER_0_NUMBER_OF_NODES=3 14 export K8S_CLUSTER_0_MACHINE_TYPE="e2-standard-4" 15 export K8S_CLUSTER_0_CONTEXT_NAME="gke_${MDB_GKE_PROJECT}_${K8S_CLUSTER_0_ZONE}_${K8S_CLUSTER_0}" 16 17 export K8S_CLUSTER_1="k8s-mdb-1" 18 export K8S_CLUSTER_1_ZONE="europe-central2-b" 19 export K8S_CLUSTER_1_NUMBER_OF_NODES=3 20 export K8S_CLUSTER_1_MACHINE_TYPE="e2-standard-4" 21 export K8S_CLUSTER_1_CONTEXT_NAME="gke_${MDB_GKE_PROJECT}_${K8S_CLUSTER_1_ZONE}_${K8S_CLUSTER_1}" 22 23 export K8S_CLUSTER_2="k8s-mdb-2" 24 export K8S_CLUSTER_2_ZONE="europe-central2-c" 25 export K8S_CLUSTER_2_NUMBER_OF_NODES=1 26 export K8S_CLUSTER_2_MACHINE_TYPE="e2-standard-4" 27 export K8S_CLUSTER_2_CONTEXT_NAME="gke_${MDB_GKE_PROJECT}_${K8S_CLUSTER_2_ZONE}_${K8S_CLUSTER_2}" 28 29 Comment out the following line so that the script does not create preemptible nodes. 30 DO NOT USE preemptible nodes in production. 31 export GKE_SPOT_INSTANCES_SWITCH="--preemptible" 32 33 export S3_OPLOG_BUCKET_NAME=s3-oplog-store 34 export S3_SNAPSHOT_BUCKET_NAME=s3-snapshot-store 35 36 minio defaults 37 export S3_ENDPOINT="minio.tenant-tiny.svc.cluster.local" 38 export S3_ACCESS_KEY="console" 39 export S3_SECRET_KEY="console123" 40 41 export OPERATOR_HELM_CHART="mongodb/enterprise-operator" 42 43 (Optional) Change the following setting when using the external URL. 44 This env variable is used in OpenSSL configuration to generate 45 server certificates for Ops Manager Application. 46 export OPS_MANAGER_EXTERNAL_DOMAIN="om-svc.${NAMESPACE}.svc.cluster.local" 47 48 export OPS_MANAGER_VERSION="7.0.4" 49 export APPDB_VERSION="7.0.9-ubi8"
Ajuste la configuración del ejemplo anterior según sus necesidades según las instrucciones de los comentarios e introdúzcalos en su shell de la siguiente manera:
source env_variables.sh
Importante
Cada vez que actualice env_variables.sh, ejecute source env_variables.sh para asegurarse de que los scripts en esta sección utilicen variables actualizadas.
Procedimiento
Este procedimiento se aplica a la implementación de una instancia de Ops Manager en varios clústeres de Kubernetes.
Crear clústeres de Kubernetes.
Puede omitir este paso si ya ha instalado y configurado sus propios clústeres de Kubernetes con una malla de servicio.
Cree tres clústeres de GKE (Google Kubernetes Engine):
1 gcloud container clusters create "${K8S_CLUSTER_0}" \ 2 --zone="${K8S_CLUSTER_0_ZONE}" \ 3 --num-nodes="${K8S_CLUSTER_0_NUMBER_OF_NODES}" \ 4 --machine-type "${K8S_CLUSTER_0_MACHINE_TYPE}" \ 5 ${GKE_SPOT_INSTANCES_SWITCH:-""} 1 gcloud container clusters create "${K8S_CLUSTER_1}" \ 2 --zone="${K8S_CLUSTER_1_ZONE}" \ 3 --num-nodes="${K8S_CLUSTER_1_NUMBER_OF_NODES}" \ 4 --machine-type "${K8S_CLUSTER_1_MACHINE_TYPE}" \ 5 ${GKE_SPOT_INSTANCES_SWITCH:-""} 1 gcloud container clusters create "${K8S_CLUSTER_2}" \ 2 --zone="${K8S_CLUSTER_2_ZONE}" \ 3 --num-nodes="${K8S_CLUSTER_2_NUMBER_OF_NODES}" \ 4 --machine-type "${K8S_CLUSTER_2_MACHINE_TYPE}" \ 5 ${GKE_SPOT_INSTANCES_SWITCH:-""} Obtener credenciales y guardar contextos en el
kubeconfigarchivo actual. De forma predeterminada, este archivo se encuentra en el~/.kube/configdirectorio y se referencia mediante la$KUBECONFIGvariable de entorno.1 gcloud container clusters get-credentials "${K8S_CLUSTER_0}" --zone="${K8S_CLUSTER_0_ZONE}" 2 gcloud container clusters get-credentials "${K8S_CLUSTER_1}" --zone="${K8S_CLUSTER_1_ZONE}" 3 gcloud container clusters get-credentials "${K8S_CLUSTER_2}" --zone="${K8S_CLUSTER_2_ZONE}" Todos los comandos
kubectlhacen referencia a estos contextos utilizando las siguientes variables:$K8S_CLUSTER_0_CONTEXT_NAME$K8S_CLUSTER_1_CONTEXT_NAME$K8S_CLUSTER_2_CONTEXT_NAME
Verifique que
kubectltenga acceso a los clústeres de Kubernetes:1 echo "Nodes in cluster ${K8S_CLUSTER_0_CONTEXT_NAME}" 2 kubectl --context "${K8S_CLUSTER_0_CONTEXT_NAME}" get nodes 3 echo; echo "Nodes in cluster ${K8S_CLUSTER_1_CONTEXT_NAME}" 4 kubectl --context "${K8S_CLUSTER_1_CONTEXT_NAME}" get nodes 5 echo; echo "Nodes in cluster ${K8S_CLUSTER_2_CONTEXT_NAME}" 6 kubectl --context "${K8S_CLUSTER_2_CONTEXT_NAME}" get nodes 1 Nodes in cluster gke_scratch-kubernetes-team_europe-central2-a_k8s-mdb-0 2 NAME STATUS ROLES AGE VERSION 3 gke-k8s-mdb-0-default-pool-d0f98a43-dtlc Ready <none> 65s v1.28.7-gke.1026000 4 gke-k8s-mdb-0-default-pool-d0f98a43-q9sf Ready <none> 65s v1.28.7-gke.1026000 5 gke-k8s-mdb-0-default-pool-d0f98a43-zn8x Ready <none> 64s v1.28.7-gke.1026000 6 7 Nodes in cluster gke_scratch-kubernetes-team_europe-central2-b_k8s-mdb-1 8 NAME STATUS ROLES AGE VERSION 9 gke-k8s-mdb-1-default-pool-37ea602a-0qgw Ready <none> 111s v1.28.7-gke.1026000 10 gke-k8s-mdb-1-default-pool-37ea602a-k4qk Ready <none> 114s v1.28.7-gke.1026000 11 gke-k8s-mdb-1-default-pool-37ea602a-p2g7 Ready <none> 113s v1.28.7-gke.1026000 12 13 Nodes in cluster gke_scratch-kubernetes-team_europe-central2-c_k8s-mdb-2 14 NAME STATUS ROLES AGE VERSION 15 gke-k8s-mdb-2-default-pool-4b459a09-t1v9 Ready <none> 29s v1.28.7-gke.1026000 Instale la malla de servicio Istio para permitir la resolución de DNS entre clústeres y la conectividad de red entre clústeres de Kubernetes:
1 CTX_CLUSTER1=${K8S_CLUSTER_0_CONTEXT_NAME} \ 2 CTX_CLUSTER2=${K8S_CLUSTER_1_CONTEXT_NAME} \ 3 CTX_CLUSTER3=${K8S_CLUSTER_2_CONTEXT_NAME} \ 4 ISTIO_VERSION="1.20.2" \ 5 ../multi-cluster/install_istio_separate_network.sh
Crear espacios de nombres.
Nota
Para habilitar la inyección de sidecar en Istio, los siguientes comandos agregan las istio-injection=enabled etiquetas a $OPERATOR_NAMESPACE los mongodb espacios de nombres y de cada clúster miembro. Si utiliza otra malla de servicios, configúrela para gestionar el tráfico de red en los espacios de nombres creados.
Cree un namespace separado,
mongodb-operator, referenciado por la$OPERATOR_NAMESPACEvariable de entorno para la implementación del operador de Kubernetes.Cree el mismo
$OPERATOR_NAMESPACEen cada clúster miembro de Kubernetes. Esto es necesario para que el complemento kubectl mongodb pueda crear una cuenta de servicio para el operador de Kubernetes en cada clúster miembro. El operador de Kubernetes utiliza estas cuentas de servicio en el clúster del operador para realizar operaciones en cada clúster miembro.1 kubectl --context "${K8S_CLUSTER_0_CONTEXT_NAME}" create namespace "${OPERATOR_NAMESPACE}" 2 kubectl --context "${K8S_CLUSTER_0_CONTEXT_NAME}" label namespace "${OPERATOR_NAMESPACE}" istio-injection=enabled --overwrite 3 4 kubectl --context "${K8S_CLUSTER_1_CONTEXT_NAME}" create namespace "${OPERATOR_NAMESPACE}" 5 kubectl --context "${K8S_CLUSTER_1_CONTEXT_NAME}" label namespace "${OPERATOR_NAMESPACE}" istio-injection=enabled --overwrite 6 7 kubectl --context "${K8S_CLUSTER_2_CONTEXT_NAME}" create namespace "${OPERATOR_NAMESPACE}" 8 kubectl --context "${K8S_CLUSTER_2_CONTEXT_NAME}" label namespace "${OPERATOR_NAMESPACE}" istio-injection=enabled --overwrite En cada clúster miembro, incluido el clúster que actúa como clúster de operador, cree otro espacio de nombres independiente,
mongodb. El operador de Kubernetes utiliza este espacio de nombres para los recursos y componentes de Ops Manager.1 kubectl --context "${K8S_CLUSTER_0_CONTEXT_NAME}" create namespace "${NAMESPACE}" 2 kubectl --context "${K8S_CLUSTER_0_CONTEXT_NAME}" label namespace "${NAMESPACE}" istio-injection=enabled --overwrite 3 4 kubectl --context "${K8S_CLUSTER_1_CONTEXT_NAME}" create namespace "${NAMESPACE}" 5 kubectl --context "${K8S_CLUSTER_1_CONTEXT_NAME}" label namespace "${NAMESPACE}" istio-injection=enabled --overwrite 6 7 kubectl --context "${K8S_CLUSTER_2_CONTEXT_NAME}" create namespace "${NAMESPACE}" 8 kubectl --context "${K8S_CLUSTER_2_CONTEXT_NAME}" label namespace "${NAMESPACE}" istio-injection=enabled --overwrite
Opcional. Autorizar a los clústeres a extraer secretos de registros de imágenes privados.
Este paso es opcional si utiliza cartas e imágenes oficiales de Helm del registro de Quay.
1 kubectl --context "${K8S_CLUSTER_0_CONTEXT_NAME}" -n "${OPERATOR_NAMESPACE}" create secret generic "image-registries-secret" \ 2 --from-file=.dockerconfigjson="${HOME}/.docker/config.json" --type=kubernetes.io/dockerconfigjson 3 kubectl --context "${K8S_CLUSTER_0_CONTEXT_NAME}" -n "${NAMESPACE}" create secret generic "image-registries-secret" \ 4 --from-file=.dockerconfigjson="${HOME}/.docker/config.json" --type=kubernetes.io/dockerconfigjson 5 kubectl --context "${K8S_CLUSTER_1_CONTEXT_NAME}" -n "${NAMESPACE}" create secret generic "image-registries-secret" \ 6 --from-file=.dockerconfigjson="${HOME}/.docker/config.json" --type=kubernetes.io/dockerconfigjson 7 kubectl --context "${K8S_CLUSTER_2_CONTEXT_NAME}" -n "${NAMESPACE}" create secret generic "image-registries-secret" \ 8 --from-file=.dockerconfigjson="${HOME}/.docker/config.json" --type=kubernetes.io/dockerconfigjson
Opcional. Verifique la conectividad del clúster.
Los siguientes scripts opcionales verifican si la malla de servicio está configurada correctamente para la resolución y conectividad de DNS entre clústeres.
Ejecute este script en el clúster 0:
1 kubectl apply --context "${K8S_CLUSTER_0_CONTEXT_NAME}" -n "${NAMESPACE}" -f - <<EOF 2 apiVersion: apps/v1 3 kind: StatefulSet 4 metadata: 5 name: echoserver0 6 spec: 7 replicas: 1 8 selector: 9 matchLabels: 10 app: echoserver0 11 template: 12 metadata: 13 labels: 14 app: echoserver0 15 spec: 16 containers: 17 - image: k8s.gcr.io/echoserver:1.10 18 imagePullPolicy: Always 19 name: echoserver0 20 ports: 21 - containerPort: 8080 22 EOF Ejecute este script en el clúster 1:
1 kubectl apply --context "${K8S_CLUSTER_1_CONTEXT_NAME}" -n "${NAMESPACE}" -f - <<EOF 2 apiVersion: apps/v1 3 kind: StatefulSet 4 metadata: 5 name: echoserver1 6 spec: 7 replicas: 1 8 selector: 9 matchLabels: 10 app: echoserver1 11 template: 12 metadata: 13 labels: 14 app: echoserver1 15 spec: 16 containers: 17 - image: k8s.gcr.io/echoserver:1.10 18 imagePullPolicy: Always 19 name: echoserver1 20 ports: 21 - containerPort: 8080 22 EOF Ejecute este script en el clúster 2:
1 kubectl apply --context "${K8S_CLUSTER_2_CONTEXT_NAME}" -n "${NAMESPACE}" -f - <<EOF 2 apiVersion: apps/v1 3 kind: StatefulSet 4 metadata: 5 name: echoserver2 6 spec: 7 replicas: 1 8 selector: 9 matchLabels: 10 app: echoserver2 11 template: 12 metadata: 13 labels: 14 app: echoserver2 15 spec: 16 containers: 17 - image: k8s.gcr.io/echoserver:1.10 18 imagePullPolicy: Always 19 name: echoserver2 20 ports: 21 - containerPort: 8080 22 EOF Ejecute este script para esperar la creación de StatefulSets:
1 kubectl wait --context "${K8S_CLUSTER_0_CONTEXT_NAME}" -n "${NAMESPACE}" --for=condition=ready pod -l statefulset.kubernetes.io/pod-name=echoserver0-0 --timeout=60s 2 kubectl wait --context "${K8S_CLUSTER_1_CONTEXT_NAME}" -n "${NAMESPACE}" --for=condition=ready pod -l statefulset.kubernetes.io/pod-name=echoserver1-0 --timeout=60s 3 kubectl wait --context "${K8S_CLUSTER_2_CONTEXT_NAME}" -n "${NAMESPACE}" --for=condition=ready pod -l statefulset.kubernetes.io/pod-name=echoserver2-0 --timeout=60s Crear servicio Pod en el clúster 0:
1 kubectl apply --context "${K8S_CLUSTER_0_CONTEXT_NAME}" -n "${NAMESPACE}" -f - <<EOF 2 apiVersion: v1 3 kind: Service 4 metadata: 5 name: echoserver0-0 6 spec: 7 ports: 8 - port: 8080 9 targetPort: 8080 10 protocol: TCP 11 selector: 12 statefulset.kubernetes.io/pod-name: "echoserver0-0" 13 EOF Crear servicio Pod en el clúster 1:
1 kubectl apply --context "${K8S_CLUSTER_1_CONTEXT_NAME}" -n "${NAMESPACE}" -f - <<EOF 2 apiVersion: v1 3 kind: Service 4 metadata: 5 name: echoserver1-0 6 spec: 7 ports: 8 - port: 8080 9 targetPort: 8080 10 protocol: TCP 11 selector: 12 statefulset.kubernetes.io/pod-name: "echoserver1-0" 13 EOF Crear servicio Pod en el clúster 2:
1 kubectl apply --context "${K8S_CLUSTER_2_CONTEXT_NAME}" -n "${NAMESPACE}" -f - <<EOF 2 apiVersion: v1 3 kind: Service 4 metadata: 5 name: echoserver2-0 6 spec: 7 ports: 8 - port: 8080 9 targetPort: 8080 10 protocol: TCP 11 selector: 12 statefulset.kubernetes.io/pod-name: "echoserver2-0" 13 EOF Crear un servicio round robin en el clúster 0:
1 kubectl apply --context "${K8S_CLUSTER_0_CONTEXT_NAME}" -n "${NAMESPACE}" -f - <<EOF 2 apiVersion: v1 3 kind: Service 4 metadata: 5 name: echoserver 6 spec: 7 ports: 8 - port: 8080 9 targetPort: 8080 10 protocol: TCP 11 selector: 12 app: echoserver0 13 EOF Crear un servicio round robin en el clúster 1:
1 kubectl apply --context "${K8S_CLUSTER_1_CONTEXT_NAME}" -n "${NAMESPACE}" -f - <<EOF 2 apiVersion: v1 3 kind: Service 4 metadata: 5 name: echoserver 6 spec: 7 ports: 8 - port: 8080 9 targetPort: 8080 10 protocol: TCP 11 selector: 12 app: echoserver1 13 EOF Crear un servicio round robin en el clúster 2:
1 kubectl apply --context "${K8S_CLUSTER_2_CONTEXT_NAME}" -n "${NAMESPACE}" -f - <<EOF 2 apiVersion: v1 3 kind: Service 4 metadata: 5 name: echoserver 6 spec: 7 ports: 8 - port: 8080 9 targetPort: 8080 10 protocol: TCP 11 selector: 12 app: echoserver2 13 EOF Verificar Pod 0 del clúster 1:
1 source_cluster=${K8S_CLUSTER_1_CONTEXT_NAME} 2 target_pod="echoserver0-0" 3 source_pod="echoserver1-0" 4 target_url="http://${target_pod}.${NAMESPACE}.svc.cluster.local:8080" 5 echo "Checking cross-cluster DNS resolution and connectivity from ${source_pod} in ${source_cluster} to ${target_pod}" 6 out=$(kubectl exec --context "${source_cluster}" -n "${NAMESPACE}" "${source_pod}" -- \ 7 /bin/bash -c "curl -v ${target_url}" 2>&1); 8 grep "Hostname: ${target_pod}" &>/dev/null <<< "${out}" && echo "SUCCESS" || (echo "ERROR: ${out}" && return 1) 1 Checking cross-cluster DNS resolution and connectivity from echoserver1-0 in gke_scratch-kubernetes-team_europe-central2-b_k8s-mdb-1 to echoserver0-0 2 SUCCESS Verificar Pod 1 del clúster 0:
1 source_cluster=${K8S_CLUSTER_0_CONTEXT_NAME} 2 target_pod="echoserver1-0" 3 source_pod="echoserver0-0" 4 target_url="http://${target_pod}.${NAMESPACE}.svc.cluster.local:8080" 5 echo "Checking cross-cluster DNS resolution and connectivity from ${source_pod} in ${source_cluster} to ${target_pod}" 6 out=$(kubectl exec --context "${source_cluster}" -n "${NAMESPACE}" "${source_pod}" -- \ 7 /bin/bash -c "curl -v ${target_url}" 2>&1); 8 grep "Hostname: ${target_pod}" &>/dev/null <<< "${out}" && echo "SUCCESS" || (echo "ERROR: ${out}" && return 1) 1 Checking cross-cluster DNS resolution and connectivity from echoserver0-0 in gke_scratch-kubernetes-team_europe-central2-a_k8s-mdb-0 to echoserver1-0 2 SUCCESS Verificar Pod 1 del clúster 2:
1 source_cluster=${K8S_CLUSTER_2_CONTEXT_NAME} 2 target_pod="echoserver1-0" 3 source_pod="echoserver2-0" 4 target_url="http://${target_pod}.${NAMESPACE}.svc.cluster.local:8080" 5 echo "Checking cross-cluster DNS resolution and connectivity from ${source_pod} in ${source_cluster} to ${target_pod}" 6 out=$(kubectl exec --context "${source_cluster}" -n "${NAMESPACE}" "${source_pod}" -- \ 7 /bin/bash -c "curl -v ${target_url}" 2>&1); 8 grep "Hostname: ${target_pod}" &>/dev/null <<< "${out}" && echo "SUCCESS" || (echo "ERROR: ${out}" && return 1) 1 Checking cross-cluster DNS resolution and connectivity from echoserver2-0 in gke_scratch-kubernetes-team_europe-central2-c_k8s-mdb-2 to echoserver1-0 2 SUCCESS
Verificar Pod 2 del clúster 0:
1 source_cluster=${K8S_CLUSTER_0_CONTEXT_NAME} 2 target_pod="echoserver2-0" 3 source_pod="echoserver0-0" 4 target_url="http://${target_pod}.${NAMESPACE}.svc.cluster.local:8080" 5 echo "Checking cross-cluster DNS resolution and connectivity from ${source_pod} in ${source_cluster} to ${target_pod}" 6 out=$(kubectl exec --context "${source_cluster}" -n "${NAMESPACE}" "${source_pod}" -- \ 7 /bin/bash -c "curl -v ${target_url}" 2>&1); 8 grep "Hostname: ${target_pod}" &>/dev/null <<< "${out}" && echo "SUCCESS" || (echo "ERROR: ${out}" && return 1) 1 Checking cross-cluster DNS resolution and connectivity from echoserver0-0 in gke_scratch-kubernetes-team_europe-central2-a_k8s-mdb-0 to echoserver2-0 2 SUCCESS Ejecute el script de limpieza:
1 kubectl --context "${K8S_CLUSTER_0_CONTEXT_NAME}" -n "${NAMESPACE}" delete statefulset echoserver0 2 kubectl --context "${K8S_CLUSTER_1_CONTEXT_NAME}" -n "${NAMESPACE}" delete statefulset echoserver1 3 kubectl --context "${K8S_CLUSTER_2_CONTEXT_NAME}" -n "${NAMESPACE}" delete statefulset echoserver2 4 kubectl --context "${K8S_CLUSTER_0_CONTEXT_NAME}" -n "${NAMESPACE}" delete service echoserver 5 kubectl --context "${K8S_CLUSTER_1_CONTEXT_NAME}" -n "${NAMESPACE}" delete service echoserver 6 kubectl --context "${K8S_CLUSTER_2_CONTEXT_NAME}" -n "${NAMESPACE}" delete service echoserver 7 kubectl --context "${K8S_CLUSTER_0_CONTEXT_NAME}" -n "${NAMESPACE}" delete service echoserver0-0 8 kubectl --context "${K8S_CLUSTER_1_CONTEXT_NAME}" -n "${NAMESPACE}" delete service echoserver1-0 9 kubectl --context "${K8S_CLUSTER_2_CONTEXT_NAME}" -n "${NAMESPACE}" delete service echoserver2-0
Implementar una configuración de múltiples clústeres.
En este paso, utiliza el complemento kubectl mongodb para automatizar la configuración del clúster de Kubernetes que es necesaria para que el operador de Kubernetes administre cargas de trabajo en varios clústeres de Kubernetes.
Dado que configura los clústeres de Kubernetes antes de instalar el operador de Kubernetes, cuando implementa el operador de Kubernetes para la operación de múltiples clústeres de Kubernetes, toda la configuración de múltiples clústeres necesaria ya está en su lugar.
Como se indica en la descripción general, el operador de Kubernetes configura tres clústeres miembros que se pueden usar para implementar bases de datos MongoDB de Ops Manager. El primer clúster también se usa como clúster del operador, donde se instala el operador de Kubernetes y se implementan los recursos personalizados.
1 kubectl mongodb multicluster setup \ 2 --central-cluster="${K8S_CLUSTER_0_CONTEXT_NAME}" \ 3 --member-clusters="${K8S_CLUSTER_0_CONTEXT_NAME},${K8S_CLUSTER_1_CONTEXT_NAME},${K8S_CLUSTER_2_CONTEXT_NAME}" \ 4 --member-cluster-namespace="${NAMESPACE}" \ 5 --central-cluster-namespace="${OPERATOR_NAMESPACE}" \ 6 --create-service-account-secrets \ 7 --install-database-roles=true \ 8 --image-pull-secrets=image-registries-secret
1 Build: 1f23ae48c41d208f14c860356e483ba386a3aab8, 2024-04-26T12:19:36Z 2 Ensured namespaces exist in all clusters. 3 creating operator cluster roles in cluster: gke_scratch-kubernetes-team_europe-central2-a_k8s-mdb-0 4 creating member roles in cluster: gke_scratch-kubernetes-team_europe-central2-b_k8s-mdb-1 5 creating member roles in cluster: gke_scratch-kubernetes-team_europe-central2-c_k8s-mdb-2 6 Ensured ServiceAccounts and Roles. 7 Creating KubeConfig secret mongodb-operator/mongodb-enterprise-operator-multi-cluster-kubeconfig in cluster gke_scratch-kubernetes-team_europe-central2-a_k8s-mdb-0 8 Ensured database Roles in member clusters. 9 Creating Member list Configmap mongodb-operator/mongodb-enterprise-operator-member-list in cluster gke_scratch-kubernetes-team_europe-central2-a_k8s-mdb-0
Instale el operador de Kubernetes utilizando el gráfico de Helm.
Instale el operador de Kubernetes
$OPERATOR_NAMESPACEen, configurado para$NAMESPACEsupervisar y administrar tres clústeres de Kubernetes miembros. En este punto del procedimiento, lascuentas de servicio y los roles ya están implementados por elkubectl mongodbcomplemento. Por lo tanto, los siguientes scripts omiten su configuración y configuranoperator.createOperatorServiceAccount=falseoperator.createResourcesServiceAccountsAndRoles=falsey. Los scripts especifican la configuraciónmultiCluster.clusterspara indicar al gráfico de Helm que implemente el operador de Kubernetes en modo multiclúster.1 helm upgrade --install \ 2 --debug \ 3 --kube-context "${K8S_CLUSTER_0_CONTEXT_NAME}" \ 4 mongodb-enterprise-operator-multi-cluster \ 5 "${OPERATOR_HELM_CHART}" \ 6 --namespace="${OPERATOR_NAMESPACE}" \ 7 --set namespace="${OPERATOR_NAMESPACE}" \ 8 --set operator.namespace="${OPERATOR_NAMESPACE}" \ 9 --set operator.watchNamespace="${NAMESPACE}" \ 10 --set operator.name=mongodb-enterprise-operator-multi-cluster \ 11 --set operator.createOperatorServiceAccount=false \ 12 --set operator.createResourcesServiceAccountsAndRoles=false \ 13 --set "multiCluster.clusters={${K8S_CLUSTER_0_CONTEXT_NAME},${K8S_CLUSTER_1_CONTEXT_NAME},${K8S_CLUSTER_2_CONTEXT_NAME}}" \ 14 --set "${OPERATOR_ADDITIONAL_HELM_VALUES:-"dummy=value"}" 1 Release "mongodb-enterprise-operator-multi-cluster" does not exist. Installing it now. 2 NAME: mongodb-enterprise-operator-multi-cluster 3 LAST DEPLOYED: Tue Apr 30 19:40:26 2024 4 NAMESPACE: mongodb-operator 5 STATUS: deployed 6 REVISION: 1 7 TEST SUITE: None 8 USER-SUPPLIED VALUES: 9 dummy: value 10 multiCluster: 11 clusters: 12 - gke_scratch-kubernetes-team_europe-central2-a_k8s-mdb-0 13 - gke_scratch-kubernetes-team_europe-central2-b_k8s-mdb-1 14 - gke_scratch-kubernetes-team_europe-central2-c_k8s-mdb-2 15 namespace: mongodb-operator 16 operator: 17 createOperatorServiceAccount: false 18 createResourcesServiceAccountsAndRoles: false 19 name: mongodb-enterprise-operator-multi-cluster 20 namespace: mongodb-operator 21 watchNamespace: mongodb 22 23 COMPUTED VALUES: 24 agent: 25 name: mongodb-agent-ubi 26 version: 107.0.0.8502-1 27 database: 28 name: mongodb-enterprise-database-ubi 29 version: 1.25.0 30 dummy: value 31 initAppDb: 32 name: mongodb-enterprise-init-appdb-ubi 33 version: 1.25.0 34 initDatabase: 35 name: mongodb-enterprise-init-database-ubi 36 version: 1.25.0 37 initOpsManager: 38 name: mongodb-enterprise-init-ops-manager-ubi 39 version: 1.25.0 40 managedSecurityContext: false 41 mongodb: 42 appdbAssumeOldFormat: false 43 imageType: ubi8 44 name: mongodb-enterprise-server 45 repo: quay.io/mongodb 46 mongodbLegacyAppDb: 47 name: mongodb-enterprise-appdb-database-ubi 48 repo: quay.io/mongodb 49 multiCluster: 50 clusterClientTimeout: 10 51 clusters: 52 - gke_scratch-kubernetes-team_europe-central2-a_k8s-mdb-0 53 - gke_scratch-kubernetes-team_europe-central2-b_k8s-mdb-1 54 - gke_scratch-kubernetes-team_europe-central2-c_k8s-mdb-2 55 kubeConfigSecretName: mongodb-enterprise-operator-multi-cluster-kubeconfig 56 performFailOver: true 57 namespace: mongodb-operator 58 operator: 59 additionalArguments: [] 60 affinity: {} 61 createOperatorServiceAccount: false 62 createResourcesServiceAccountsAndRoles: false 63 deployment_name: mongodb-enterprise-operator 64 env: prod 65 mdbDefaultArchitecture: non-static 66 name: mongodb-enterprise-operator-multi-cluster 67 namespace: mongodb-operator 68 nodeSelector: {} 69 operator_image_name: mongodb-enterprise-operator-ubi 70 replicas: 1 71 resources: 72 limits: 73 cpu: 1100m 74 memory: 1Gi 75 requests: 76 cpu: 500m 77 memory: 200Mi 78 tolerations: [] 79 vaultSecretBackend: 80 enabled: false 81 tlsSecretRef: "" 82 version: 1.25.0 83 watchNamespace: mongodb 84 watchedResources: 85 - mongodb 86 - opsmanagers 87 - mongodbusers 88 webhook: 89 registerConfiguration: true 90 opsManager: 91 name: mongodb-enterprise-ops-manager-ubi 92 registry: 93 agent: quay.io/mongodb 94 appDb: quay.io/mongodb 95 database: quay.io/mongodb 96 imagePullSecrets: null 97 initAppDb: quay.io/mongodb 98 initDatabase: quay.io/mongodb 99 initOpsManager: quay.io/mongodb 100 operator: quay.io/mongodb 101 opsManager: quay.io/mongodb 102 pullPolicy: Always 103 subresourceEnabled: true 104 105 HOOKS: 106 MANIFEST: 107 --- 108 Source: enterprise-operator/templates/operator-roles.yaml 109 kind: ClusterRole 110 apiVersion: rbac.authorization.k8s.io/v1 111 metadata: 112 name: mongodb-enterprise-operator-mongodb-webhook 113 rules: 114 - apiGroups: 115 - "admissionregistration.k8s.io" 116 resources: 117 - validatingwebhookconfigurations 118 verbs: 119 - get 120 - create 121 - update 122 - delete 123 - apiGroups: 124 - "" 125 resources: 126 - services 127 verbs: 128 - get 129 - list 130 - watch 131 - create 132 - update 133 - delete 134 --- 135 Source: enterprise-operator/templates/operator-roles.yaml 136 kind: ClusterRoleBinding 137 apiVersion: rbac.authorization.k8s.io/v1 138 metadata: 139 name: mongodb-enterprise-operator-multi-cluster-mongodb-operator-webhook-binding 140 roleRef: 141 apiGroup: rbac.authorization.k8s.io 142 kind: ClusterRole 143 name: mongodb-enterprise-operator-mongodb-webhook 144 subjects: 145 - kind: ServiceAccount 146 name: mongodb-enterprise-operator-multi-cluster 147 namespace: mongodb-operator 148 --- 149 Source: enterprise-operator/templates/operator.yaml 150 apiVersion: apps/v1 151 kind: Deployment 152 metadata: 153 name: mongodb-enterprise-operator-multi-cluster 154 namespace: mongodb-operator 155 spec: 156 replicas: 1 157 selector: 158 matchLabels: 159 app.kubernetes.io/component: controller 160 app.kubernetes.io/name: mongodb-enterprise-operator-multi-cluster 161 app.kubernetes.io/instance: mongodb-enterprise-operator-multi-cluster 162 template: 163 metadata: 164 labels: 165 app.kubernetes.io/component: controller 166 app.kubernetes.io/name: mongodb-enterprise-operator-multi-cluster 167 app.kubernetes.io/instance: mongodb-enterprise-operator-multi-cluster 168 spec: 169 serviceAccountName: mongodb-enterprise-operator-multi-cluster 170 securityContext: 171 runAsNonRoot: true 172 runAsUser: 2000 173 containers: 174 - name: mongodb-enterprise-operator-multi-cluster 175 image: "quay.io/mongodb/mongodb-enterprise-operator-ubi:1.25.0" 176 imagePullPolicy: Always 177 args: 178 - -watch-resource=mongodb 179 - -watch-resource=opsmanagers 180 - -watch-resource=mongodbusers 181 - -watch-resource=mongodbmulticluster 182 command: 183 - /usr/local/bin/mongodb-enterprise-operator 184 volumeMounts: 185 - mountPath: /etc/config/kubeconfig 186 name: kube-config-volume 187 resources: 188 limits: 189 cpu: 1100m 190 memory: 1Gi 191 requests: 192 cpu: 500m 193 memory: 200Mi 194 env: 195 - name: OPERATOR_ENV 196 value: prod 197 - name: MDB_DEFAULT_ARCHITECTURE 198 value: non-static 199 - name: WATCH_NAMESPACE 200 value: "mongodb" 201 - name: NAMESPACE 202 valueFrom: 203 fieldRef: 204 fieldPath: metadata.namespace 205 - name: CLUSTER_CLIENT_TIMEOUT 206 value: "10" 207 - name: IMAGE_PULL_POLICY 208 value: Always 209 # Database 210 - name: MONGODB_ENTERPRISE_DATABASE_IMAGE 211 value: quay.io/mongodb/mongodb-enterprise-database-ubi 212 - name: INIT_DATABASE_IMAGE_REPOSITORY 213 value: quay.io/mongodb/mongodb-enterprise-init-database-ubi 214 - name: INIT_DATABASE_VERSION 215 value: 1.25.0 216 - name: DATABASE_VERSION 217 value: 1.25.0 218 # Ops Manager 219 - name: OPS_MANAGER_IMAGE_REPOSITORY 220 value: quay.io/mongodb/mongodb-enterprise-ops-manager-ubi 221 - name: INIT_OPS_MANAGER_IMAGE_REPOSITORY 222 value: quay.io/mongodb/mongodb-enterprise-init-ops-manager-ubi 223 - name: INIT_OPS_MANAGER_VERSION 224 value: 1.25.0 225 # AppDB 226 - name: INIT_APPDB_IMAGE_REPOSITORY 227 value: quay.io/mongodb/mongodb-enterprise-init-appdb-ubi 228 - name: INIT_APPDB_VERSION 229 value: 1.25.0 230 - name: OPS_MANAGER_IMAGE_PULL_POLICY 231 value: Always 232 - name: AGENT_IMAGE 233 value: "quay.io/mongodb/mongodb-agent-ubi:107.0.0.8502-1" 234 - name: MDB_AGENT_IMAGE_REPOSITORY 235 value: "quay.io/mongodb/mongodb-agent-ubi" 236 - name: MONGODB_IMAGE 237 value: mongodb-enterprise-server 238 - name: MONGODB_REPO_URL 239 value: quay.io/mongodb 240 - name: MDB_IMAGE_TYPE 241 value: ubi8 242 - name: PERFORM_FAILOVER 243 value: 'true' 244 volumes: 245 - name: kube-config-volume 246 secret: 247 defaultMode: 420 248 secretName: mongodb-enterprise-operator-multi-cluster-kubeconfig Verifique la implementación del operador de Kubernetes:
1 kubectl --context "${K8S_CLUSTER_0_CONTEXT_NAME}" -n "${OPERATOR_NAMESPACE}" rollout status deployment/mongodb-enterprise-operator-multi-cluster 2 echo "Operator deployment in ${OPERATOR_NAMESPACE} namespace" 3 kubectl --context "${K8S_CLUSTER_0_CONTEXT_NAME}" -n "${OPERATOR_NAMESPACE}" get deployments 4 echo; echo "Operator pod in ${OPERATOR_NAMESPACE} namespace" 5 kubectl --context "${K8S_CLUSTER_0_CONTEXT_NAME}" -n "${OPERATOR_NAMESPACE}" get pods 1 Waiting for deployment "mongodb-enterprise-operator-multi-cluster" rollout to finish: 0 of 1 updated replicas are available... 2 deployment "mongodb-enterprise-operator-multi-cluster" successfully rolled out 3 Operator deployment in mongodb-operator namespace 4 NAME READY UP-TO-DATE AVAILABLE AGE 5 mongodb-enterprise-operator-multi-cluster 1/1 1 1 12s 6 7 Operator pod in mongodb-operator namespace 8 NAME READY STATUS RESTARTS AGE 9 mongodb-enterprise-operator-multi-cluster-78cc97547d-nlgds 2/2 Running 1 (3s ago) 12s
Preparar certificados TLS.
En este paso, se habilita TLS para la base de datos de la aplicación y la aplicación Ops Manager. Si no desea usar TLS, elimine los siguientes campos de los MongoDBOpsManager recursos:
Opcional. Generar claves y certificados:
Utilice la herramienta de línea de comandos
opensslpara generar CA y certificados autofirmados para fines de prueba.1 mkdir certs || true 2 3 cat <<EOF >certs/ca.cnf 4 [ req ] 5 default_bits = 2048 6 prompt = no 7 default_md = sha256 8 distinguished_name = dn 9 10 [ dn ] 11 C=US 12 ST=New York 13 L=New York 14 O=Example Company 15 OU=IT Department 16 CN=exampleCA 17 EOF 18 19 cat <<EOF >certs/om.cnf 20 [ req ] 21 default_bits = 2048 22 prompt = no 23 default_md = sha256 24 distinguished_name = dn 25 req_extensions = req_ext 26 27 [ dn ] 28 C=US 29 ST=New York 30 L=New York 31 O=Example Company 32 OU=IT Department 33 CN=${OPS_MANAGER_EXTERNAL_DOMAIN} 34 35 [ req_ext ] 36 subjectAltName = @alt_names 37 keyUsage = critical, digitalSignature, keyEncipherment 38 extendedKeyUsage = serverAuth, clientAuth 39 40 [ alt_names ] 41 DNS.1 = ${OPS_MANAGER_EXTERNAL_DOMAIN} 42 DNS.2 = om-svc.${NAMESPACE}.svc.cluster.local 43 EOF 44 45 cat <<EOF >certs/appdb.cnf 46 [ req ] 47 default_bits = 2048 48 prompt = no 49 default_md = sha256 50 distinguished_name = dn 51 req_extensions = req_ext 52 53 [ dn ] 54 C=US 55 ST=New York 56 L=New York 57 O=Example Company 58 OU=IT Department 59 CN=AppDB 60 61 [ req_ext ] 62 subjectAltName = @alt_names 63 keyUsage = critical, digitalSignature, keyEncipherment 64 extendedKeyUsage = serverAuth, clientAuth 65 66 [ alt_names ] 67 multi-cluster mongod hostnames from service for each pod 68 DNS.1 = *.${NAMESPACE}.svc.cluster.local 69 single-cluster mongod hostnames from headless service 70 DNS.2 = *.om-db-svc.${NAMESPACE}.svc.cluster.local 71 EOF 72 73 generate CA keypair and certificate 74 openssl genrsa -out certs/ca.key 2048 75 openssl req -x509 -new -nodes -key certs/ca.key -days 1024 -out certs/ca.crt -config certs/ca.cnf 76 77 generate OpsManager's keypair and certificate 78 openssl genrsa -out certs/om.key 2048 79 openssl req -new -key certs/om.key -out certs/om.csr -config certs/om.cnf 80 81 generate AppDB's keypair and certificate 82 openssl genrsa -out certs/appdb.key 2048 83 openssl req -new -key certs/appdb.key -out certs/appdb.csr -config certs/appdb.cnf 84 85 generate certificates signed by CA for OpsManager and AppDB 86 openssl x509 -req -in certs/om.csr -CA certs/ca.crt -CAkey certs/ca.key -CAcreateserial -out certs/om.crt -days 365 -sha256 -extfile certs/om.cnf -extensions req_ext 87 openssl x509 -req -in certs/appdb.csr -CA certs/ca.crt -CAkey certs/ca.key -CAcreateserial -out certs/appdb.crt -days 365 -sha256 -extfile certs/appdb.cnf -extensions req_ext Crear secretos con claves TLS:
Si prefiere utilizar sus propias claves y certificados, omita el paso de generación anterior y coloque las claves y los certificados en los siguientes archivos:
certs/ca.crtCertificados de CA. No son necesarios cuando se utilizan certificados de confianza.certs/appdb.key- clave privada para la base de datos de la aplicación.certs/appdb.crt- certificado para la Base de Datos de la Aplicación.certs/om.key- clave privada para Ops Manager.certs/om.crt- certificado para Ops Manager.
1 kubectl --context "${K8S_CLUSTER_0_CONTEXT_NAME}" -n "${NAMESPACE}" create secret tls cert-prefix-om-cert \ 2 --cert=certs/om.crt \ 3 --key=certs/om.key 4 5 kubectl --context "${K8S_CLUSTER_0_CONTEXT_NAME}" -n "${NAMESPACE}" create secret tls cert-prefix-om-db-cert \ 6 --cert=certs/appdb.crt \ 7 --key=certs/appdb.key 8 9 kubectl --context "${K8S_CLUSTER_0_CONTEXT_NAME}" -n "${NAMESPACE}" create configmap om-cert-ca --from-file="mms-ca.crt=certs/ca.crt" 10 kubectl --context "${K8S_CLUSTER_0_CONTEXT_NAME}" -n "${NAMESPACE}" create configmap appdb-cert-ca --from-file="ca-pem=certs/ca.crt"
Instalar Ops Manager.
En este punto, ha preparado el entorno y el operador de Kubernetes para implementar el recurso Ops Manager.
Cree las credenciales necesarias para el usuario administrador de Ops Manager que el operador de Kubernetes creará después de implementar la instancia de la aplicación Ops Manager:
1 kubectl --context "${K8S_CLUSTER_0_CONTEXT_NAME}" --namespace "${NAMESPACE}" create secret generic om-admin-user-credentials \ 2 --from-literal=Username="admin" \ 3 --from-literal=Password="Passw0rd@" \ 4 --from-literal=FirstName="Jane" \ 5 --from-literal=LastName="Doe" Implemente el
MongoDBOpsManagerrecurso personalizado más simple posible (con TLS habilitado) en un solo clúster miembro, también conocido como clúster del operador.Esta implementación es casi la misma que para el modo de clúster único, pero con
spec.topologyyspec.applicationDatabase.topologyconfiguradosMultiClusteren.Implementar de esta manera demuestra que la implementación de un solo clúster de Kubernetes es un caso especial de implementación de varios clústeres de Kubernetes en un solo clúster miembro de Kubernetes. Puede empezar a implementar la aplicación Ops Manager y la base de datos de la aplicación en tantos clústeres de Kubernetes como necesite desde el principio, sin necesidad de empezar la implementación con un solo clúster miembro de Kubernetes.
En este punto, ya deberías haber preparado la implementación de Ops Manager para expandirse a más de un clúster de Kubernetes, lo cual harás más adelante en este procedimiento.
1 kubectl apply --context "${K8S_CLUSTER_0_CONTEXT_NAME}" -n "${NAMESPACE}" -f - <<EOF 2 apiVersion: mongodb.com/v1 3 kind: MongoDBOpsManager 4 metadata: 5 name: om 6 spec: 7 topology: MultiCluster 8 version: "${OPS_MANAGER_VERSION}" 9 adminCredentials: om-admin-user-credentials 10 security: 11 certsSecretPrefix: cert-prefix 12 tls: 13 ca: om-cert-ca 14 clusterSpecList: 15 - clusterName: "${K8S_CLUSTER_0_CONTEXT_NAME}" 16 members: 1 17 applicationDatabase: 18 version: "${APPDB_VERSION}" 19 topology: MultiCluster 20 security: 21 certsSecretPrefix: cert-prefix 22 tls: 23 ca: appdb-cert-ca 24 clusterSpecList: 25 - clusterName: "${K8S_CLUSTER_0_CONTEXT_NAME}" 26 members: 3 27 backup: 28 enabled: false 29 EOF Espere a que el operador de Kubernetes retome el trabajo y alcance el estado
status.applicationDatabase.phase=Pending. Espere a que se completen las implementaciones de la base de datos de la aplicación y del administrador de operaciones.1 echo "Waiting for Application Database to reach Pending phase..." 2 kubectl --context "${K8S_CLUSTER_0_CONTEXT_NAME}" -n "${NAMESPACE}" wait --for=jsonpath='{.status.applicationDatabase.phase}'=Pending opsmanager/om --timeout=30s 1 Waiting for Application Database to reach Pending phase... 2 mongodbopsmanager.mongodb.com/om condition met Implementar Ops Manager. El operador de Kubernetes implementa Ops Manager siguiendo estos pasos:
Implementa los nodos del conjunto de réplicas de la base de datos de la aplicación y espera a que los procesos MongoDB en el conjunto de réplicas comiencen a ejecutarse.
Implementa la instancia de la aplicación Ops Manager con la cadena de conexión de la base de datos de la aplicación y espera a que esté lista.
Agrega los contenedores del Agente de Monitoreo MongoDB a cada Pod de la Base de Datos de la Aplicación.
Espera a que tanto la aplicación Ops Manager como los pods de la base de datos de la aplicación comiencen a ejecutarse.
1 echo "Waiting for Application Database to reach Running phase..." 2 kubectl --context "${K8S_CLUSTER_0_CONTEXT_NAME}" -n "${NAMESPACE}" wait --for=jsonpath='{.status.applicationDatabase.phase}'=Running opsmanager/om --timeout=900s 3 echo; echo "Waiting for Ops Manager to reach Running phase..." 4 kubectl --context "${K8S_CLUSTER_0_CONTEXT_NAME}" -n "${NAMESPACE}" wait --for=jsonpath='{.status.opsManager.phase}'=Running opsmanager/om --timeout=900s 5 echo; echo "Waiting for Application Database to reach Pending phase (enabling monitoring)..." 6 kubectl --context "${K8S_CLUSTER_0_CONTEXT_NAME}" -n "${NAMESPACE}" wait --for=jsonpath='{.status.applicationDatabase.phase}'=Running opsmanager/om --timeout=900s 7 echo "Waiting for Application Database to reach Running phase..." 8 kubectl --context "${K8S_CLUSTER_0_CONTEXT_NAME}" -n "${NAMESPACE}" wait --for=jsonpath='{.status.applicationDatabase.phase}'=Running opsmanager/om --timeout=900s 9 echo; echo "Waiting for Ops Manager to reach Running phase..." 10 kubectl --context "${K8S_CLUSTER_0_CONTEXT_NAME}" -n "${NAMESPACE}" wait --for=jsonpath='{.status.opsManager.phase}'=Running opsmanager/om --timeout=900s 11 echo; echo "MongoDBOpsManager resource" 12 kubectl --context "${K8S_CLUSTER_0_CONTEXT_NAME}" -n "${NAMESPACE}" get opsmanager/om 13 echo; echo "Pods running in cluster ${K8S_CLUSTER_0_CONTEXT_NAME}" 14 kubectl --context "${K8S_CLUSTER_0_CONTEXT_NAME}" -n "${NAMESPACE}" get pods 15 echo; echo "Pods running in cluster ${K8S_CLUSTER_1_CONTEXT_NAME}" 16 kubectl --context "${K8S_CLUSTER_1_CONTEXT_NAME}" -n "${NAMESPACE}" get pods 1 Waiting for Application Database to reach Running phase... 2 mongodbopsmanager.mongodb.com/om condition met 3 4 Waiting for Ops Manager to reach Running phase... 5 mongodbopsmanager.mongodb.com/om condition met 6 7 Waiting for Application Database to reach Pending phase (enabling monitoring)... 8 mongodbopsmanager.mongodb.com/om condition met 9 Waiting for Application Database to reach Running phase... 10 mongodbopsmanager.mongodb.com/om condition met 11 12 Waiting for Ops Manager to reach Running phase... 13 mongodbopsmanager.mongodb.com/om condition met 14 15 MongoDBOpsManager resource 16 NAME REPLICAS VERSION STATE (OPSMANAGER) STATE (APPDB) STATE (BACKUP) AGE WARNINGS 17 om 7.0.4 Running Running Disabled 11m 18 19 Pods running in cluster gke_scratch-kubernetes-team_europe-central2-a_k8s-mdb-0 20 NAME READY STATUS RESTARTS AGE 21 om-0-0 2/2 Running 0 8m39s 22 om-db-0-0 4/4 Running 0 44s 23 om-db-0-1 4/4 Running 0 2m6s 24 om-db-0-2 4/4 Running 0 3m19s 25 26 Pods running in cluster gke_scratch-kubernetes-team_europe-central2-b_k8s-mdb-1 Ahora que ha implementado un clúster de un solo miembro en un modo de múltiples clústeres, puede reconfigurar esta implementación para abarcar más de un clúster de Kubernetes.
En el segundo clúster de miembros, implemente dos miembros adicionales del conjunto de réplicas de la base de datos de aplicaciones y una instancia adicional de la aplicación Ops Manager:
1 kubectl apply --context "${K8S_CLUSTER_0_CONTEXT_NAME}" -n "${NAMESPACE}" -f - <<EOF 2 apiVersion: mongodb.com/v1 3 kind: MongoDBOpsManager 4 metadata: 5 name: om 6 spec: 7 topology: MultiCluster 8 version: "${OPS_MANAGER_VERSION}" 9 adminCredentials: om-admin-user-credentials 10 security: 11 certsSecretPrefix: cert-prefix 12 tls: 13 ca: om-cert-ca 14 clusterSpecList: 15 - clusterName: "${K8S_CLUSTER_0_CONTEXT_NAME}" 16 members: 1 17 - clusterName: "${K8S_CLUSTER_1_CONTEXT_NAME}" 18 members: 1 19 applicationDatabase: 20 version: "${APPDB_VERSION}" 21 topology: MultiCluster 22 security: 23 certsSecretPrefix: cert-prefix 24 tls: 25 ca: appdb-cert-ca 26 clusterSpecList: 27 - clusterName: "${K8S_CLUSTER_0_CONTEXT_NAME}" 28 members: 3 29 - clusterName: "${K8S_CLUSTER_1_CONTEXT_NAME}" 30 members: 2 31 backup: 32 enabled: false 33 EOF Espera a que el Operador de Kubernetes recoja el trabajo (fase pendiente):
1 echo "Waiting for Application Database to reach Pending phase..." 2 kubectl --context "${K8S_CLUSTER_0_CONTEXT_NAME}" -n "${NAMESPACE}" wait --for=jsonpath='{.status.applicationDatabase.phase}'=Pending opsmanager/om --timeout=30s 1 Waiting for Application Database to reach Pending phase... 2 mongodbopsmanager.mongodb.com/om condition met Espere a que el operador de Kubernetes termine de implementar todos los componentes:
1 echo "Waiting for Application Database to reach Running phase..." 2 kubectl --context "${K8S_CLUSTER_0_CONTEXT_NAME}" -n "${NAMESPACE}" wait --for=jsonpath='{.status.applicationDatabase.phase}'=Running opsmanager/om --timeout=600s 3 echo; echo "Waiting for Ops Manager to reach Running phase..." 4 kubectl --context "${K8S_CLUSTER_0_CONTEXT_NAME}" -n "${NAMESPACE}" wait --for=jsonpath='{.status.opsManager.phase}'=Running opsmanager/om --timeout=600s 5 echo; echo "MongoDBOpsManager resource" 6 kubectl --context "${K8S_CLUSTER_0_CONTEXT_NAME}" -n "${NAMESPACE}" get opsmanager/om 7 echo; echo "Pods running in cluster ${K8S_CLUSTER_0_CONTEXT_NAME}" 8 kubectl --context "${K8S_CLUSTER_0_CONTEXT_NAME}" -n "${NAMESPACE}" get pods 9 echo; echo "Pods running in cluster ${K8S_CLUSTER_1_CONTEXT_NAME}" 10 kubectl --context "${K8S_CLUSTER_1_CONTEXT_NAME}" -n "${NAMESPACE}" get pods 1 Waiting for Application Database to reach Running phase... 2 mongodbopsmanager.mongodb.com/om condition met 3 4 Waiting for Ops Manager to reach Running phase... 5 mongodbopsmanager.mongodb.com/om condition met 6 7 MongoDBOpsManager resource 8 NAME REPLICAS VERSION STATE (OPSMANAGER) STATE (APPDB) STATE (BACKUP) AGE WARNINGS 9 om 7.0.4 Pending Running Disabled 14m 10 11 Pods running in cluster gke_scratch-kubernetes-team_europe-central2-a_k8s-mdb-0 12 NAME READY STATUS RESTARTS AGE 13 om-0-0 2/2 Terminating 0 12m 14 om-db-0-0 4/4 Running 0 4m12s 15 om-db-0-1 4/4 Running 0 5m34s 16 om-db-0-2 4/4 Running 0 6m47s 17 18 Pods running in cluster gke_scratch-kubernetes-team_europe-central2-b_k8s-mdb-1 19 NAME READY STATUS RESTARTS AGE 20 om-1-0 0/2 Init:0/2 0 0s 21 om-db-1-0 4/4 Running 0 3m24s 22 om-db-1-1 4/4 Running 0 104s
Habilitar copia de seguridad.
En una implementación de la aplicación Ops Manager en un clúster multiKubernetes, solo se puede configurar el 3almacenamiento de copias de seguridad basado en S. Este procedimiento se refiere a S3_* definido en env_variables.sh.
Opcional. Instale el operador MinIO.
Este procedimiento implementa almacenamiento compatible con S para sus3 copias de seguridad mediante el operador MinIO. Puede omitir este paso si dispone de buckets de AWS S3 u otros buckets compatibles con S.3
S3_*En este caso, ajuste las variables según corresponda en env_variables.sh.1 kustomize build "github.com/minio/operator/resources/?timeout=120&ref=v5.0.12" | \ 2 kubectl --context "${K8S_CLUSTER_0_CONTEXT_NAME}" apply -f - 3 4 kustomize build "github.com/minio/operator/examples/kustomization/tenant-tiny?timeout=120&ref=v5.0.12" | \ 5 kubectl --context "${K8S_CLUSTER_0_CONTEXT_NAME}" apply -f - 6 7 add two buckets to the tenant config 8 kubectl --context "${K8S_CLUSTER_0_CONTEXT_NAME}" -n "tenant-tiny" patch tenant/myminio \ 9 --type='json' \ 10 -p="[{\"op\": \"add\", \"path\": \"/spec/buckets\", \"value\": [{\"name\": \"${S3_OPLOG_BUCKET_NAME}\"}, {\"name\": \"${S3_SNAPSHOT_BUCKET_NAME}\"}]}]" Antes de configurar y habilitar la copia de seguridad, cree secretos:
s3-access-secret- contiene credenciales S.3s3-ca-certContiene un certificado de CA que emitió el certificado de servidor del bucket. En el caso de la implementación de MinIO de ejemplo utilizada en este procedimiento, se utiliza el certificado de CA raíz de Kubernetes predeterminado para firmar el certificado. Dado que no es un certificado de CA de confianza pública, debe proporcionarlo para que Ops Manager pueda confiar en la conexión.
Si utiliza certificados de confianza pública, puede omitir este paso y eliminar los valores de las configuraciones
spec.backup.s3Stores.customCertificateSecretRefsspec.backup.s3OpLogStores.customCertificateSecretRefsy.1 kubectl --context "${K8S_CLUSTER_0_CONTEXT_NAME}" -n "${NAMESPACE}" create secret generic s3-access-secret \ 2 --from-literal=accessKey="${S3_ACCESS_KEY}" \ 3 --from-literal=secretKey="${S3_SECRET_KEY}" 4 5 minio TLS secrets are signed with the default k8s root CA 6 kubectl --context "${K8S_CLUSTER_0_CONTEXT_NAME}" -n "${NAMESPACE}" create secret generic s3-ca-cert \ 7 --from-literal=ca.crt="$(kubectl --context "${K8S_CLUSTER_0_CONTEXT_NAME}" -n kube-system get configmap kube-root-ca.crt -o jsonpath="{.data.ca\.crt}")"
Vuelva a implementar Ops Manager con la copia de seguridad habilitada.
El operador de Kubernetes puede configurar e implementar todos los componentes, la aplicación Ops Manager, las instancias de Backup Daemon y los nodos del conjunto de réplicas de la base de datos de la aplicación en cualquier combinación en cualquier clúster miembro para el que configure el operador de Kubernetes.
Para ilustrar la flexibilidad de la configuración de implementación de varios clústeres de Kubernetes, implemente solo una instancia de Backup Daemon en el tercer clúster miembro y especifique cero miembros de Backup Daemon para el primer y el segundo clúster.
1 kubectl apply --context "${K8S_CLUSTER_0_CONTEXT_NAME}" -n "${NAMESPACE}" -f - <<EOF 2 apiVersion: mongodb.com/v1 3 kind: MongoDBOpsManager 4 metadata: 5 name: om 6 spec: 7 topology: MultiCluster 8 version: "${OPS_MANAGER_VERSION}" 9 adminCredentials: om-admin-user-credentials 10 security: 11 certsSecretPrefix: cert-prefix 12 tls: 13 ca: om-cert-ca 14 clusterSpecList: 15 - clusterName: "${K8S_CLUSTER_0_CONTEXT_NAME}" 16 members: 1 17 backup: 18 members: 0 19 - clusterName: "${K8S_CLUSTER_1_CONTEXT_NAME}" 20 members: 1 21 backup: 22 members: 0 23 - clusterName: "${K8S_CLUSTER_2_CONTEXT_NAME}" 24 members: 0 25 backup: 26 members: 1 27 configuration: # to avoid configuration wizard on first login 28 mms.adminEmailAddr: email@example.com 29 mms.fromEmailAddr: email@example.com 30 mms.ignoreInitialUiSetup: "true" 31 mms.mail.hostname: smtp@example.com 32 mms.mail.port: "465" 33 mms.mail.ssl: "true" 34 mms.mail.transport: smtp 35 mms.minimumTLSVersion: TLSv1.2 36 mms.replyToEmailAddr: email@example.com 37 applicationDatabase: 38 version: "${APPDB_VERSION}" 39 topology: MultiCluster 40 security: 41 certsSecretPrefix: cert-prefix 42 tls: 43 ca: appdb-cert-ca 44 clusterSpecList: 45 - clusterName: "${K8S_CLUSTER_0_CONTEXT_NAME}" 46 members: 3 47 - clusterName: "${K8S_CLUSTER_1_CONTEXT_NAME}" 48 members: 2 49 backup: 50 enabled: true 51 s3Stores: 52 - name: my-s3-block-store 53 s3SecretRef: 54 name: "s3-access-secret" 55 pathStyleAccessEnabled: true 56 s3BucketEndpoint: "${S3_ENDPOINT}" 57 s3BucketName: "${S3_SNAPSHOT_BUCKET_NAME}" 58 customCertificateSecretRefs: 59 - name: s3-ca-cert 60 key: ca.crt 61 s3OpLogStores: 62 - name: my-s3-oplog-store 63 s3SecretRef: 64 name: "s3-access-secret" 65 s3BucketEndpoint: "${S3_ENDPOINT}" 66 s3BucketName: "${S3_OPLOG_BUCKET_NAME}" 67 pathStyleAccessEnabled: true 68 customCertificateSecretRefs: 69 - name: s3-ca-cert 70 key: ca.crt 71 EOF Espere hasta que el operador de Kubernetes finalice su configuración:
1 echo; echo "Waiting for Backup to reach Running phase..." 2 kubectl --context "${K8S_CLUSTER_0_CONTEXT_NAME}" -n "${NAMESPACE}" wait --for=jsonpath='{.status.backup.phase}'=Running opsmanager/om --timeout=1200s 3 echo "Waiting for Application Database to reach Running phase..." 4 kubectl --context "${K8S_CLUSTER_0_CONTEXT_NAME}" -n "${NAMESPACE}" wait --for=jsonpath='{.status.applicationDatabase.phase}'=Running opsmanager/om --timeout=600s 5 echo; echo "Waiting for Ops Manager to reach Running phase..." 6 kubectl --context "${K8S_CLUSTER_0_CONTEXT_NAME}" -n "${NAMESPACE}" wait --for=jsonpath='{.status.opsManager.phase}'=Running opsmanager/om --timeout=600s 7 echo; echo "MongoDBOpsManager resource" 8 kubectl --context "${K8S_CLUSTER_0_CONTEXT_NAME}" -n "${NAMESPACE}" get opsmanager/om 9 echo; echo "Pods running in cluster ${K8S_CLUSTER_0_CONTEXT_NAME}" 10 kubectl --context "${K8S_CLUSTER_0_CONTEXT_NAME}" -n "${NAMESPACE}" get pods 11 echo; echo "Pods running in cluster ${K8S_CLUSTER_1_CONTEXT_NAME}" 12 kubectl --context "${K8S_CLUSTER_1_CONTEXT_NAME}" -n "${NAMESPACE}" get pods 13 echo; echo "Pods running in cluster ${K8S_CLUSTER_2_CONTEXT_NAME}" 14 kubectl --context "${K8S_CLUSTER_2_CONTEXT_NAME}" -n "${NAMESPACE}" get pods 1 Waiting for Backup to reach Running phase... 2 mongodbopsmanager.mongodb.com/om condition met 3 Waiting for Application Database to reach Running phase... 4 mongodbopsmanager.mongodb.com/om condition met 5 6 Waiting for Ops Manager to reach Running phase... 7 mongodbopsmanager.mongodb.com/om condition met 8 9 MongoDBOpsManager resource 10 NAME REPLICAS VERSION STATE (OPSMANAGER) STATE (APPDB) STATE (BACKUP) AGE WARNINGS 11 om 7.0.4 Running Running Running 22m 12 13 Pods running in cluster gke_scratch-kubernetes-team_europe-central2-a_k8s-mdb-0 14 NAME READY STATUS RESTARTS AGE 15 om-0-0 2/2 Running 0 7m10s 16 om-db-0-0 4/4 Running 0 11m 17 om-db-0-1 4/4 Running 0 13m 18 om-db-0-2 4/4 Running 0 14m 19 20 Pods running in cluster gke_scratch-kubernetes-team_europe-central2-b_k8s-mdb-1 21 NAME READY STATUS RESTARTS AGE 22 om-1-0 2/2 Running 0 4m8s 23 om-db-1-0 4/4 Running 0 11m 24 om-db-1-1 4/4 Running 0 9m25s 25 26 Pods running in cluster gke_scratch-kubernetes-team_europe-central2-c_k8s-mdb-2 27 NAME READY STATUS RESTARTS AGE 28 om-2-backup-daemon-0 2/2 Running 0 2m5s
Opcional. Elimina los clústeres GKE (Google Kubernetes Engine) y todos sus recursos asociados (VMs).
Ejecute el siguiente script para eliminar los clústeres de GKE y limpiar su entorno.
Importante
Los siguientes comandos no son reversibles. Eliminan todos los clústeres referenciados en env_variables.sh. No los ejecute si desea conservar los clústeres de GKE; por ejemplo, si no los creó durante este procedimiento.
1 yes | gcloud container clusters delete "${K8S_CLUSTER_0}" --zone="${K8S_CLUSTER_0_ZONE}" & 2 yes | gcloud container clusters delete "${K8S_CLUSTER_1}" --zone="${K8S_CLUSTER_1_ZONE}" & 3 yes | gcloud container clusters delete "${K8S_CLUSTER_2}" --zone="${K8S_CLUSTER_2_ZONE}" & 4 wait