Menyebarkan aplikasi klien untuk terhubung ke kluster MongoDB di Azure Kubernetes Service (AKS)

Setelah menyebarkan kluster MongoDB di AKS, Anda dapat menyebarkan aplikasi klien sampel untuk berinteraksi dengan MongoDB. Tutorial ini dibangun berdasarkan penyebaran kluster MongoDB yang tercakup dalam panduan sebelumnya.

Menghubungkan ke shell MongoDB

Di bagian ini, Anda tersambung ke shell MongoDB. Setelah tersambung, Anda membuat database dan pengumpulan, menyisipkan data, dan menjalankan kueri.

  1. Buat pod bernama percona-client di ${AKS_MONGODB_NAMESPACE} namespace di kluster Anda menggunakan kubectl run perintah . Pastikan Anda menggunakan variabel lingkungan yang benar $connectionString yang diekspor dari langkah 3 tutorial sebelumnya.

    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. Sambungkan ke shell MongoDB menggunakan perintah berikut.

    mongosh $CONN_STR
    
  3. Di shell MongoDB, buat database dan koleksi menggunakan skrip berikut:

    // 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. Di shell MongoDB, Anda dapat melakukan berbagai kueri pada employees koleksi. Perintah berikut ini memperlihatkan beberapa contoh kueri yang bisa Anda jalankan:

    # 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();
    

Membuat dan memperbarui rahasia

Untuk menyebarkan mongo-express aplikasi klien, Anda harus terlebih dahulu membuat rahasia khusus di mongo-express Azure Key Vault dan memperbarui penyimpanan rahasia yang Anda buat di tutorial sebelumnya.

  1. Buat kata sandi acak menggunakan fungsi :

    #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. Buat mongo-express nama pengguna dasar-autentikasi dan rahasia kata sandi untuk digunakan untuk masuk ke aplikasi klien menggunakan az keyvault secret set perintah:

    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. Buat rahasia untuk detail server konfigurasi mongo-express menggunakan perintah 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. Jalankan perintah berikut untuk memperbarui file yang mongodb.tfvars dibuat sebelumnya dengan konfigurasi berikut:

    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. Terapkan konfigurasi terraform ke sumber daya target.

    terraform fmt
    terraform apply -var-file="mongodb.tfvars" -target module.mongodb[0].azurerm_key_vault_secret.this
    
  1. Perbarui rahasia di penyimpanan rahasia yang Anda buat di tutorial sebelumnya menggunakan kubectl apply perintah .

    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
    

    Contoh output:

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

Mengimplementasikan Mongo Express

Aplikasi klien sampel menggunakan mongo-express, antarmuka admin MongoDB berbasis web yang dibangun dengan Node.js, Express, dan Bootstrap 5 untuk melakukan operasi CRUD.

  • Terapkan manifes YAML berikut menggunakan kubectl apply perintah :

    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
    

    Contoh output:

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

Uji aplikasi

Ketika aplikasi berjalan, layanan Kubernetes mengekspos aplikasi ke internet. Proses ini mungkin perlu waktu untuk diselesaikan.

  1. Tunggu hingga layanan mongo-express selesai diterapkan, lalu ambil EXTERNAL-IP menggunakan skrip berikut ini.

    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
    

    Ketika EXTERNAL-IP ditetapkan, Anda akan melihat alamat IP publik yang valid untuk layanan, seperti yang ditunjukkan dalam output contoh berikut:

        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. Buka browser web Anda dan navigasi ke http://<EXTERNAL-IP>:8081.

  3. Saat diminta, masukkan username dan password yang ditetapkan dalam konfigurasi penyebaran. Jika Anda perlu mengambil nama pengguna dan kata sandi, Anda dapat melakukannya menggunakan perintah berikut:

      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)
    

    Cuplikan layar aplikasi sampel mongo-express.

Langkah selanjutnya