Compartilhar via


Configurar e implantar um cluster do MongoDB no AKS (Serviço de Kubernetes do Azure)

Neste artigo, você configurará e implantará um cluster do MongoDB no AKS (Serviço de Kubernetes do Azure).

Configurar uma identidade de carga de trabalho

  1. Crie um namespace para o cluster do MongoDB usando o comando kubectl create namespace.

    kubectl create namespace ${AKS_MONGODB_NAMESPACE} --dry-run=client --output yaml | kubectl apply -f -
    

    Exemplo de saída:

    namespace/mongodb created
    
  2. Crie uma conta de serviço e configure uma identidade de carga de trabalho usando o comando kubectl apply.

    export TENANT_ID=$(az account show --query tenantId -o tsv)
    cat <<EOF | kubectl apply -f -
    apiVersion: v1
    kind: ServiceAccount
    metadata:
      annotations:
        azure.workload.identity/client-id: "${MY_IDENTITY_NAME_CLIENT_ID}"
        azure.workload.identity/tenant-id: "${TENANT_ID}"
      name: "${SERVICE_ACCOUNT_NAME}"
      namespace: "${AKS_MONGODB_NAMESPACE}"
    EOF
    

    Exemplo de saída:

    serviceaccount/mongodb created
    

Instalar o Operador de Segredos Externos

Nesta seção, você usará o Helm para instalar o Operador de Segredos Externos. O Operador de Segredos Externos é um operador do Kubernetes que gerencia o ciclo de vida de segredos externos armazenados em repositórios de segredos externos, como o Azure Key Vault.

  1. Adicione o repositório Helm de Segredos Externos e atualize o repositório usando os comandos helm repo add e helm repo update.

    helm repo add external-secrets https://charts.external-secrets.io
    helm repo update
    

    Exemplo de saída:

    Hang tight while we grab the latest from your chart repositories...
    ...Successfully got an update from the "external-secrets" chart repository
    
  2. Instale o Operador de Segredos Externos usando o comando helm install.

    helm install external-secrets \
    external-secrets/external-secrets \
    --namespace ${AKS_MONGODB_NAMESPACE} \
    --create-namespace \
    --set installCRDs=true \
    --wait \
    --set nodeSelector."kubernetes\.azure\.com/agentpool"=mongodbpool
    

    Exemplo de saída:

    NAME: external-secrets
    LAST DEPLOYED: Tue Jun 11 11:55:32 2024
    NAMESPACE: mongodb
    STATUS: deployed
    REVISION: 1
    TEST SUITE: None
    NOTES:
    external-secrets has been deployed successfully in namespace mongodb!
    
    In order to begin using ExternalSecrets, you will need to set up a SecretStore
    or ClusterSecretStore resource (for example, by creating a 'vault' SecretStore).
    
    More information on the different types of SecretStores and how to configure them
    can be found in our Github: https://github.com/external-secrets/external-secrets
    
  3. Gere uma senha aleatória usando a função:

    #MongoDB connection strings can contain special characters in the password, which need to be URL encoded. 
    #This is because the connection string is a URI, and special characters can interfere with the URI structure.
    #This function generates secrets of 32 characters using only alphanumeric characters.
    
    generateRandomPasswordString() {
        cat /dev/urandom | LC_ALL=C tr -dc 'a-zA-Z0-9' | fold -w 32 | head -n 1
    }
    

