在 AKS 上部署 MongoDB 群集后,可以部署示例客户端应用程序以与 MongoDB 交互。 本教程基于前面指南中介绍的 MongoDB 群集部署。
连接到 MongoDB shell
在本部分中,你将连接到 MongoDB shell。 连接后,可以创建数据库和集合、插入数据并运行查询。
使用
percona-client命令在群集的${AKS_MONGODB_NAMESPACE}命名空间中创建名为kubectl run的 Pod。 请确保传递从$connectionString的步骤 3 导出的正确环境变量。kubectl -n "${AKS_MONGODB_NAMESPACE}" run -i --rm --tty percona-client --image=${MY_ACR_REGISTRY}.azurecr.cn/percona-server-mongodb:7.0.8-5 --restart=Never -- env CONN_STR=$connectionString使用以下命令连接到 MongoDB shell。
mongosh $CONN_STR在 MongoDB shell 中,使用以下脚本创建数据库和集合:
// 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}` }); }在 MongoDB shell 中,可以对
employees集合执行各种查询。 以下命令显示了可以运行的一些示例查询:# 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();
创建和更新机密
若要部署 mongo-express 客户端应用,首先需要在 Azure Key Vault 中创建特定于 mongo-express 的机密,并更新在上一教程中创建的机密存储库。
使用函数生成随机密码:
#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 }
mongo-express创建基本身份验证用户名和密码机密,以使用az keyvault secret set命令登录到客户端应用: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使用
mongo-express命令为az keyvault secret setConfig Server 详细信息创建机密。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
运行以下命令,使用以下配置更新
mongodb.tfvars之前创建的文件: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将 terraform 配置应用于目标资源。
terraform fmt terraform apply -var-file="mongodb.tfvars" -target module.mongodb[0].azurerm_key_vault_secret.this
使用 命令更新在
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示例输出:
externalsecret.external-secrets.io/cluster-aks-mongodb-secrets configured
部署 Mongo Express
示例客户端应用程序使用 mongo-express(一个基于 Web 的 MongoDB 管理员界面,使用 Node.js、Express 和 Bootstrap 5 构建)来执行 CRUD 操作。
使用
kubectl apply命令应用以下 YAML 清单: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示例输出:
service/mongo-express created deployment.apps/mongo-express created
测试应用程序
应用程序运行时,Kubernetes 服务将向 Internet 公开应用程序。 此过程可能需要一些时间才能完成。
使用以下脚本等待
mongo-express服务部署和检索EXTERNAL-IP。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分配
EXTERNAL-IP后,会看到服务的有效公共 IP 地址,如以下示例输出中所示:NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE mongo-express LoadBalancer 10.0.150.235 x.xxx.xx.xxx 8081:30908/TCP 86s打开 Web 浏览器并导航到
http://<EXTERNAL-IP>:8081。出现提示时,输入部署配置中设置的
username和password。 如果需要检索用户名和密码,可以使用以下命令执行此操作: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)