Freigeben über


Erstellen der Infrastruktur zum Ausführen eines MongoDB-Clusters in Azure Kubernetes Service (AKS)

In diesem Artikel erstellen Sie die erforderlichen Infrastrukturressourcen zum Ausführen eines MongoDB-Clusters in Azure Kubernetes Service (AKS).

Voraussetzungen

Festlegen von Umgebungsvariablen

Legen Sie die erforderlichen Umgebungsvariablen für die Verwendung in dieser Anleitung fest:

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

Erstellen einer Ressourcengruppe

  • Erstellen Sie mit dem Befehl az group create eine Ressourcengruppe.

    az group create --name $MY_RESOURCE_GROUP_NAME --location $MY_LOCATION --output table
    

    Beispielausgabe:

    Location       Name
    -------------  --------------------------------
    australiaeast  myResourceGroup-rg-australiaeast   
    

Erstellen einer Identität für den Zugriff auf geheime Schlüssel im Azure Key Vault

In diesem Schritt erstellen Sie eine benutzerseitig zugewiesene verwaltete Identität, die External Secrets Operator verwendet, um auf das in Azure Key Vault gespeicherte MongoDB-Kennwort zuzugreifen.

  • Erstellen Sie eine benutzerseitig zugewiesene verwaltete Identität mit dem Befehl 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)
    

Erstellen einer Azure Key Vault-Instanz

  • Erstellen Sie eine Azure Key Vault-Instanz mithilfe des Befehls 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)
    

    Beispielausgabe:

    Location       Name            ResourceGroup
    -------------  --------------  --------------------------------
    australiaeast  vault-cjcfc-kv  myResourceGroup-rg-australiaeast
    

Erstellen einer Azure Container Registry-Instanz

  • Erstellen Sie mithilfe des Befehls az acr create eine Azure Container Registry-Instanz, um Ihre Containerimages zu speichern und zu verwalten.

    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)
    

    Beispielausgabe:

    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
    

Erstellen eines Azure-Speicherkontos

  • Erstellen Sie ein Azure Storage-Konto, um die MongoDB-Sicherungen mithilfe des az acr create-Befehls zu speichern.

    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 none
    

    Beispielausgabe:

    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
    

Erstellen eines AKS-Clusters

In den folgenden Schritten erstellen Sie einen AKS-Cluster mit einer Workloadidentität und aktiviertem OpenID Connect-Aussteller (OIDC). Die Workloadidentität gewährt dem Dienstkonto des Operators für externe Geheimnisse die Berechtigung, auf das im Schlüsseltresor gespeicherte MongoDB-Kennwort zuzugreifen.

  1. Erstellen Sie mit dem Befehl az aks create einen AKS-Cluster.

    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 none
    
  2. Fügen Sie dem AKS-Cluster einen Benutzerknotenpool mit dem Befehl az aks nodepool add hinzu. In diesem Knotenpool werden die MongoDB-Pods ausgeführt.

    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 table
    

    Beispielausgabe:

    Name        OsType    KubernetesVersion    VmSize           Count    MaxPods    ProvisioningState    Mode
    ----------  --------  -------------------  ---------------  -------  ---------  -------------------  ------
    userpool    Linux     1.28                 Standard_DS4_v2  3        30         Succeeded            User
    
  3. Rufen Sie die OIDC-Aussteller-URL ab, die für die Workload-Identitätskonfiguration mithilfe des Befehls az aks show verwendet werden soll.

    export OIDC_URL=$(az aks show --resource-group $MY_RESOURCE_GROUP_NAME --name $MY_CLUSTER_NAME --query oidcIssuerProfile.issuerUrl -o tsv)
    
  4. Weisen Sie die AcrPull-Rolle für die Kubelet-Identität mit dem Befehl az role assignment create zu.

    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
    

Hochladen von Percona-Images in Azure Container Registry

In diesem Abschnitt laden Sie die Percona-Images von Docker Hub herunter und laden sie in Azure Container Registry hoch. Dieser Schritt stellt sicher, dass das Bild in Ihrer privaten Registrierung verfügbar ist und in Ihrem AKS-Cluster verwendet werden kann. Es wird nicht empfohlen, das öffentliche Image in einer Produktionsumgebung zu verwenden.

  • Importieren Sie die Percona-Images aus Docker Hub, und laden Sie sie mithilfe der folgenden az acr import-Befehle in Azure Container Registry hoch:

    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
    

Bereitstellen der Infrastruktur mit Terraform

Um die Infrastruktur mithilfe von Terraform bereitzustellen, verwenden wir das Azure Verified-Modul für AKS. Das Repository terraform-azurerm-avm-res-containerservice-managedcluster enthält ein vollständiges Beispiel mit der Infrastruktur, die zum Ausführen eines MongoDB-Clusters auf Azure Kubernetes Service (AKS) erforderlich ist.

Hinweis

Wenn Sie dies in der Produktion ausführen möchten, empfehlen wir, das AKS-Produktionsmustermodul für Azure Verified Modules zu betrachten. Dies ist mit Empfehlungen für bewährte Methoden verbunden.

  1. Klonen Sie das Git-Repository mit dem Terraform-Modul:

    git clone https://github.com/Azure/terraform-azurerm-avm-res-containerservice-managedcluster.git
    cd examples/stateful-workloads
    
  2. Erstellen Sie eine mongodb.tfvars Datei zum Definieren von Variablen mithilfe des folgenden Befehls:

    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"
      }
    }
    EOL
    
  3. Führen Sie die folgenden Terraform-Befehle aus, um die Infrastruktur bereitzustellen:

    terraform init
    terraform fmt
    terraform apply -var-file="mongodb.tfvars"
    
  4. Führen Sie den folgenden Befehl aus, um die Terraform-Ausgabewerte als Umgebungsvariablen im Terminal zu exportieren, um sie in den nächsten Schritten zu verwenden:

    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)
    

Hinweis

In AKS beträgt die Keepalive-Zeit (die Dauer der Inaktivität, nach der die erste Keepalive-Probe gesendet wird) standardmäßig 7.200 Sekunden oder 2 Stunden. Bei MongoDB erhalten Sie in der Regel bessere Ergebnisse mit einem kürzeren Keepalive-Wert in der Reihenfolge von 120 Sekunden oder 2 Minuten.

Herstellen einer Verbindung mit dem AKS-Cluster

  • Konfigurieren Sie kubectl, um mithilfe des Befehls az aks get-credentials eine Verbindung mit Ihrem AKS-Cluster herzustellen.

    az aks get-credentials --resource-group $MY_RESOURCE_GROUP_NAME --name $MY_CLUSTER_NAME --overwrite-existing --output table
    

Nächster Schritt