您可以在 Kubernetes 集群中部署 MongoDB Search 和 向量搜索,以直接在应用程序内构建强大的搜索体验。使用 MongoDB Search 和 Vector Search,您可以构建传统的文本搜索和 AI 驱动的向量搜索功能,这些功能会与本地部署的 MongoDB 数据库自动同步。这种方法无需维护同步的独立系统,同时提供高级搜索功能。要了解更多信息,请参阅:
要在本地部署中启用全文和语义搜索等搜索功能,必须部署MongoDB搜索和向量搜索进程(mongot),并将其与MongoDB 数据库部署(mongod) 连接。部署 mongot 是可选的,仅当您计划使用其提供的搜索功能时才需要部署。
MongoDB 数据库进程 (mongod) 充当 mongot 的所有搜索查询的代理。mongod 将查询转发到 mongot,由其处理查询。mongot 将查询结果返回给 mongod,后者再将结果转发给您。您从不与 mongot 直接交互。
每个 mongot进程都有自己的持久卷,不与数据库或其他搜索节点共享。存储用于维护根据持续源自数据库的数据构建的索引。索引定义(元数据)存储在数据库中。
mongot 执行以下操作:
管理索引。
mongot负责更新数据库中的索引定义。从数据库中获取数据。
mongot节点与数据库建立永久连接,以便实时更新数据库中的索引。处理搜索查询。
When
mongodreceives a$search,$searchMeta, or$vectorSearchquery, it directs the query to one of themongotnodes. Themongotthat receives the query processes the query, aggregates the data, and returns the results tomongod, which it forwards to the user.
mongot 组件与单个MongoDB副本集紧密耦合,不能在多个数据库或副本集之间共享。对于副本集部署,由一群组专用搜索节点为副本集提供服务。对于分片集群,每个分片都维护自己独立的 mongot 节点群组。分片不股票mongot 实例。
mongot 和 mongod 之间的网络连接是双向的:
mongot建立与副本集的连接,以获取用于构建索引和运行查询的数据。mongod连接到mongot以转发索引管理和查询数据等搜索相关操作。
spec.clusters[].replicas字段控制Kubernetes Operator 部署的 mongot 实例数量。对于副本集源,spec.clusters[].replicas 设置 mongot Pod 的总数。对于分片集群源,spec.clusters[].replicas 设置每个分片的 mongot Pod 数量。
如果将 spec.clusters[].replicas设立为大于 1 的值,则必须在 mongod 和 mongot Pod 之间放置一个 L7 负载负载均衡器。mongod进程打开一个与 mongot 的长期 TCP 连接,因此 L4 负载负载均衡器无法在多个 mongot 实例之间分配查询 — 所有流量都流经该一个连接。L7 负载负载均衡器支持HTTP /2 和 gRPC,因此可以跨 mongot Pod 分发单个 gRPC 流,同时在查询游标运行期间将每个流固定到单个 mongot。
MongoDB Search 和 Vector Search 部署
有无 Kubernetes 操作符 的搜索部署架构没有太大区别。Kubernetes 操作符 简化了部署功能完全的搜索节点所需的步骤,尤其是当数据库也由 Kubernetes 操作符 管理时。
要部署,请应用MongoDBSearch 自定义资源 (CR), Kubernetes 操作符 会选择该资源并开始部署 mongot Pod,并请求 spec 中指定的持久存储。通过Kubernetes 操作符 部署的MongoDB Search 和 向量搜索 可以针对Kubernetes 操作符 在同一Kubernetes 集群内部署的MongoDB 副本集或集群,或完全独立的外部MongoDB 部署(副本集或集群)。要学习;了解如何部署和配置 mongot 以使用:
Kubernetes中的MongoDB副本集,详见使用MongoDB Community Edition安装和使用或使用MongoDB Enterprise Edition安装和使用搜索
先决条件
要在以下位置使用MongoDB Search 和 Vector Search:
MongoDB Community部署,您必须使用Kubernetes 操作符 在Kubernetes集群内部署功能齐全的MongoDB 8.2 或更高版本副本集或分片集群。
MongoDB Enterprise部署,必须通过以下方式之一部署功能齐全的MongoDB 8.2 或更高版本的副本集或分片集群:
使用Kubernetes Operator 在Kubernetes集群内部
Kubernetes集群外部
Cloud Manager或MongoDB Ops Manager实例
开始之前,请考虑以下事项:
配置任务
下表显示了Kubernetes 操作符 自动执行的配置任务以及您必须执行的操作,才能在Kubernetes中成功部署MongoDB Search 和 向量搜索,以及连接到Kubernetes或外部MongoDB 部署中的MongoDB副本集或集群。
任务 | (在 Kubernetes 内) 执行者 | (外部 MongoDB) 执行者 |
|---|---|---|
Deploy Ops Manager inside Kubernetes | Kubernetes Operator | Kubernetes Operator |
在Kubernetes外部部署Cloud Manager或MongoDB Ops Manager | 您 | 您 |
部署MongoDB副本集或分片集群 | Kubernetes Operator | 您 |
创建 MongoDBSearch 自定义资源 | 您 | 您 |
为MongoDB 部署提供连接字符串 | Kubernetes Operator | 您 |
创建 | Kubernetes Operator | Kubernetes Operator |
在每个 | Kubernetes Operator | 您 |
为 | Kubernetes Operator 和您通过应用 MongoDBUser资源 | 您 |
使用具有查询搜索所需权限的用户配置MongoDB副本集 | 您 | 您 |
创建MongoDB Search 和 Vector Search 索引 | 您 | 您 |
向外部公开搜索Pod 或负载负载均衡器,以便从每个 | 没有必要 | 您 |
向外部公开 | 没有必要 | 您 |
配置托管负载负载均衡器(当 | Kubernetes Operator | Kubernetes Operator |
配置非托管负载负载均衡器(当 | 您 | 您 |
预配每个分片的TLS证书(具有TLS的分片的集群) | 您 | 您 |
向外部公开负载负载均衡器(外部MongoDB + 托管负载均衡器) | 没有必要 | 您 |
安全性
下图展示了 mongot 进程的安全配置。如果 MongoDB 部署在 Kubernetes 集群内,Kubernetes 操作符会自动设置密钥文件身份验证,以便 MongoDB Search 和向量搜索。如果 MongoDB 部署是外部的,您必须创建一个 kubernetes secret,其中包含副本集的密钥文件凭证,并在 MongoDBSearch CR 中引用它。

身份验证
mongot 流程使用 mTLS 对 mongod 连接进行身份验证。当您启用 TLS 时,mongot 进程会将 MongoDB 部署的 TLS 证书用作身份验证的客户端证书。此证书根据 mongot 所配置的 CA 证书进行验证。为了使身份验证正常工作,您必须将 mongot 和 mongod 都配置为启用 TLS。
当配置为索引同一 Kubernetes 集群中的 MongoDB 资源时,Kubernetes 操作符会自动将 mongod CA 证书传播到 mongot,并为搜索查询连接启用 mTLS(如果 MongoDB 和 MongoDBSearch 资源都配置了 TLS)。如果MongoDB副本集部署在Kubernetes外部,则必须创建一个包含副本集 CA 证书的kubernetes secret,并在 MongoDBSearch.spec.source.external.tls.ca字段中引用它,以便为搜索查询请求启用mTLS身份验证。
传输层安全
MongoDBSearch 可以使用 TLS 保护传输过程中的数据和凭证。对于索引管理命令和搜索查询,设置 spec.security.tls 字段并提供 TLS 证书。您可以将此字段设置为空对象 ({}),以启用 TLS 并使用默认设置。
自版本 1.8.0 起已弃用: spec.security.tls.certificateKeySecretRef 已弃用。对于副本集部署,Kubernetes 操作符仍支持 certificateKeySecretRef,但您应迁移到 spec.security.tls.certsSecretPrefix。对于分片集群部署,您不能使用 certificateKeySecretRef,因为 Kubernetes 操作符会为每个分片读取单独的 mongot 服务器证书秘密。
spec.security.tls.certsSecretPrefix 是可选字段。指定后, Kubernetes 操作符 会在其读取的所有证书密钥名称前加上 <certsSecretPrefix>-。Kubernetes 操作符 读取以下证书密钥:
mongot 证书
集群拓扑结构 | mongot 证书 |
|---|---|
副本集 |
|
分片集群 |
|
负载均衡器证书
如果设立spec.clusters[].loadBalancer.managed,则负载负载均衡器客户端证书为 [<certsSecretPrefix>-]<name>-search-lb-0-client-cert。下表显示了负载负载均衡器服务器证书:
集群拓扑结构 | 证书 |
|---|---|
副本集 |
|
分片集群 |
|
TLS 证书必须由颁发MongoDB副本集使用的 CA 证书的同一 CA 颁发和签名。
当 MongoDBSearch 和 MongoDB 都由Kubernetes 操作符 部署时,根本的mongot 和 mongod 配置主要由Kubernetes 操作符 本身处理。如果将MongoDB副本集部署在Kubernetes集群之外:
.spec.source.external.tls字段必须使用Kubernetes密钥填充,该密钥包含您用于配置mongod的相同 CA 证书。searchTLSMode参数必须在mongod配置中设立为requireTLS。
负载均衡器 mTLS
在没有负载负载均衡器的情况下,mongod 使用 mTLS 直接连接到 mongot。mongod 提供自己的客户端证书,mongot 根据受信任的 CA 对其进行验证。
如果您配置托管负载负载均衡器(spec.clusters[].loadBalancer.managed),Envoy 代理会终止与 mongod 的 mTLS 连接,并与 mongot 建立新的 mTLS 连接。由于负载负载均衡器会终止并重新建立连接,因此在连接到 mongot 时,它会使用自己的客户端证书,而不是原始的 mongod 证书。mongot CA 必须信任颁发负载均衡器客户端证书的证书颁发机构。Kubernetes 操作符 自动管理 Envoy TLS 配置。它需要以下证书:
mongod连接到的 Envoy 代理的 服务器证书。负载负载均衡器使用此证书终止传入的 mTLS 连接。Envoy 代理的客户端证书,负载负载均衡器在建立上游 mTLS 连接时向
mongot提供该证书。
遵循 spec.security.tls.certsSecretPrefix 定义的命名约定,将这些证书预配为Kubernetes Secret。有关完整的命名模式,请参阅MongoDB Search 和 向量搜索 Settings。
诊断数据
每个 mongot pod 都会持续向 pod 内的 /mongot/data/diagnostic.data/ 写入 FTDC 文件。FTDC 是一个二进制诊断流,可以捕获详细的 mongot 内部状态,并且是 MongoDB 支持用于诊断搜索问题的主节点 (primary node in the replica set) 文件。FTDC 默认处于启用状态。要学习如何复制 FTDC 文件以处理支持问题,请参阅 疑难排解 mongot 部署。
Kubernetes 操作符通过在 search StatefulSet 上使用 volumeClaimTemplate 将 PersistentVolumeClaim 挂载到每个 mongot pod 的 /mongot/data 位置,并且 mongot 会将其 FTDC 文件写入到该卷上的 /mongot/data/diagnostic.data/ 中。由于数据驻留在 PersistentVolumeClaim 上,因此它可以在 Pod 重启和重新调度后依然存在:当 StatefulSet 替换 Pod 时,它会重新挂载相同的 PersistentVolumeClaim。您可以使用 spec.clusters[].persistence 配置此卷MongoDBSearch 资源上的设置。