Criar segredos do MongoDB

  1. Crie um segredo de usuário e senha de backup do MongoDB para usar em qualquer operação de backup e restauração usando o comando az keyvault secret set.

    az keyvault secret set --vault-name $MY_KEYVAULT_NAME --name MONGODB-BACKUP-USER --value MONGODB_BACKUP_USER --output none
    az keyvault secret set --vault-name $MY_KEYVAULT_NAME --name MONGODB-BACKUP-PASSWORD --value $(generateRandomPasswordString) --output none
    
  2. Crie um segredo de usuário administrador de banco de dados e senha do MongoDB para administração de banco de dados usando o comando az keyvault secret set.

    az keyvault secret set --vault-name $MY_KEYVAULT_NAME --name MONGODB-DATABASE-ADMIN-USER --value MONGODB_DATABASE_ADMIN_USER --output none
    az keyvault secret set --vault-name $MY_KEYVAULT_NAME --name MONGODB-DATABASE-ADMIN-PASSWORD --value $(generateRandomPasswordString) --output none
    
  3. Crie um segredo de usuário administrador e administrador do cluster do MongoDB para uma função de administração de cluster que forneça administração para mais de um banco de dados usando o comando az keyvault secret set.

    az keyvault secret set --vault-name $MY_KEYVAULT_NAME --name MONGODB-CLUSTER-ADMIN-USER --value MONGODB_CLUSTER_ADMIN_USER --output none
    az keyvault secret set --vault-name $MY_KEYVAULT_NAME --name MONGODB-CLUSTER-ADMIN-PASSWORD --value $(generateRandomPasswordString) --output none
    
  4. Crie um segredo de usuário de monitoramento e administrador do cluster do MongoDB para monitoramento do cluster usando o comando az keyvault secret set.

    az keyvault secret set --vault-name $MY_KEYVAULT_NAME --name MONGODB-CLUSTER-MONITOR-USER --value MONGODB_CLUSTER_MONITOR_USER --output none
    az keyvault secret set --vault-name $MY_KEYVAULT_NAME --name MONGODB-CLUSTER-MONITOR-PASSWORD --value $(generateRandomPasswordString) --output none
    
  5. Crie um segredo de usuário e senha para administração de usuários usando o comando az keyvault secret set.

    az keyvault secret set --vault-name $MY_KEYVAULT_NAME --name MONGODB-USER-ADMIN-USER --value MONGODB_USER_ADMIN_USER --output none
    az keyvault secret set --vault-name $MY_KEYVAULT_NAME --name MONGODB-USER-ADMIN-PASSWORD --value $(generateRandomPasswordString) --output none
    
  6. Crie um segredo para a chave de API usada para acessar o servidor Gerenciamento e Monitoramento do Percona (PMM) usando o comando az keyvault secret set. Você atualizará o valor desse segredo posteriormente ao implantar o servidor PMM.

    az keyvault secret set --vault-name $MY_KEYVAULT_NAME --name PMM-SERVER-API-KEY --value $(openssl rand -base64 32) --output none
    
  7. Adicione AZURE-STORAGE-ACCOUNT-NAME para usar posteriormente em backups usando o comando az keyvault secret set.

    az keyvault secret set --vault-name $MY_KEYVAULT_NAME --name AZURE-STORAGE-ACCOUNT-NAME --value $AKS_MONGODB_BACKUP_STORAGE_ACCOUNT_NAME --output none
    
  1. Execute o seguinte comando para atualizar o mongodb.tfvars arquivo criado anteriormente com a seguinte configuração:

    cat >> mongodb.tfvars <<EOL
    mongodb_kv_secrets = {
      MONGODB-BACKUP-USER              = "MONGODB_BACKUP_USER"
      MONGODB-BACKUP-PASSWORD          = "$(generateRandomPasswordString)"
      MONGODB-DATABASE-ADMIN-USER      = "MONGODB_DATABASE_ADMIN_USER"
      MONGODB-DATABASE-ADMIN-PASSWORD  = "$(generateRandomPasswordString)"
      MONGODB-CLUSTER-ADMIN-USER       = "MONGODB_CLUSTER_ADMIN_USER"
      MONGODB-CLUSTER-ADMIN-PASSWORD   = "$(generateRandomPasswordString)"
      MONGODB-CLUSTER-MONITOR-USER     = "MONGODB_CLUSTER_MONITOR_USER"
      MONGODB-CLUSTER-MONITOR-PASSWORD = "$(generateRandomPasswordString)"
      MONGODB-USER-ADMIN-USER          = "MONGODB_USER_ADMIN_USER"
      MONGODB-USER-ADMIN-PASSWORD      = "$(generateRandomPasswordString)"
      PMM-SERVER-API-KEY               = "$(generateRandomPasswordString)"
    }
    EOL
    
  2. Aplique a configuração do Terraform ao recurso de destino.

    terraform fmt
    terraform apply -var-file="mongodb.tfvars" -target module.mongodb[0].azurerm_key_vault_secret.this
    

