Compartir a través de


Implementación de una aplicación cliente para conectarse a un clúster de MongoDB en Azure Kubernetes Service (AKS)

Después de implementar el clúster de MongoDB en AKS, puede implementar una aplicación cliente de ejemplo para interactuar con MongoDB. Este tutorial se basa en la implementación del clúster de MongoDB tratado en guías anteriores.

Conexión al shell de MongoDB

En esta sección, se conectará al shell de MongoDB. Una vez que esté conectado, cree una base de datos y una recopilación, inserte datos y ejecute consultas.

  1. Cree un pod denominado percona-client en el espacio de nombres ${AKS_MONGODB_NAMESPACE} del clúster mediante el comando kubectl run. Asegúrese de pasar la variable de entorno correcta $connectionString exportada desde el paso 3 del tutorial anterior.

    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 
    
  2. Conexión al shell de MongoDB mediante el comando siguiente.

    mongosh $CONN_STR
    
  3. En el shell de MongoDB, cree la base de datos y la colección mediante el siguiente script:

    // Connect to MongoDB
    use employeeDB;
    
    // Create the employees collection and insert 200 records
    for (let i = 1; i <= 200; i++) {
        db.employees.insertOne({
            Id: i,
            EmployeeId: `E${1000 + i}`,
            FirstName: `FirstName${i}`,
            LastName: `LastName${i}`,
            Department: `Department${(i % 10) + 1}`
        });
    }
    
  4. En el shell de MongoDB, puede realizar varias consultas en la colección employees. Los comandos siguientes muestran algunas consultas de ejemplo que puede ejecutar:

    # Find all employees
    db.employees.find().pretty();
    
    # Find an employee by EmployeeId
    db.employees.find({ EmployeeId: "E1001" }).pretty();
    
    # Find employees in a specific department
    db.employees.find({ Department: "Department1" }).pretty();
    
    # Count the number of employees in a specific department
    db.employees.countDocuments({ Department: "Department1" });
    
    # Count the total number of records in the employee collection
    db.employees.countDocuments();
    

Creación y actualización de secretos

