Создание инфраструктуры для запуска кластера MongoDB в службе Azure Kubernetes (AKS)

В этой статье описано, как создать необходимые ресурсы инфраструктуры для запуска кластера MongoDB в службе Azure Kubernetes (AKS).

Prerequisites

Настройка переменных среды

Задайте необходимые переменные среды для использования в этом руководстве:

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

Создайте группу ресурсов

  • Создайте группу ресурсов с помощью команды az group create.

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

    Пример выходных данных:

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

Создание удостоверения для доступа к секретам в Azure Key Vault

На этом шаге вы создадите управляемое удостоверение, назначаемое пользователем, которое оператор внешних секретов использует для доступа к паролям MongoDB, хранящимся в Azure Key Vault.

  • Создайте пользовательское управляемое удостоверение с помощью команды 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)
    

Создайте экземпляр Azure Key Vault

  • Создайте экземпляр Azure Key Vault с помощью 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)
    

    Пример выходных данных:

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

создадите экземпляр реестра контейнеров Azure;

  • Создайте экземпляр реестра контейнеров Azure для хранения образов контейнеров и управления ими с помощью 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)
    

    Пример выходных данных:

    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
    

Создание учетной записи хранилища Azure

  • Создайте учетную запись хранения Azure для хранения резервных копий MongoDB с помощью 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 none
    

    Пример выходных данных:

    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
    

Создание кластера AKS

В следующих шагах вы создадите кластер AKS с идентификацией рабочей нагрузки и с включенным поставщиком OpenID Connect (OIDC). Идентификация рабочей нагрузки дает учетной записи службы "Оператор внешних секретов" разрешение на доступ к паролям MongoDB, хранящимся в вашем хранилище ключей.

  1. Создайте кластер AKS с помощью команды 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 none
    
  2. Добавьте пул узлов пользователя в кластер AKS с помощью команды az aks nodepool add. Этот пул узлов находится в том месте, где выполняются модули 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 table
    

    Пример выходных данных:

    Name        OsType    KubernetesVersion    VmSize           Count    MaxPods    ProvisioningState    Mode
    ----------  --------  -------------------  ---------------  -------  ---------  -------------------  ------
    userpool    Linux     1.28                 Standard_DS4_v2  3        30         Succeeded            User
    
  3. Получите URL-адрес издателя OIDC, который будет использоваться для конфигурации удостоверения рабочей нагрузки с помощью az aks show команды.

    export OIDC_URL=$(az aks show --resource-group $MY_RESOURCE_GROUP_NAME --name $MY_CLUSTER_NAME --query oidcIssuerProfile.issuerUrl -o tsv)
    
  4. С помощью команды AcrPull назначьте роль az role assignment create удостоверению kubelet.

    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
    

Отправка образов Percona в реестр контейнеров Azure

В этом разделе описано, как скачать образы Percona из Docker Hub и отправить их в реестр контейнеров Azure. Этот шаг гарантирует, что образ доступен в частном реестре и может использоваться в кластере AKS. Мы не рекомендуем использовать общедоступный образ в рабочей среде.

  • Импортируйте образы Percona из Docker Hub и отправьте их в реестр контейнеров Azure с помощью следующих 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
    

Развертывание инфраструктуры с помощью Terraform

Чтобы развернуть инфраструктуру с помощью Terraform, мы будем использовать проверенный модуль Azure для AKS. Репозиторий terraform-azurerm-avm-res-containerservice-managedcluster содержит полный пример инфраструктуры, необходимой для запуска кластера MongoDB в Службе Azure Kubernetes (AKS).

Примечание.

Если вы планируете использовать это в рабочей среде, рекомендуется ознакомиться с модулем производственных шаблонов AKS для проверенных модулей Azure. Это связано с рекомендациями по лучшим практикам.

  1. Клонируйте репозиторий Git с модулем terraform:

    git clone https://github.com/Azure/terraform-azurerm-avm-res-containerservice-managedcluster.git
    cd examples/stateful-workloads
    
  2. mongodb.tfvars Создайте файл для определения переменных с помощью следующей команды:

    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. Выполните следующие команды Terraform, чтобы развернуть инфраструктуру:

    terraform init
    terraform fmt
    terraform apply -var-file="mongodb.tfvars"
    
  4. Выполните следующую команду, чтобы экспортировать выходные значения Terraform в качестве переменных среды в терминале, чтобы использовать их в следующих шагах:

    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)
    

Примечание.

В AKS время поддержания активности (период бездействия, после которого отправляется первый тестовый сигнал поддержания активности) по умолчанию составляет 7200 секунд или 2 часа. Для MongoDB вы, как правило, получите лучшие результаты с более коротким значением параметра keepalive, порядка 120 секунд или 2 минут.

Подключение к кластеру AKS

  • Настройте kubectl, чтобы подключиться к кластеру AKS с помощью команды az aks get-credentials.

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

Следующий шаг