Criar recursos de segredos

  1. Crie um recurso SecretStore para acessar as senhas do MongoDB armazenadas no seu cofre de chaves usando o comando kubectl apply.

    kubectl apply -f - <<EOF
    apiVersion: external-secrets.io/v1beta1
    kind: SecretStore
    metadata:
      name: azure-store
      namespace: ${AKS_MONGODB_NAMESPACE}
    spec:
      provider:
        # provider type: azure keyvault
        azurekv:
          authType: WorkloadIdentity
          vaultUrl: "${KEYVAULTURL}"
          serviceAccountRef:
            name: ${SERVICE_ACCOUNT_NAME}
    EOF
    

    Exemplo de saída:

    secretstore.external-secrets.io/azure-store created
    
  2. Crie um recurso ExternalSecret usando o comando kubectl apply. Esse recurso cria um segredo do Kubernetes no namespace mongodb com os segredos do MongoDB armazenados em seu cofre de chaves.

    kubectl apply -f - <<EOF
    apiVersion: external-secrets.io/v1beta1
    kind: ExternalSecret
    metadata:
      name: ${AKS_MONGODB_SECRETS_NAME}
      namespace: ${AKS_MONGODB_NAMESPACE}
    spec:
      refreshInterval: 1h
      secretStoreRef:
        kind: SecretStore
        name: azure-store
    
      target:
        name: "${AKS_MONGODB_SECRETS_NAME}"
        creationPolicy: Owner
    
      data:
        # name of the SECRET in the Azure key vault (no prefix is by default a SECRET)
        - secretKey: MONGODB_BACKUP_USER
          remoteRef:
            key: MONGODB-BACKUP-USER
        - secretKey: MONGODB_BACKUP_PASSWORD
          remoteRef:
            key: MONGODB-BACKUP-PASSWORD
        - secretKey: MONGODB_DATABASE_ADMIN_USER
          remoteRef:
            key: MONGODB-DATABASE-ADMIN-USER
        - secretKey: MONGODB_DATABASE_ADMIN_PASSWORD
          remoteRef:
            key: MONGODB-DATABASE-ADMIN-PASSWORD
        - secretKey: MONGODB_CLUSTER_ADMIN_USER
          remoteRef:
            key: MONGODB-CLUSTER-ADMIN-USER
        - secretKey: MONGODB_CLUSTER_ADMIN_PASSWORD
          remoteRef:
            key: MONGODB-CLUSTER-ADMIN-PASSWORD
        - secretKey: MONGODB_CLUSTER_MONITOR_USER
          remoteRef:
            key: MONGODB-CLUSTER-MONITOR-USER
        - secretKey: MONGODB_CLUSTER_MONITOR_PASSWORD
          remoteRef:
            key: MONGODB-CLUSTER-MONITOR-PASSWORD
        - secretKey: MONGODB_USER_ADMIN_USER
          remoteRef:
            key: MONGODB-USER-ADMIN-USER
        - secretKey: MONGODB_USER_ADMIN_PASSWORD
          remoteRef:
            key: MONGODB-USER-ADMIN-PASSWORD
        - secretKey: PMM_SERVER_API_KEY
          remoteRef:
            key: PMM-SERVER-API-KEY
    EOF
    

    Exemplo de saída:

    externalsecret.external-secrets.io/cluster-aks-mongodb-secrets created
    
  3. Crie um recurso ExternalSecret usando o comando kubectl apply. Esse recurso cria um segredo do Kubernetes no namespace mongodb para segredos do Armazenamento de Blobs do Azure, armazenados na cofre de chaves.

    kubectl apply -f - <<EOF
    apiVersion: external-secrets.io/v1beta1
    kind: ExternalSecret
    metadata:
      name: ${AKS_AZURE_SECRETS_NAME}
      namespace: ${AKS_MONGODB_NAMESPACE}
    spec:
      refreshInterval: 1h
      secretStoreRef:
        kind: SecretStore
        name: azure-store
    
      target:
        name: "${AKS_AZURE_SECRETS_NAME}"
        creationPolicy: Owner
    
      data:
        # name of the SECRET in the Azure key vault (no prefix is by default a SECRET)
        - secretKey: AZURE_STORAGE_ACCOUNT_NAME
          remoteRef:
            key: AZURE-STORAGE-ACCOUNT-NAME
        - secretKey: AZURE_STORAGE_ACCOUNT_KEY
          remoteRef:
            key: AZURE-STORAGE-ACCOUNT-KEY
    EOF
    

    Exemplo de saída:

    externalsecret.external-secrets.io/cluster-aks-azure-secrets created
    
  1. Crie uma credencial federada usando o comando az identity federated-credential create.

    az identity federated-credential create \
                --name external-secret-operator \
                --identity-name ${MY_IDENTITY_NAME} \
                --resource-group ${MY_RESOURCE_GROUP_NAME} \
                --issuer ${OIDC_URL} \
                --subject system:serviceaccount:${AKS_MONGODB_NAMESPACE}:${SERVICE_ACCOUNT_NAME} \
                --output none
    
  2. Conceda permissão à identidade atribuída pelo usuário para acessar o segredo usando o comando az keyvault set-policy.

    az keyvault set-policy --name $MY_KEYVAULT_NAME --object-id $MY_IDENTITY_NAME_PRINCIPAL_ID --secret-permissions get --output table
    

    Exemplo de saída:

    Location       Name            ResourceGroup
    -------------  --------------  --------------------------------
    australiaeast  vault-cjcfc-kv  myResourceGroup-rg-australiaeast
    
  1. Adicione a seguinte configuração do Terraform em mongodb/main.tf para criar uma credencial federada.

    ## Section to create the federated identity credential for external secret operator
    resource "azurerm_federated_identity_credential" "this" {
      name                = "external-secret-operator"
      resource_group_name = var.resource_group_name
      audience            = ["api://AzureADTokenExchange"]
      issuer              = var.oidc_issuer_url
      parent_id           = azurerm_user_assigned_identity.this.id
      subject             = "system:serviceaccount:${var.mongodb_namespace}:${var.service_account_name}"
    }
    
  2. Adicione a seguinte configuração do terraform em mongodb/main.tf para conceder permissão à identidade atribuída pelo usuário para acessar o segredo.

    ## Section to assign permission to the user-assigned identity to access the secret
    resource "azurerm_key_vault_access_policy" "this" {
      key_vault_id = var.key_vault_id
      tenant_id    = azurerm_user_assigned_identity.this.tenant_id
      object_id    = azurerm_user_assigned_identity.this.principal_id
    
      secret_permissions = [
        "Get"
      ]
    }
    
  3. Aplique a configuração do Terraform.

        terraform fmt
    
        terraform apply -var-file="mongodb.tfvars" \
       -target=module.mongodb[0].azurerm_federated_identity_credential.this \
       -target=module.mongodb[0].azurerm_key_vault_access_policy.this
    

