您可以使用Kubernetes Operator 在Kubernetes集群上部署MongoDB Search 和 Vector Search,与外部MongoDB Enterprise Edition v8.0.10 或更高版本的服务器一起运行。此过程演示如何在Kubernetes集群中部署和配置 mongot进程,以使用新的或现有的外部副本集部署。
先决条件
要部署MongoDB Search 和 Vector Search,您必须具备以下条件:
一个运行的Kubernetes集群,且本地可用
kubeconfig。Kubernetes命令行工具
kubectl,配置为与集群通信。Helm( Kubernetes的包管理器),用于安装Kubernetes Operator。
Bash v5.1 或更高版本,用于运行本教程中的命令。
运行8.0.10 或更高版本的MongoDB Enterprise Edition副本集,用于存储数据。
要学习;了解有关部署MongoDB Enterprise 的更多信息,请参阅部署和配置MongoDB数据库资源。
运行的MongoDB Cloud Manager或MongoDB Ops Manager ,用于管理MongoDB任务。
开始之前
在使用Kubernetes Operator 安装MongoDB Search 和 Vector Search 之前,您必须执行以下操作:
为MongoDB Search 和 Vector Search 配置Cloud Manager或MongoDB Ops Manager参数
登录到Cloud Manager或MongoDB Ops Manager用户界面并执行以下步骤,为MongoDB Search 和 Vector Search 配置Cloud Manager或MongoDB Ops Manager 。
修改Cloud Manager或MongoDB Ops Manager部署配置。
单击 Modify 按钮打开部署配置编辑器。
在 Process Configuration(添加特性和功能)部分下,单击 Advanced Configuration Options(权限)。
单击 Add Option 按钮,然后从下拉列表中选择 setParameter Startup Option。
添加名称和值后,单击 Add,在字段中逐个添加以下参数:
Parameter值mongotHost您的搜索主机名和端口。示例:
search-node1.example.com:27017。searchIndexManagementHostAndPort您的搜索主机名和端口。示例:
search-node1.example.com:27017。skipAuthenticationToSearchIndexManagementServerfalsesearchTLSMode您配置的 TLS模式。示例,如果
mongot进程配置为接受 TLS 连接,则为preferTLS。
为MongoDB Search 和 Vector Search 配置Cloud Manager或MongoDB Ops Manager用户
您必须创建具有 searchCoordinator角色的用户。在MongoDB 8.2 及更高版本中,searchCoordinator 是一个内置角色。您必须创建一个用户并为该用户分配角色。对于 8.2 和 8.0.10 之前或更高版本的MongoDB版本,您必须在创建用户之前手动创建角色并分配权限。选择与您运行的MongoDB版本对应的标签页,创建具有 searchCoordinator角色的用户。
To create the user and assign the user the built-in searchCoordinator role, complete the following steps by using either the Cloud Manager or Ops Manager UI or the mongosh:
要创建具有权限的 searchCoordinator 角色,然后添加具有 searchCoordinator 角色的用户,请在 Cloud Manager 或 MongoDB Ops Manager 用户界面中完成以下步骤:
添加要分配给该角色的数据库权限。
在 Privileges 部分中,单击 Add Privilege。
对于 Resource,输入数据库的
__mdb_internal_search。不要在集合字段中输入任何内容。
在 Actions 下,添加以下操作。
changeStreamcleanupStructuredEncryptionData,compactStructuredEncryptionDatacollStatsconvertToCappedcreateCollection,dropCollection,listCollections,renameCollectionSameDBcreateIndex,dropIndex,listIndexescreateSearchIndexes,dropSearchIndex,listSearchIndexes,updateSearchIndexdbHash,dbStatsfind,insert,remove,updatekillCursorsplanCacheRead
In mongosh, run the following commands:
创建自定义角色。
db.createRole({ role: "searchCoordinator", privileges: [ { resource: { db: "__mdb_internal_search", collection: "" }, actions: [ "changeStream", "cleanupStructuredEncryptionData", "collStats", "compactStructuredEncryptionData", "convertToCapped", "createCollection", "createIndex", "createSearchIndexes", "dbHash", "dbStats", "dropCollection", "dropIndex", "dropSearchIndex", "find", "insert", "killCursors", "listCollections", "listIndexes", "listSearchIndexes", "planCacheRead", "remove", "renameCollectionSameDB", "update", "updateSearchIndex" ] }, { resource: { cluster: true }, actions: [ "bypassDefaultMaxTimeMS" ] } ], roles: [ { role: "clusterMonitor", db: "admin" }, { role: "directShardOperations", db: "admin" }, { role: "readAnyDatabase", db: "admin" } ] });
设置您的环境
准备环境,以便在终端中运行本教程中的示例代码。
必填。设置环境变量。
要设立用于此过程后续步骤的环境变量,请复制以下内容,设立环境变量的值,然后加载环境变量:
1 export K8S_CTX="<your kubernetes context here>" 2 3 export MDB_NS="mongodb" 4 5 export MDB_VERSION="8.0.10" 6 7 export MDB_ADMIN_USER_PASSWORD="admin-user-password-CHANGE-ME" 8 export MDB_USER_PASSWORD="mdb-user-password-CHANGE-ME" 9 export MDB_SEARCH_SYNC_USER_PASSWORD="search-sync-user-password-CHANGE-ME" 10 11 export MDB_SEARCH_HOSTNAME="mdbs-search" 12 13 # External MongoDB replica set members - REPLACE THESE VALUES with your actual external MongoDB hosts 14 # In production, replace with your actual external MongoDB replica set members 15 export MDB_EXTERNAL_HOST_0="mdbc-rs-0.mdbc-rs-svc.${MDB_NS}.svc.cluster.local:27017" 16 export MDB_EXTERNAL_HOST_1="mdbc-rs-1.mdbc-rs-svc.${MDB_NS}.svc.cluster.local:27017" 17 export MDB_EXTERNAL_HOST_2="mdbc-rs-2.mdbc-rs-svc.${MDB_NS}.svc.cluster.local:27017" 18 19 # REPLACE with your external MongoDB keyfile secret name 20 export MDB_EXTERNAL_KEYFILE_SECRET_NAME="mdbc-rs-keyfile" 21 22 # REPLACE with the actual keyfile content from your external MongoDB replica set 23 # For testing, this will be automatically generated by the MongoDB Community resource 24 export MDB_EXTERNAL_KEYFILE_CONTENT="your-mongodb-keyfile-content-CHANGE-ME" 25 26 # REPLACE with your actual external MongoDB replica set name 27 export MDB_EXTERNAL_REPLICA_SET_NAME="mdbc-rs" 28 29 export OPERATOR_HELM_CHART="mongodb/mongodb-kubernetes" 30 export OPERATOR_ADDITIONAL_HELM_VALUES="" 31 32 export MDB_CONNECTION_STRING="mongodb://mdb-user:${MDB_USER_PASSWORD}@${MDB_EXTERNAL_HOST_0}/?replicaSet=${MDB_EXTERNAL_REPLICA_SET_NAME}"
Conditional. Add the MongoDB Helm repository.
Helm 可自动部署和管理Kubernetes上的MongoDB实例。如果您已经添加了包含用于安装Kubernetes Operator 操作符 的Helm图表的Helm存储库,请跳过此步骤。否则,请添加Helm存储库。
要添加、复制、粘贴并运行以下命令:
1 helm repo add mongodb https://mongodb.github.io/helm-charts 2 helm repo update mongodb 3 helm search repo mongodb/mongodb-kubernetes
有条件。为Kubernetes Operator 安装MongoDB控制器。
Kubernetes Operator 监视 MongoDB、MongoDBOpsManager 和 MongoDBSearch 自定义资源,并管理MongoDB部署的生命周期。如果您已经安装了MongoDB Controllers for Kubernetes Operator,请跳过此步骤。否则,请从您在上一步中添加的Helm存储库安装MongoDB Controllers for Kubernetes Operator。
要在 mongodb命名空间中安装MongoDB Controllers for Kubernetes Operator,请复制、粘贴并运行以下命令:
1 helm upgrade --install --debug --kube-context "${K8S_CTX}" \ 2 --create-namespace \ 3 --namespace="${MDB_NS}" \ 4 mongodb-kubernetes \ 5 {OPERATOR_ADDITIONAL_HELM_VALUES:+--set ${OPERATOR_ADDITIONAL_HELM_VALUES}} \ 6 "${OPERATOR_HELM_CHART}"
前面的命令会在 mongodb命名空间中安装Kubernetes Operator;如果该命名空间不存在,则会创建该命名空间。安装后, Kubernetes Operator 会监视 MongoDBSearch 自定义资源并管理MongoDB Search 和 Vector Search 部署的生命周期。
安装MongoDB Search 和 Vector Search
必需。创建并加载MongoDB用户密钥。
mongot进程需要身份验证凭证才能连接到外部MongoDB 部署,从而创建搜索索引和运行搜索查询。此步骤将创建以下Kubernetes密钥:
mdb-admin-user-password— MongoDB管理员的凭证。mdb-user-password— 经授权执行搜索查询的用户的凭证。mdbc-rs-search-sync-source-password— 专用搜索用户的凭证,由mongot进程在内部用于同步数据和管理索引。
Kubernetes Operator 将这些密钥挂载到MongoDB Pod 中。
要创建密钥,请在计划部署MongoDB Search 和 Vector Search 的命名空间中复制、粘贴并运行以下命令:
1 kubectl --context "${K8S_CTX}" --namespace "${MDB_NS}" \ 2 create secret generic mdb-admin-user-password \ 3 --from-literal=password="${MDB_ADMIN_USER_PASSWORD}" 4 5 kubectl --context "${K8S_CTX}" --namespace "${MDB_NS}" \ 6 create secret generic mdbc-rs-search-sync-source-password \ 7 --from-literal=password="${MDB_SEARCH_SYNC_USER_PASSWORD}" 8 9 kubectl --context "${K8S_CTX}" --namespace "${MDB_NS}" \ 10 create secret generic mdb-user-password \ 11 --from-literal=password="${MDB_USER_PASSWORD}"
必需。部署密钥文件密钥以用于连接到 mongod。
为了对来自外部MongoDB 的连接进行身份验证,mongot进程使用的密钥文件与外部MongoDB副本集用于副本集之间的内部身份验证的密钥文件相同。
要创建包含来自外部MongoDB 的密钥文件内容的Kubernetes密钥,请复制、粘贴并运行以下命令:
1 kubectl --context "${K8S_CTX}" --namespace "${MDB_NS}" \ 2 create secret generic "${MDB_EXTERNAL_KEYFILE_SECRET_NAME}" \ 3 --from-literal=keyfile="${MDB_EXTERNAL_KEYFILE_CONTENT}"
必需。为MongoDB Search 和 Vector Search 创建并部署资源。
您可以部署一个搜索节点实例,而无需任何负载均衡。要部署,请完成以下步骤:
创建名为
mdbs的MongoDBSearch自定义资源。此资源包含以下内容:
spec.source.external.hostAndPorts外部MongoDB副本集节点列表。
spec.source.external.keyfileSecretRef外部副本集成员使用的密钥文件密钥。
spec.source.username搜索同步用户用户名。
spec.source.passwordSecretRef搜索同步用户密码。
spec.resourceRequirements搜索容器的 CPU 和内存资源要求。
要学习;了解有关此自定义资源中设置的更多信息,请参阅MongoDB搜索和向量搜索设置。
1 kubectl apply --context "${K8S_CTX}" -n "${MDB_NS}" -f - <<EOF 2 apiVersion: mongodb.com/v1 3 kind: MongoDBSearch 4 metadata: 5 name: mdbs 6 spec: 7 source: 8 external: 9 hostAndPorts: 10 - ${MDB_EXTERNAL_HOST_0} 11 - ${MDB_EXTERNAL_HOST_1} 12 - ${MDB_EXTERNAL_HOST_2} 13 keyfileSecretRef: 14 name: ${MDB_EXTERNAL_KEYFILE_SECRET_NAME} 15 key: keyfile 16 username: search-sync-source 17 passwordSecretRef: 18 name: mdbc-rs-search-sync-source-password 19 key: password 20 resourceRequirements: 21 limits: 22 cpu: "3" 23 memory: 5Gi 24 requests: 25 cpu: "2" 26 memory: 3Gi 27 EOF 等待
MongoDBSearch资源部署完成。当您应用
MongoDBSearch自定义资源时, Kubernetes 操作符开始部署搜索节点 (pod)。此步骤会暂停执行,直到mdbs资源的状态阶段为Running,这表示MongoDB Search StatefulSet 处于可操作状态。1 echo "Waiting for MongoDBSearch resource to reach Running phase..." 2 kubectl --context "${K8S_CTX}" -n "${MDB_NS}" wait \ 3 --for=jsonpath='{.status.phase}'=Running mdbs/mdbs --timeout=300s
必需。为MongoDB Search 和 Vector Search 配置外部访问权限。
启用外部MongoDB实例能够连接到搜索服务,您必须为MongoDB Search 和 Vector Search 配置外部访问权限。您可以创建一个 LoadBalancer 服务,在Kubernetes集群外部公开搜索Pod。
以下服务使用可从Kubernetes集群外部访问的外部IP解决或主机名公开端口 27027 上的 MongoDBSearch 服务。
1 kubectl apply --context "${K8S_CTX}" -n "${MDB_NS}" -f - <<YAML 2 apiVersion: v1 3 kind: Service 4 metadata: 5 name: ${MDB_SEARCH_HOSTNAME} 6 spec: 7 type: LoadBalancer 8 selector: 9 app: mdbs-search-svc 10 ports: 11 - name: mongot 12 port: 27027 13 targetPort: 27027 14 YAML 15 16 echo "Waiting for external IP to be assigned to service ${MDB_SEARCH_HOSTNAME}..." 17 TIMEOUT=120 # 2 minutes timeout 18 ELAPSED=0 19 while [ ${ELAPSED} -lt ${TIMEOUT} ]; do 20 EXTERNAL_IP=$(kubectl get service "${MDB_SEARCH_HOSTNAME}" --context "${K8S_CTX}" -n "${MDB_NS}" -o jsonpath='{.status.loadBalancer.ingress[0].ip}' 2>/dev/null) 21 if [ -n "${EXTERNAL_IP}" ] && [ "${EXTERNAL_IP}" != "null" ]; then 22 echo "External IP assigned: ${EXTERNAL_IP}" 23 break 24 fi 25 echo "Still waiting for external IP assignment... (${ELAPSED}s/${TIMEOUT}s)" 26 sleep 5 27 ELAPSED=$((ELAPSED + 5)) 28 done 29 30 if [ ${ELAPSED} -ge ${TIMEOUT} ]; then 31 echo "ERROR: Timeout reached (${TIMEOUT}s) while waiting for external IP assignment" 32 echo "LoadBalancer service may take longer to provision or there may be an issue" 33 exit 1 34 fi
可选。查看命名空间中所有运行的Pod。
查看MongoDB副本集成员、 Kubernetes Operator 的MongoDB控制器以及搜索节点的命名空间Pod 中运行的所有 Pod。
1 echo; echo "MongoDBSearch resource" 2 kubectl --context "${K8S_CTX}" -n "${MDB_NS}" get mdbs/mdbs 3 echo; echo "Search pods running in cluster ${K8S_CTX}" 4 kubectl --context "${K8S_CTX}" -n "${MDB_NS}" get pods -l app=mdbs-search-svc 5 echo; echo "All pods in namespace ${MDB_NS}" 6 kubectl --context "${K8S_CTX}" -n "${MDB_NS}" get pods
后续步骤
现在,您已成功部署MongoDB Search 和 Vector Search 以与外部MongoDB Enterprise Edition 一起使用,您可以将数据添加到MongoDB 集群,创建MongoDB Search 和 Vector Search 索引,并对数据运行查询。要学习;了解更多信息,请参阅MongoDB搜索和向量搜索设置。