Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
En este artículo vas a crear los recursos de infraestructura necesarios para ejecutar un clúster de MongoDB en Azure Kubernetes Service (AKS).
Requisitos previos
- Examine la información general para implementar un clúster de MongoDB en AKS.
- Suscripción a Azure. En caso de no tener ninguna, cree una cuenta gratuita.
- CLI de Azure, versión 2.61.0. Para la instalación o la actualización, consulte Instalación de la CLI de Azure.
- Helm versión 3 o posterior. Para instalarlo, vea Instalación de Helm.
-
kubectl, que Azure Cloud Shell instala de forma predeterminada. - Docker instalado en la máquina local. Para instalarlo, vea Obtener Docker.
Establecimiento de variables de entorno
Establezca las variables de entorno necesarias para usarlas en esta guía:
random=$(echo $RANDOM | tr '[0-9]' '[a-z]')
export MY_LOCATION=australiaeast
export MY_RESOURCE_GROUP_NAME=myResourceGroup-rg-$(echo $MY_LOCATION)
export MY_ACR_REGISTRY=mydnsrandomname$(echo $random)
export MY_IDENTITY_NAME=ua-identity-123
export MY_KEYVAULT_NAME=vault-$(echo $random)-kv
export MY_CLUSTER_NAME=cluster-aks
export SERVICE_ACCOUNT_NAME=mongodb
export SERVICE_ACCOUNT_NAMESPACE=mongodb
export AKS_MONGODB_NAMESPACE=mongodb
export AKS_MONGODB_SECRETS_NAME=cluster-aks-mongodb-secrets
export AKS_MONGODB_CLUSTER_NAME=cluster-aks-mongodb
export AKS_MONGODB_SECRETS_ENCRYPTION_KEY=cluster-aks-mongodb-secrets-mongodb-encryption-key
export AKS_AZURE_SECRETS_NAME=cluster-aks-azure-secrets
export AKS_MONGODB_BACKUP_STORAGE_ACCOUNT_NAME=mongodbsa$(echo $random)
export AKS_MONGODB_BACKUP_STORAGE_CONTAINER_NAME=backups
Crear un grupo de recursos
Cree un grupo de recursos con el comando
az group create.az group create --name $MY_RESOURCE_GROUP_NAME --location $MY_LOCATION --output tableEjemplo:
Location Name ------------- -------------------------------- australiaeast myResourceGroup-rg-australiaeast
Creación de una identidad para acceder a secretos en Azure Key Vault
En este paso, va a crear una identidad administrada asignada por el usuario que el servicio Operador de secretos externos usa para acceder a las contraseñas de MongoDB almacenadas en Azure Key Vault.
Use el comando
az identity createpara crear una identidad administrada asignada por el usuario.az identity create --name $MY_IDENTITY_NAME --resource-group $MY_RESOURCE_GROUP_NAME --output none export MY_IDENTITY_NAME_ID=$(az identity show --name $MY_IDENTITY_NAME -g $MY_RESOURCE_GROUP_NAME --query id -o tsv) export MY_IDENTITY_NAME_PRINCIPAL_ID=$(az identity show --name $MY_IDENTITY_NAME -g $MY_RESOURCE_GROUP_NAME --query principalId -o tsv) export MY_IDENTITY_NAME_CLIENT_ID=$(az identity show --name $MY_IDENTITY_NAME -g $MY_RESOURCE_GROUP_NAME --query clientId -o tsv)
Creación de una instancia de Azure Key Vault
Cree una instancia de Azure Key Vault mediante el comando
az keyvault create.az keyvault create --name $MY_KEYVAULT_NAME --resource-group $MY_RESOURCE_GROUP_NAME --location $MY_LOCATION --enable-rbac-authorization false --output table export KEYVAULTID=$(az keyvault show --name $MY_KEYVAULT_NAME --query "id" --output tsv) export KEYVAULTURL=$(az keyvault show --name $MY_KEYVAULT_NAME --query "properties.vaultUri" --output tsv)Ejemplo:
Location Name ResourceGroup ------------- -------------- -------------------------------- australiaeast vault-cjcfc-kv myResourceGroup-rg-australiaeast
Crear una instancia de Azure Container Registry
Use el comando
az acr createpara crear una instancia de Azure Container Registry para almacenar y administrar las imágenes del contenedor.az acr create \ --name ${MY_ACR_REGISTRY} \ --resource-group $MY_RESOURCE_GROUP_NAME \ --sku Premium \ --location $MY_LOCATION \ --admin-enabled true \ --output table export MY_ACR_REGISTRY_ID=$(az acr show --name $MY_ACR_REGISTRY --resource-group $MY_RESOURCE_GROUP_NAME --query id -o tsv)Ejemplo:
NAME RESOURCE GROUP LOCATION SKU LOGIN SERVER CREATION DATE ADMIN ENABLED -------------------- -------------------------------- ------------- ------- ------------------------------- -------------------- --------------- mydnsrandomnamecjcfc myResourceGroup-rg-australiaeast australiaeast Premium mydnsrandomnamecjcfc.azurecr.io 2024-07-01T12:18:34Z True
Creación de una cuenta de Azure Storage
Cree una cuenta de Azure Storage para almacenar las copias de seguridad de MongoDB mediante el comando
az acr create.az storage account create --name $AKS_MONGODB_BACKUP_STORAGE_ACCOUNT_NAME --resource-group $MY_RESOURCE_GROUP_NAME --location $MY_LOCATION --sku Standard_ZRS --output table az storage container create --name $AKS_MONGODB_BACKUP_STORAGE_CONTAINER_NAME --account-name $AKS_MONGODB_BACKUP_STORAGE_ACCOUNT_NAME --output table export AKS_MONGODB_BACKUP_STORAGE_ACCOUNT_KEY=$(az storage account keys list --account-name $AKS_MONGODB_BACKUP_STORAGE_ACCOUNT_NAME --query "[0].value" -o tsv) az keyvault secret set --vault-name $MY_KEYVAULT_NAME --name AZURE-STORAGE-ACCOUNT-KEY --value $AKS_MONGODB_BACKUP_STORAGE_ACCOUNT_KEY --output noneEjemplo:
AccessTier AllowBlobPublicAccess AllowCrossTenantReplication CreationTime EnableHttpsTrafficOnly Kind Location MinimumTlsVersion Name PrimaryLocation ProvisioningState ResourceGroup StatusOfPrimary ------------ ----------------------- ----------------------------- -------------------------------- ------------------------ --------- ------------- ------------------- -------------- ----------------- ------------------- -------------------------------- ----------------- Hot False False 2024-08-09T07:06:41.727230+00:00 True StorageV2 australiaeast TLS1_0 mongodbsabdibh australiaeast Succeeded myResourceGroup-rg-australiaeast available Created --------- True
Creación de un clúster de AKS
En los siguientes pasos, creará un clúster de AKS con una identidad de carga de trabajo y un emisor de OpenID Connect (OIDC) habilitado. La identidad de carga de trabajo concede permiso a la cuenta del servicio Operador de secretos externos para acceder a las contraseñas de MongoDB guardadas en el almacén de claves.
Cree un clúster de AKS con el comando
az aks create.az aks create \ --location $MY_LOCATION \ --name $MY_CLUSTER_NAME \ --tier standard \ --resource-group $MY_RESOURCE_GROUP_NAME \ --network-plugin azure \ --node-vm-size Standard_DS4_v2 \ --node-count 1 \ --nodepool-name systempool \ --nodepool-tags "pool=system" \ --auto-upgrade-channel stable \ --node-os-upgrade-channel NodeImage \ --attach-acr ${MY_ACR_REGISTRY} \ --enable-oidc-issuer \ --enable-workload-identity \ --zones 1 2 3 \ --generate-ssh-keys \ --output noneAgregue un grupo de nodos al clúster de AKS mediante el comando
az aks nodepool add. Este grupo de nodos es donde se ejecutan los pods de MongoDB.az aks nodepool add \ --resource-group $MY_RESOURCE_GROUP_NAME \ --cluster-name $MY_CLUSTER_NAME \ --name mongodbpool \ --node-vm-size Standard_DS4_v2 \ --node-count 3 \ --zones 1 2 3 \ --mode User \ --output tableEjemplo:
Name OsType KubernetesVersion VmSize Count MaxPods ProvisioningState Mode ---------- -------- ------------------- --------------- ------- --------- ------------------- ------ userpool Linux 1.28 Standard_DS4_v2 3 30 Succeeded UserObtenga la dirección URL del emisor de OIDC que se usará para la configuración de identidad de carga de trabajo mediante el comando
az aks show.export OIDC_URL=$(az aks show --resource-group $MY_RESOURCE_GROUP_NAME --name $MY_CLUSTER_NAME --query oidcIssuerProfile.issuerUrl -o tsv)Asigne el rol
AcrPulla la identidad de kubelet mediante el comandoaz role assignment create.export KUBELET_IDENTITY=$(az aks show -g $MY_RESOURCE_GROUP_NAME --name $MY_CLUSTER_NAME -o tsv --query identityProfile.kubeletidentity.objectId) az role assignment create \ --assignee ${KUBELET_IDENTITY} \ --role "AcrPull" \ --scope ${MY_ACR_REGISTRY_ID} \ --output none
Carga de imágenes de Percona en Azure Container Registry
En esta sección, va a descargar las imágenes de Percona de Docker Hub y a cargarlas en Azure Container Registry. Este paso garantiza que la imagen está disponible en el registro privado y se puede usar en el clúster de AKS. No se recomienda consumir la imagen pública en un entorno de producción.
Importe las imágenes de Percona desde Docker Hub y cárguelas en Azure Container Registry mediante los siguientes comandos
az acr import:az acr import \ --name $MY_ACR_REGISTRY \ --source docker.io/percona/percona-server-mongodb:7.0.8-5 \ --image percona-server-mongodb:7.0.8-5 az acr import \ --name $MY_ACR_REGISTRY \ --source docker.io/percona/pmm-client:2.41.2 \ --image pmm-client:2.41.2 az acr import \ --name $MY_ACR_REGISTRY \ --source docker.io/percona/percona-backup-mongodb:2.4.1 \ --image percona-backup-mongodb:2.4.1 az acr import \ --name $MY_ACR_REGISTRY \ --source docker.io/percona/percona-server-mongodb-operator:1.16.1 \ --image percona-server-mongodb-operator:1.16.1
Implementación de la infraestructura con Terraform
Para implementar la infraestructura mediante Terraform, vamos a usar el módulo comprobado de Azure para AKS. El repositorio terraform-azurerm-avm-res-containerservice-managedcluster contiene un ejemplo completo con la infraestructura necesaria para ejecutar un clúster de MongoDB en Azure Kubernetes Service (AKS).
Nota:
Si planea ejecutar esto en producción, se recomienda examinar el módulo de patrones de producción de AKS para los módulos comprobados de Azure. Esto viene acompañado de las recomendaciones de mejores prácticas.
Clona el repositorio de Git con el módulo de Terraform.
git clone https://github.com/Azure/terraform-azurerm-avm-res-containerservice-managedcluster.git cd examples/stateful-workloadsCree un
mongodb.tfvarsarchivo para definir variables mediante el comando siguiente:cat > mongodb.tfvars <<EOL location = "$MY_LOCATION" resource_group_name = "$MY_RESOURCE_GROUP_NAME" acr_registry_name = "$MY_ACR_REGISTRY" cluster_name = "$MY_CLUSTER_NAME" identity_name = "$MY_IDENTITY_NAME" keyvault_name = "$MY_KEYVAULT_NAME" aks_mongodb_backup_storage_account_name = "$AKS_MONGODB_BACKUP_STORAGE_ACCOUNT_NAME" aks_mongodb_backup_storage_container_name = "$AKS_MONGODB_BACKUP_STORAGE_CONTAINER_NAME" mongodb_enabled = true mongodb_namespace = "$AKS_MONGODB_NAMESPACE" service_account_name = "$SERVICE_ACCOUNT_NAME" acr_task_content = <<-EOF version: v1.1.0 steps: - cmd: bash echo Waiting 10 seconds the propagation of the Container Registry Data Importer and Data Reader role - cmd: bash sleep 10 - cmd: az login --identity - cmd: az acr import --name \$RegistryName --source docker.io/percona/percona-server-mongodb:7.0.8-5 --image percona-server-mongodb:7.0.8-5 - cmd: az acr import --name \$RegistryName --source docker.io/percona/pmm-client:2.41.2 --image pmm-client:2.41.2 - cmd: az acr import --name \$RegistryName --source docker.io/percona/percona-backup-mongodb:2.4.1 --image percona-backup-mongodb:2.4.1 - cmd: az acr import --name \$RegistryName --source docker.io/percona/percona-server-mongodb-operator:1.16.1 --image percona-server-mongodb-operator:1.16.1 EOF node_pools = { mongodbserver = { name = "mongodbpool" vm_size = "Standard_D2ds_v4" node_count = 3 zones = [1, 2, 3] os_type = "Linux" } } EOLEjecute los siguientes comandos de Terraform para implementar la infraestructura:
terraform init terraform fmt terraform apply -var-file="mongodb.tfvars"Ejecute el comando siguiente para exportar los valores de salida de Terraform como variables de entorno en el terminal para usarlos en los pasos siguientes:
export MY_ACR_REGISTRY_ID=$(terraform output -raw acr_registry_id) export MY_ACR_REGISTRY=$(terraform output -raw acr_registry_name) export MY_CLUSTER_NAME=$(terraform output -raw aks_cluster_name) export KUBELET_IDENTITY=$(terraform output -raw aks_kubelet_identity_id) export OIDC_URL=$(terraform output -raw aks_oidc_issuer_url) export identity_name=$(terraform output -raw identity_name) export MY_IDENTITY_NAME_ID=$(terraform output -raw identity_name_id) export MY_IDENTITY_NAME_PRINCIPAL_ID=$(terraform output -raw identity_name_principal_id) export MY_IDENTITY_NAME_CLIENT_ID=$(terraform output -raw identity_name_client_id) export KEYVAULTID=$(terraform output -raw key_vault_id) export KEYVAULTURL=$(terraform output -raw key_vault_uri) export AKS_MONGODB_BACKUP_STORAGE_ACCOUNT_KEY=$(terraform output -raw storage_account_key) export STORAGE_ACCOUNT_NAME=$(terraform output -raw storage_account_name) export TENANT_ID=$(terraform output -raw identity_name_tenant_id)
Nota:
En AKS, el tiempo de mantenimiento (la duración de la inactividad después del cual se envía el primer sondeo keepalive) la duración predeterminada es de 7 200 segundos o 2 horas. Para MongoDB, generalmente experimentará mejores resultados con un valor keepalive más corto, en el orden de 120 segundos o 2 minutos.
Conexión al clúster de AKS
Configure
kubectlpara conectarse a su clúster AKS mediante el comandoaz aks get-credentials.az aks get-credentials --resource-group $MY_RESOURCE_GROUP_NAME --name $MY_CLUSTER_NAME --overwrite-existing --output table