Instalar o Percona Operator e os CRDs

O Percona Operator normalmente é distribuído como um Deployment ou Operator do Kubernetes. Você pode implantá-lo usando um comando kubectl apply -f com um arquivo de manifesto. Você pode encontrar os manifestos mais recentes no repositório GitHub do Percona ou na documentação oficial.

  • Implante o Operador Percona e as definições de recurso personalizadas (CRDs) usando o comando kubectl apply.

    kubectl apply --server-side -f https://raw.githubusercontent.com/percona/percona-server-mongodb-operator/v1.16.0/deploy/bundle.yaml -n "${AKS_MONGODB_NAMESPACE}"
    

    Exemplo de saída:

    customresourcedefinition.apiextensions.k8s.io/perconaservermongodbbackups.psmdb.percona.com serverside-applied
    customresourcedefinition.apiextensions.k8s.io/perconaservermongodbrestores.psmdb.percona.com serverside-applied
    customresourcedefinition.apiextensions.k8s.io/perconaservermongodbs.psmdb.percona.com serverside-applied
    role.rbac.authorization.k8s.io/percona-server-mongodb-operator serverside-applied
    serviceaccount/percona-server-mongodb-operator serverside-applied
    rolebinding.rbac.authorization.k8s.io/service-account-percona-server-mongodb-operator serverside-applied
    deployment.apps/percona-server-mongodb-operator serverside-applied
    

