Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
In questo articolo vengono create le risorse dell'infrastruttura necessarie per eseguire un cluster MongoDB nel servizio Azure Kubernetes.
Prerequisiti
- Esaminare la panoramica per la distribuzione di un cluster MongoDB nel servizio Azure Kubernetes.
- Una sottoscrizione di Azure. Se non se ne ha una, creare un account gratuito.
- Interfaccia della riga di comando di Azure versione 2.61.0. Per eseguire l'installazione o l'aggiornamento, vedere Installare l'interfaccia della riga di comando di Azure.
- Helm versione 3 o successiva. Per installare, vedere Installazione di Helm.
-
kubectl, che Azure Cloud Shell installa per impostazione predefinita. - Docker installato nel computer locale. Per installare, vedere Ottenere Docker.
Impostare le variabili di ambiente
Impostare le variabili di ambiente necessarie per l'uso in questa guida:
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
Creare un gruppo di risorse
Creare un gruppo di risorse usando il comando
az group create.az group create --name $MY_RESOURCE_GROUP_NAME --location $MY_LOCATION --output tableOutput di esempio:
Location Name ------------- -------------------------------- australiaeast myResourceGroup-rg-australiaeast
Creare un'identità per accedere ai segreti in Azure Key Vault
In questo passaggio viene creata un'identità gestita assegnata dall'utente usata dall'operatore segreti esterni per accedere alle password MongoDB archiviate in Azure Key Vault.
Creare un'identità gestita assegnata dall'utente usando il comando
az identity create.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)
Creare un'istanza di Azure Key Vault
Creare un'istanza di Azure Key Vault usando il 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)Output di esempio:
Location Name ResourceGroup ------------- -------------- -------------------------------- australiaeast vault-cjcfc-kv myResourceGroup-rg-australiaeast
Creare un'istanza di Registro Azure Container
Creare un'istanza di Registro Azure Container per archiviare e gestire le immagini del contenitore usando il comando
az acr create.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)Output di esempio:
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
Creare un account di archiviazione di Azure
Creare un account di archiviazione di Azure per archiviare i backup di MongoDB usando il 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 noneOutput di esempio:
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
Creare un cluster AKS
Nei passaggi seguenti viene creato un cluster del servizio Azure Kubernetes con un'identità del carico di lavoro e un'autorità di certificazione OIDC (OpenID Connect) abilitata. L'identità del carico di lavoro concede all'account del servizio Operatore segreti esterni l'autorizzazione per accedere alle password MongoDB archiviate nell'insieme di credenziali delle chiavi.
Creare un cluster del servizio Azure Kubernetes usando il 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 noneAggiungere un pool di nodi utente al cluster del servizio Azure Kubernetes usando il comando
az aks nodepool add. Questo pool di nodi è la posizione in cui vengono eseguiti i pod 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 tableOutput di esempio:
Name OsType KubernetesVersion VmSize Count MaxPods ProvisioningState Mode ---------- -------- ------------------- --------------- ------- --------- ------------------- ------ userpool Linux 1.28 Standard_DS4_v2 3 30 Succeeded UserOttenere l'URL dell'autorità emittente OIDC da usare per la configurazione dell'identità del carico di lavoro usando il 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)Assegnare il ruolo
AcrPullnell'identità kubelet usando il 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
Caricare immagini Percona in Registro Azure Container
In questa sezione si scaricano le immagini Percona da Docker Hub e le si carica in Registro Azure Container. Questo passaggio garantisce che l'immagine sia disponibile nel registro privato e possa essere usata nel cluster del servizio Azure Kubernetes. Non è consigliabile usare l'immagine pubblica in un ambiente di produzione.
Importare le immagini Percona da Docker Hub e caricarle in Registro Azure Container usando i comandi
az acr importseguenti: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
Distribuire l'infrastruttura con Terraform
Per distribuire l'infrastruttura usando Terraform, utilizzeremo il modulo verificato di Azure per AKS (Azure Kubernetes Service). Il repository terraform-azurerm-avm-res-containerservice-managedcluster contiene un esempio completo con l'infrastruttura necessaria per eseguire un cluster MongoDB nel servizio Azure Kubernetes.
Annotazioni
Se si prevede di eseguire questa operazione nell'ambiente di produzione, è consigliabile esaminare il modulo modello di produzione AKS per i moduli verificati di Azure. Questo è associato a raccomandazioni sulle procedure consigliate.
Clonare il repository Git con il modulo terraform:
git clone https://github.com/Azure/terraform-azurerm-avm-res-containerservice-managedcluster.git cd examples/stateful-workloadsCreare un
mongodb.tfvarsfile per definire le variabili usando il comando seguente: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" } } EOLEseguire i comandi Terraform seguenti per distribuire l'infrastruttura:
terraform init terraform fmt terraform apply -var-file="mongodb.tfvars"Eseguire il comando seguente per esportare i valori di output terraform come variabili di ambiente nel terminale per usarli nei passaggi successivi:
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)
Annotazioni
In AKS, il tempo keepalive (la durata dell'inattività dopo la quale viene inviato il primo probe keepalive) ha una durata predefinita di 7.200 secondi o 2 ore. Per MongoDB, in genere si otterranno risultati migliori con un valore keepalive più breve, nell'ordine di 120 secondi o 2 minuti.
Connettersi al cluster servizio Azure Kubernetes
Configurare
kubectlper connettersi al cluster del servizio Azure Kubernetes usando il comandoaz aks get-credentials.az aks get-credentials --resource-group $MY_RESOURCE_GROUP_NAME --name $MY_CLUSTER_NAME --overwrite-existing --output table