Para implementar la aplicación cliente mongo-express, primero debe crear secretos específicos de mongo-express en Azure Key Vault y actualizar el almacén de secretos que creó en el tutorial anterior.

  1. Genere una contraseña aleatoria mediante la función :

    #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
    }
    
  1. Cree un nombre de usuario de autenticación básica y un mongo-express secreto de contraseña que se usarán para iniciar sesión en la aplicación cliente mediante los az keyvault secret set comandos:

    az keyvault secret set --vault-name $MY_KEYVAULT_NAME --name MONGOEXPRESS-CONFIG-BASICAUTH-USERNAME --value MONGOEXPRESSADMINUSER  --output none
    az keyvault secret set --vault-name $MY_KEYVAULT_NAME --name MONGOEXPRESS-CONFIG-BASICAUTH-PASSWORD --value $(generateRandomPasswordString) --output none   
    
  2. Cree un secreto para los detalles del servidor de configuración de mongo-express mediante el comando az keyvault secret set.

    az keyvault secret set --vault-name $MY_KEYVAULT_NAME --name MONGODB-CONFIG-SERVER --value ${MY_CLUSTER_NAME}-${AKS_MONGODB_NAMESPACE}-mongos.mongodb.svc.cluster.local --output none
    
  1. Ejecute el siguiente comando para actualizar el mongodb.tfvars archivo creado anteriormente con la siguiente configuración:

    sed -i '/mongodb_kv_secrets = {/,/^ *}/s/^ *}/  MONGOEXPRESS-CONFIG-BASICAUTH-USERNAME = "'"$(generateRandomPasswordString)"'"\
    MONGOEXPRESS-CONFIG-BASICAUTH-PASSWORD = "'"$(generateRandomPasswordString)"'"\
    MONGODB-CONFIG-SERVER = "'"$MY_CLUSTER_NAME-$AKS_MONGODB_NAMESPACE-mongos.mongodb.svc.cluster.local"'"\
    }/' mongodb.tfvars
    
  2. Aplique la configuración de Terraform al recurso de destino.

    terraform fmt
    terraform apply -var-file="mongodb.tfvars" -target module.mongodb[0].azurerm_key_vault_secret.this
    
  1. Actualice los secretos del almacén de secretos que creó en el tutorial anterior mediante el comando kubectl apply.

    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 KV (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
        - secretKey: MONGOEXPRESS_CONFIG_BASICAUTH_USERNAME
          remoteRef:
            key: MONGOEXPRESS-CONFIG-BASICAUTH-USERNAME
        - secretKey: MONGOEXPRESS_CONFIG_BASICAUTH_PASSWORD
          remoteRef:
            key: MONGOEXPRESS-CONFIG-BASICAUTH-PASSWORD
        - secretKey: MONGODB_CONFIG_SERVER
          remoteRef:
            key: MONGODB-CONFIG-SERVER
    EOF
    

    Ejemplo:

    externalsecret.external-secrets.io/cluster-aks-mongodb-secrets configured
    

Implementación de Mongo Express

La aplicación cliente de ejemplo usa mongo-express, una interfaz de administración de MongoDB basada en web creada con Node.js, Express y Bootstrap 5 para realizar operaciones CRUD.

  • Aplique el siguiente manifiesto YAML mediante el comando kubectl apply:

    kubectl apply -f -<<EOF
    apiVersion: v1
    kind: Service
    metadata:
      name: mongo-express
      namespace: ${AKS_MONGODB_NAMESPACE}
    spec:
      type: LoadBalancer
      ports:
        - port: 8081  # Service port for HTTP access
          targetPort: 8081  # Container port for Mongo Express
      selector:
        app: mongo-express
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: mongo-express
      namespace: ${AKS_MONGODB_NAMESPACE}
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: mongo-express
      template:
        metadata:
          labels:
            app: mongo-express
        spec:
          containers:
            - name: mongo-express
              image: mongo-express
              ports:
                - containerPort: 8081
              env:
                - name: ME_CONFIG_MONGODB_SERVER
                  valueFrom:
                    secretKeyRef:
                      name: ${AKS_MONGODB_SECRETS_NAME}
                      key: MONGODB_CONFIG_SERVER        
                - name: ME_CONFIG_BASICAUTH_USERNAME
                  valueFrom:
                    secretKeyRef:
                      name: ${AKS_MONGODB_SECRETS_NAME}
                      key: MONGOEXPRESS_CONFIG_BASICAUTH_USERNAME 
                - name: ME_CONFIG_BASICAUTH_PASSWORD
                  valueFrom:
                    secretKeyRef:
                      name: ${AKS_MONGODB_SECRETS_NAME}
                      key: MONGOEXPRESS_CONFIG_BASICAUTH_PASSWORD
                - name: ME_CONFIG_MONGODB_PORT
                  value: "27017"
                - name: ME_CONFIG_MONGODB_ADMINUSERNAME
                  valueFrom:
                    secretKeyRef:
                      name: ${AKS_MONGODB_SECRETS_NAME}
                      key: MONGODB_DATABASE_ADMIN_USER
                - name: ME_CONFIG_MONGODB_ADMINPASSWORD
                  valueFrom:
                    secretKeyRef:
                      name: ${AKS_MONGODB_SECRETS_NAME}
                      key: MONGODB_DATABASE_ADMIN_PASSWORD
    EOF
    

    Ejemplo:

    service/mongo-express created
    deployment.apps/mongo-express created
    

Prueba de la aplicación

Cuando se ejecuta la aplicación, un servicio de Kubernetes expone la aplicación a Internet. Este proceso podría tardar algún tiempo en completarse.

  1. Espere a que el servicio mongo-express implemente y recupere el EXTERNAL-IP mediante el siguiente script.

    while true; do
    IP=$(kubectl get service mongo-express -n ${AKS_MONGODB_NAMESPACE} -o jsonpath='{.status.loadBalancer.ingress[0].ip}')
    if [[ -n $IP ]]; then
      kubectl get service mongo-express -n ${AKS_MONGODB_NAMESPACE}
      break
    else
      echo "Waiting for LoadBalancer IP..."
      sleep 5
    fi
    done
    

    Cuando se asigna el EXTERNAL-IP, verá una dirección IP pública válida para el servicio, como se muestra en la salida del ejemplo siguiente:

        NAME            TYPE           CLUSTER-IP     EXTERNAL-IP    PORT(S)          AGE
        mongo-express   LoadBalancer   10.0.150.235   x.xxx.xx.xxx   8081:30908/TCP   86s
    
  2. Abra el explorador web y vaya a http://<EXTERNAL-IP>:8081.

  3. Cuando se le solicite, escriba el username y password establecido en la configuración de implementación. Si necesita recuperar el nombre de usuario y la contraseña, puede hacerlo mediante los siguientes comandos:

      export Username=$(kubectl get secret ${AKS_MONGODB_SECRETS_NAME} -n ${AKS_MONGODB_NAMESPACE} -o jsonpath="{.data.MONGOEXPRESS_CONFIG_BASICAUTH_USERNAME}" | base64 --decode) 
      export Password=$(kubectl get secret ${AKS_MONGODB_SECRETS_NAME} -n ${AKS_MONGODB_NAMESPACE} -o jsonpath="{.data.MONGOEXPRESS_CONFIG_BASICAUTH_PASSWORD}" | base64 --decode)
    

    Captura de pantalla de una aplicación de ejemplo de mongo-express.

Paso siguiente