Implantar o cluster do MongoDB

  1. Implante um cluster do MongoDB com o Operador Percona usando o comando kubectl apply. Para ajudar a garantir alta disponibilidade, implante o cluster do MongoDB com um conjunto de réplicas, com fragmentação habilitada, em várias zonas de disponibilidade e com uma solução de backup que armazene os backups em uma conta de Armazenamento de Blobs do Azure.

    kubectl apply -f - <<EOF
    apiVersion: psmdb.percona.com/v1
    kind: PerconaServerMongoDB
    metadata:
      name: ${AKS_MONGODB_CLUSTER_NAME}
      namespace: ${AKS_MONGODB_NAMESPACE}
      finalizers:
        - delete-psmdb-pods-in-order
    spec:
      crVersion: 1.16.0
      image: ${MY_ACR_REGISTRY}.azurecr.io/percona-server-mongodb:7.0.8-5
      imagePullPolicy: Always
      updateStrategy: SmartUpdate
      upgradeOptions:
        versionServiceEndpoint: https://check.percona.com
        apply: disabled
        schedule: "0 2 * * *"
        setFCV: false
      secrets:
        users: "${AKS_MONGODB_SECRETS_NAME}"
        encryptionKey: "${AKS_MONGODB_SECRETS_ENCRYPTION_KEY}"
      pmm:
        enabled: true
        image: ${MY_ACR_REGISTRY}.azurecr.io/pmm-client:2.41.2
        serverHost: monitoring-service
      replsets:
        - name: rs0
          size: 3
          affinity:
            antiAffinityTopologyKey: "failure-domain.beta.kubernetes.io/zone"
          nodeSelector:
            kubernetes.azure.com/agentpool: "mongodbpool"
          podDisruptionBudget:
            maxUnavailable: 1
          expose:
            enabled: false
            exposeType: ClusterIP
          resources:
            limits:
              cpu: "300m"
              memory: "0.5G"
            requests:
              cpu: "300m"
              memory: "0.5G"
          volumeSpec:
            persistentVolumeClaim:
              storageClassName: managed-csi-premium
              accessModes: ["ReadWriteOnce"]
              resources:
                requests:
                  storage: 1Gi
          nonvoting:
            enabled: false
            size: 3
            affinity:
              antiAffinityTopologyKey: "failure-domain.beta.kubernetes.io/zone"
            nodeSelector:
              kubernetes.azure.com/agentpool: "mongodbpool"		 
            podDisruptionBudget:
              maxUnavailable: 1
            resources:
              limits:
                cpu: "300m"
                memory: "0.5G"
              requests:
                cpu: "300m"
                memory: "0.5G"
            volumeSpec:
              persistentVolumeClaim:
                storageClassName: managed-csi-premium
                accessModes: ["ReadWriteOnce"]
                resources:
                  requests:
                    storage: 1Gi
          arbiter:
            enabled: false
            size: 1
            affinity:
              antiAffinityTopologyKey: "failure-domain.beta.kubernetes.io/zone"
            nodeSelector:
              kubernetes.azure.com/agentpool: "mongodbpool"
            resources:
              limits:
                cpu: "300m"
                memory: "0.5G"
              requests:
                cpu: "300m"
                memory: "0.5G"
      sharding:
        enabled: true
        configsvrReplSet:
          size: 3
          affinity:
            antiAffinityTopologyKey: "failure-domain.beta.kubernetes.io/zone"
          nodeSelector:
            kubernetes.azure.com/agentpool: "mongodbpool"
          podDisruptionBudget:
            maxUnavailable: 1
          expose:
            enabled: false
          resources:
            limits:
              cpu: "300m"
              memory: "0.5G"
            requests:
              cpu: "300m"
              memory: "0.5G"
          volumeSpec:
            persistentVolumeClaim:
              storageClassName: managed-csi-premium
              accessModes: ["ReadWriteOnce"]
              resources:
                requests:
                  storage: 1Gi
        mongos:
          size: 3
          affinity:
            antiAffinityTopologyKey: "failure-domain.beta.kubernetes.io/zone"
          nodeSelector:
            kubernetes.azure.com/agentpool: "mongodbpool"
          podDisruptionBudget:
            maxUnavailable: 1
          resources:
            limits:
              cpu: "300m"
              memory: "0.5G"
            requests:
              cpu: "300m"
              memory: "0.5G"
          expose:
            exposeType: ClusterIP
      backup:
        enabled: true
        image: ${MY_ACR_REGISTRY}.azurecr.io/percona-backup-mongodb:2.4.1
        storages:
          azure-blob:
            type: azure
            azure:
              container: "${AKS_MONGODB_BACKUP_STORAGE_CONTAINER_NAME}"
              prefix: psmdb
              endpointUrl: "https://${AKS_MONGODB_BACKUP_STORAGE_ACCOUNT_NAME}.blob.core.windows.net"
              credentialsSecret: "${AKS_AZURE_SECRETS_NAME}"
        pitr:
          enabled: false
          oplogOnly: false
          compressionType: gzip
          compressionLevel: 6
        tasks:
          - name: daily-azure-us-east
            enabled: true
            schedule: "0 0 * * *"
            keep: 3
            storageName: azure-blob    
            compressionType: gzip
            compressionLevel: 6
    EOF
    

    Exemplo de saída:

    perconaservermongodb.psmdb.percona.com/cluster-aks-mongodb created
    
  2. Conclua o processo de implantação do cluster do MongoDB usando o script a seguir:

    while [ "$(kubectl get psmdb -n ${AKS_MONGODB_NAMESPACE} -o jsonpath='{.items[0].status.state}')" != "ready" ]; do echo "waiting for MongoDB cluster to be ready"; sleep 10; done
    
  3. Quando o processo for concluído, o cluster mostrará o status Ready. Você pode exibir o status usando o comando kubectl get.

    kubectl get psmdb -n ${AKS_MONGODB_NAMESPACE}
    

    Exemplo de saída:

    NAME                  ENDPOINT                                               STATUS   AGE
    cluster-aks-mongodb   cluster-aks-mongodb-mongos.mongodb.svc.cluster.local   ready    3m1s
    
  4. Exiba as zonas de disponibilidade dos nós no cluster usando o comando kubectl get.

    kubectl get node -o custom-columns=Name:.metadata.name,Zone:".metadata.labels.topology\.kubernetes\.io/zone"
    

    Exemplo de saída:

    Name                                   Zone
    aks-mongodbpool-30094695-vmss000000    australiaeast-1
    aks-systempool-28994785-vmss000000     australiaeast-1
    aks-systempool-28994785-vmss000001     australiaeast-2
    aks-systempool-28994785-vmss000002     australiaeast-3
    

Conectar-se ao Percona Server

Para se conectar ao Percona Server para MongoDB, você precisa construir a cadeia de caracteres do URI de conexão do MongoDB. Ele inclui as credenciais do usuário administrador, que são armazenadas no objeto de Secrets.

  1. Liste os objetos Secrets usando o comando kubectl get.

    kubectl get secrets -n ${AKS_MONGODB_NAMESPACE}
    

    Exemplo de saída:

    NAME                                                 TYPE                 DATA   AGE
    cluster-aks-azure-secrets                            Opaque               2      2m56s
    cluster-aks-mongodb-mongodb-keyfile                  Opaque               1      2m54s
    cluster-aks-mongodb-secrets                          Opaque               11     2m56s
    cluster-aks-mongodb-secrets-mongodb-encryption-key   Opaque               1      2m54s
    cluster-aks-mongodb-ssl                              kubernetes.io/tls    3      2m55s
    cluster-aks-mongodb-ssl-internal                     kubernetes.io/tls    3      2m54s
    external-secrets-webhook                             Opaque               4      3m49s
    internal-cluster-aks-mongodb-users                   Opaque               11     2m56s
    sh.helm.release.v1.external-secrets.v1               helm.sh/release.v1   1      3m49s
    
  2. Exiba o sumário Secrets para recuperar as credenciais do usuário administrador usando o comando kubectl get.

    kubectl describe secret ${AKS_MONGODB_SECRETS_NAME} -n ${AKS_MONGODB_NAMESPACE}
    

    Exemplo de saída:

    Name:         cluster-aks-mongodb-secrets
    Namespace:    mongodb
    Labels:       reconcile.external-secrets.io/managed=true
    Annotations:  <none>
    
    Type:  Opaque
    
    Data
    ====
    MONGODB_CLUSTER_ADMIN_USER:        12 bytes
    MONGODB_CLUSTER_MONITOR_PASSWORD:  16 bytes
    MONGODB_CLUSTER_MONITOR_USER:      14 bytes
    MONGODB_DATABASE_ADMIN_USER:       13 bytes
    MONGODB_USER_ADMIN_USER:           9 bytes
    MONGODB_BACKUP_PASSWORD:           16 bytes
    MONGODB_BACKUP_USER:               6 bytes
    MONGODB_CLUSTER_ADMIN_PASSWORD:    18 bytes
    MONGODB_DATABASE_ADMIN_PASSWORD:   18 bytes
    MONGODB_USER_ADMIN_PASSWORD:       17 bytes
    
  3. Decodificar o nome de logon codificado em Base64 e a senha e exportar a cadeia de conexão para a variável de ambiente usando os seguintes comandos:

Important

A Microsoft recomenda usar o fluxo de autenticação mais seguro disponível. O fluxo de autenticação descrito neste procedimento exige um grau muito alto de confiança no aplicativo e traz riscos que não estão presentes em outros fluxos. Você só deve usar esse fluxo quando outros fluxos mais seguros, como identidades gerenciadas, não forem viáveis.

export databaseAdmin=$(kubectl get secret ${AKS_MONGODB_SECRETS_NAME} -n ${AKS_MONGODB_NAMESPACE} -o jsonpath="{.data.MONGODB_DATABASE_ADMIN_USER}" | base64 --decode)
export databaseAdminPassword=$(kubectl get secret ${AKS_MONGODB_SECRETS_NAME} -n ${AKS_MONGODB_NAMESPACE} -o jsonpath="{.data.MONGODB_DATABASE_ADMIN_PASSWORD}" | base64 --decode)
export connectionString="mongodb://${databaseAdmin}:${databaseAdminPassword}@${AKS_MONGODB_CLUSTER_NAME}-mongos.mongodb.svc.cluster.local/admin?replicaSet=rs0&ssl=false&directConnection=true"

Verifique o cluster do MongoDB

Nesta seção, você verificará seu cluster do MongoDB executando um contêiner com um cliente do MongoDB e conectando a saída do console ao seu terminal.

  1. Crie um pod chamado percona-client no namespace ${AKS_MONGODB_NAMESPACE} em seu cluster usando o comando kubectl run.

    kubectl -n "${AKS_MONGODB_NAMESPACE}" run -i --rm --tty percona-client --image=${MY_ACR_REGISTRY}.azurecr.io/percona-server-mongodb:7.0.8-5 --restart=Never -- env CONN_STR=$connectionString bash -il
    
  2. Em uma janela de terminal diferente, verifique se o pod foi criado com sucesso usando o comando kubectl get.

    kubectl get pod percona-client -n ${AKS_MONGODB_NAMESPACE}
    

    Exemplo de saída:

    NAME             READY   STATUS    RESTARTS   AGE
    percona-client   1/1     Running   0          39s
    
  3. Conecte-se ao cluster do MongoDB usando as credenciais do usuário administrador da seção anterior na janela do terminal que você usou para criar o pod percona-client.

    mongosh $CONN_STR
    

    Exemplo de saída:

    Current Mongosh Log ID: L6mN7oP8qR9sT0uV1wX2yZ3a
    Connecting to:          mongodb://<credentials>@cluster-aks-mongodb-mongos.mongodb.svc.cluster.local/admin?replicaSet=rs0&ssl=false&directConnection=true&appName=mongosh+2.1.5
    Using MongoDB:          7.0.8-5
    Using Mongosh:          2.1.5
    
    For mongosh info see: https://docs.mongodb.com/mongodb-shell/
    ...
    
  4. Liste os bancos de dados em seu cluster usando o comando show dbs.

    show dbs
    

    Exemplo de saída:

    rs0 [direct: mongos] admin> show dbs
    admin   960.00 KiB
    config    3.45 MiB
    rs0 [direct: mongos] admin>
    

Criar um backup do MongoDB

Você pode fazer backup de seus dados no Azure usando um dos seguintes métodos:

  • Manual: faça backup manual dos dados a qualquer momento.
  • Agendado: configure backups e seus agendamentos no CRD YAML. O Operador Percona faz os backups automaticamente de acordo com o agendamento especificado.

O Operador Percona pode executar qualquer um dos seguintes tipos de backup:

  • Backup lógico: consulte o Percona Server para MongoDB para os dados do banco de dados e, em seguida, grave os dados recuperados no armazenamento de backup remoto.
  • Backup físico: copie arquivos físicos do diretório de dados dbPath do Percona Server para MongoDB para o armazenamento de backup remoto.

Os backups lógicos usam menos armazenamento, mas são mais lentos que os backups físicos.

Para armazenar backups no Armazenamento de Blobs do Azure usando o Percona, você precisará criar um segredo. Você concluiu esta etapa em um comando anterior. Para obter instruções detalhadas, siga as etapas na documentação do Percona sobre o Armazenamento de Blobs do Azure.

Configurar backups agendados

Você pode definir o agendamento do backup na seção de backup do CRD em mongodb-cr.yaml usando as diretrizes a seguir:

  • Defina a chave backup.enabled como true.
  • Garanta que a subseção backup.storages contém pelo menos um recurso de armazenamento configurado.
  • Garanta que a subseção backup.tasks habilita o agendamento de backup.

Para obter mais informações, confira Como fazer backups agendados.

Executar backups manuais

Você pode fazer um backup manual sob demanda na seção de backup do CRD em mongodb-cr.yaml usando as diretrizes a seguir:

  • Defina a chave backup.enabled como true.
  • Garanta que a subseção backup.storages contém pelo menos um recurso de armazenamento configurado.

Para obter mais informações, confira Como fazer backups sob demanda.

Implantar um backup do MongoDB

  1. Implante backup do MongoDB usando o comando kubectl apply.

    kubectl apply -f - <<EOF
    apiVersion: psmdb.percona.com/v1
    kind: PerconaServerMongoDBBackup
    metadata:
      finalizers:
      - delete-backup
      name: az-backup1
      namespace: ${AKS_MONGODB_NAMESPACE}
    spec:
      clusterName: ${AKS_MONGODB_CLUSTER_NAME}
      storageName: azure-blob
      type: logical
    EOF
    

    Exemplo de saída:

    perconaservermongodbbackup.psmdb.percona.com/az-backup1 created
    
  2. Conclua o processo de implantação do backup do MongoDB usando o script a seguir:

    while [ "$(kubectl get psmdb-backup -n ${AKS_MONGODB_NAMESPACE} -o jsonpath='{.items[0].status.state}')" != "ready" ]; do echo "waiting for the backup to be ready"; sleep 10; done
    

    Exemplo de saída:

    waiting for the backup to be ready
    
  3. Quando o processo for concluído, o backup deverá retornar o status Ready. Verifique se a implantação de backup foi bem-sucedida usando o comando kubectl get.

    kubectl get psmdb-backup -n ${AKS_MONGODB_NAMESPACE}
    

    Exemplo de saída:

    NAME         CLUSTER               STORAGE      DESTINATION                                                                       TYPE      STATUS   COMPLETED   AGE
    az-backup1   cluster-aks-mongodb   azure-blob   https://mongodbsacjcfc.blob.core.windows.net/backups/psmdb/2024-07-01T12:27:57Z   logical   ready    3h3m        3h3m
    
  4. Se houver problemas com o backup, você poderá exibir logs de contêiner backup-agent do pod apropriado usando o comando kubectl logs.

    kubectl logs pod/${AKS_MONGODB_CLUSTER_NAME}-rs0-0 -c backup-agent -n ${AKS_MONGODB_NAMESPACE}
    

Próxima etapa