您可以在Kubernetes集群中部署MongoDB Search 和 Vector Search,直接在应用程序中构建强大的搜索体验。使用MongoDB Search 和 Vector Search,您可以构建传统的文本搜索和AI支持的向量搜索功能,这些功能可自动与本地部署MongoDB 数据库同步。这样一来,在提供高级搜索功能的同时,就无需保持不同的系统同步。要学习;了解详情,请参阅:
要在本地部署中启用全文和语义搜索等搜索功能,您必须部署MongoDB搜索和向量搜索进程(mongot),并将其与MongoDB 数据库部署(mongod) 连接。部署 mongot 是可选的,仅当您计划使用其提供的搜索功能时才需要部署。
MongoDB数据库进程 (mongod) 充当 mongot 的所有搜索查询的代理。mongod 将查询转发到 mongot,由其处理该查询。mongot 将查询结果返回给 mongod,然后将结果转发给您。您从不直接与 mongot交互。
每个 mongot进程都有自己的持久卷,不与数据库或其他搜索节点共享。存储用于维护根据持续源自数据库的数据构建的索引。索引定义(元数据)存储在数据库中。
mongot 执行以下操作:
管理索引。
mongot负责更新数据库中的索引定义。从数据库中获取数据。
mongot节点与数据库建立永久连接,以便实时更新数据库中的索引。处理搜索查询。
当
mongod收到$search、$searchMeta或$vectorSearch查询时,它会将查询定向到mongot节点之一。接收查询的mongot会处理查询、聚合数据,并将结果返回给mongod,然后再将结果转发给用户。
mongot 组件与单个MongoDB副本集紧密耦合,不能在多个数据库或副本集之间共享。对于副本集部署,由一群组专用搜索节点为副本集提供服务。对于分片集群,每个分片都维护自己独立的 mongot 节点群组。分片不股票mongot 实例。
mongot 和 mongod 之间的网络连接是双向的:
mongot建立与副本集的连接,以获取用于构建索引和运行查询的数据。mongod连接到mongot以转发搜索相关操作,例如索引管理和查询数据。
spec.replicas字段控制Kubernetes Operator 部署的 mongot 实例数量。对于副本集源,spec.replicas 设置 mongot Pod 的总数。对于分片集群源,spec.replicas 设置每个分片的 mongot Pod 数量。
如果将 spec.replicas设立为大于 1 的值,则必须在 mongod 和 mongot Pod 之间放置一个 L7 负载负载均衡器。mongod进程打开一个与 mongot 的长期 TCP 连接,因此 L4 负载负载均衡器无法在多个 mongot 实例之间分配查询 — 所有流量都流经该一个连接。L7 负载负载均衡器支持HTTP /2 和 gRPC,因此可以跨 mongot Pod 分发单个 gRPC 流,同时在查询游标运行期间将每个流固定到单个 mongot。
MongoDB Search 和 Vector Search 部署
有或没有Kubernetes Operator 的搜索部署架构没有太大区别。Kubernetes Operator 简化了部署功能齐全的搜索节点所需的步骤,尤其是当数据库也由Kubernetes Operator托管时。
要部署,请应用MongoDBSearch 自定义资源 (CR), Kubernetes 操作符 会选择该资源并开始部署 mongot Pod,并请求 spec 中指定的持久存储。通过Kubernetes 操作符 部署的MongoDB Search 和 向量搜索 可以针对Kubernetes 操作符 在同一Kubernetes 集群内部署的MongoDB 副本集或集群,或完全独立的外部MongoDB 部署(副本集或集群)。要学习;了解如何部署和配置 mongot 以使用:
Kubernetes中的MongoDB副本集,请参阅 在Community Edition中安装和使用 或 在MongoDB Enterprise Edition中安装和使用搜索
外部MongoDB副本集,请参阅安装和使用MongoDB Search 以及 Vector Search 与外部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实例
开始之前,请考虑以下事项:
您必须有有效的
StorageClass,才能在Kubernetes集群中创建持久卷。如果没有它,您的PersistentVolumeClaims可能会保持待处理状态,并且MongoDB可能没有持久性存储。您必须具有正确配置的集群网络。ClusterIP、NodePort 或 LoadBalancer 等服务必须能够路由流量。如果外部客户端需要访问权限,设立设置入口或负载负载均衡器。
必须为数据库和搜索节点分配足够的 CPU、内存和磁盘空间,因为 MongoDB 数据库、MongoDB 搜索和向量搜索工作负载属于资源密集型工作负载。我们建议在 Pod 规范中使用请求和限制,以避免驱逐或限制。
您要使用的MongoDB操作符或Helm图表必须支持您的Kubernetes版本。某些 CRD 或 API 因版本而异。要了解更多信息,请参阅Kubernetes 操作符兼容性的 MongoDB 控制器。
您必须创建任何所需的 RBAC 角色和角色绑定,这样 Kubernetes 操作符和 Pod 中运行的进程才能管理资源。
如果您需要多个
mongot实例(spec.replicas大于1),则需要一个负载负载均衡器。Kubernetes 操作符 可以自动部署和管理Envoy 代理 (spec.loadBalancer.managed: {}),您也可以提供自己的 L7 负载均衡器(spec.loadBalancer.unmanaged)。如果您需要具有多个
mongot实例的分片集群,请确保您有足够的集群资源来容纳所有分片的 Pod 总数。每个分片都有自己独立的mongotPod群组。负载负载均衡器将流量分派到正确的mongot群组。它读取传入流量的TLS SNI字段以识别原始分片,并将流量路由到属于该分片的mongotPod。因此,您必须为每个分片配置不同的搜索主机名。
配置任务
下表显示了Kubernetes 操作符 自动执行的配置任务以及您必须执行的操作,才能在Kubernetes中成功部署MongoDB Search 和 向量搜索,以及连接到Kubernetes或外部MongoDB 部署中的MongoDB副本集或集群。
任务 | (Inside Kubernetes) Performed by | (External MongoDB) Performed by |
|---|---|---|
在Kubernetes内部署MongoDB Ops Manager | 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 + 托管负载均衡器) | 没有必要 | 您 |
下图显示了Kubernetes集群中具有MongoDB Enterprise副本集的单个MongoDB Search 和 Vector Search实例的部署架构。

下图显示了Kubernetes Operator 在Kubernetes集群中为带有MongoDB Enterprise版副本集的MongoDB Search 和 Vector Search 部署的组件。

当 mongot 和 mongod 进程同时部署在Kubernetes集群内时, Kubernetes Operator 会自动为这两个进程执行配置。具体来说, Kubernetes Operator 执行以下操作:
使用
spec.source.mongodbResourceRef查找 MongoDBSearch 引用的MongoDB CR,或根据命名约定查找与 MongoDBSearch 同名的MongoDB CR。对于分片的集群, Kubernetes 操作符 从引用的MongoDB资源中自动发现分片拓扑结构(分片名称、副本集成员和mongos路由器)。在 YAML 文件中生成
mongot配置,并将其保存到名为<MongoDBSearch.metadata.name>-search-config的配置映射中。配置映射由搜索Pod 挂载,YAML 配置由
mongot的进程在初创企业时使用。生成的 YAML 包含有关如何连接到副本集、TLS 设置等的所有信息。部署名为
<MongoDBSearch.metadata.name>-search的MongoDB Search 和 向量搜索 有状态设立,并根据 CR 中的spec.persistence和spec.resourceRequirements设置配置存储和资源要求。对于分片集群源, Kubernetes 操作符 会为每个分片创建一个 StatefulSet。每个 StatefulSet 都使用命名模式<name>-search-0-<shardName>并包含spec.replicas个 Pod,默认为1。命名模式中的0为将来的多集群兼容性保留集群索引。如果需要负载负载均衡器(
spec.loadBalancer.managed),请为MongoDB 集群部署单个 Envoy 代理 Deployment。Envoy 代理处理mongod和mongotPod 之间的 L7 路由、mTLS 终止以及 gRPC流固定。通过添加必要的
setParameter选项(包括mongot主机的主机名和端口号)来更新每个mongod进程的配置。配置负载均衡器时,mongotHost和searchIndexManagementHostAndPort点指向负载均衡器终结点,而不是mongotPod。对于分片的集群,每个分片的mongod进程接收该分片的负载均衡器终结点。
您必须执行以下操作:
使用
MongoDBUser自定义资源在副本集创建用户。mongot使用该用户的凭证连接到副本集以获取数据:用户名可以是任意的(在示例中,我们使用
search-sync-source-user),但必须设立searchCoordinator角色。该用户的用户名和密码分别在
MongoDBSearch.spec.source.username和MongoDBSearch.spec.source.passwordSecretRef中传递。密码密钥可以指用于创建
MongoDBUser规范(在MongoDBUser.spec.source.passwordSecretKeyRef中)的包含用户密码的相同密钥。
配置并应用MongoDBSearch 自定义资源。
要学习;了解有关 进程的 CR mongot设置的更多信息,请参阅MongoDB搜索和向量搜索设置。
下图展示了使用外部MongoDB Enterprise版副本集的Kubernetes集群中MongoDB Search 和 Vector Search 的部署架构。

下图显示了Kubernetes Operator 在Kubernetes集群中为MongoDB Search 和 Vector Search 部署的组件。

要在Kubernetes外部MongoDB 部署时使用MongoDB Search 和向量搜索,请使用Kubernetes 操作符部署mongot 并手动执行一些步骤。Kubernetes 操作符 处理搜索Pod 的配置。但是,当MongoDB 部署在Kubernetes外部时,您必须重新配置MongoDB节点和网络。
您负责以下手动配置:
外部副本集配置
在外部副本集的每个
mongod进程上使用setParameter配置以下参数。配置时,将<search-service-hostname>:27028替换为 MongoDBSearch 服务的实际可解析主机名和端口。setParameter: mongotHost: "<search-service-hostname>:27028" searchIndexManagementHostAndPort: "<search-service-hostname>:27028" skipAuthenticationToSearchIndexManagementServer: false searchTLSMode: "disabled" # or "requireTLS" for TLS deployments useGrpcForSearch: true 对于单个
mongot实例(无负载负载均衡器),mongotHost直接指向mongot服务主机名 (<name>-search-svc:27028)。对于具有负载均衡器的多个
mongot实例,mongotHost改为指向负载均衡器终结点。对于托管负载均衡器, Kubernetes 操作符 使用
spec.source.mongodbResourceRef自动配置mongotHost。对于外部MongoDB部署,必须将
mongotHost设立为您在spec.loadBalancer.managed.externalHostname或spec.loadBalancer.unmanaged.endpoint中指定的负载均衡器终结点。
在外部副本集为搜索同步进程创建一个用户。此用户必须具有
searchCoordinator角色。- userName: "search-sync-source" password: "<your-search-sync-password>" database: "admin" roles: - role: "searchCoordinator" db: "admin"
外部分片集群配置
重要
在标准MongoDB分片集群部署中,客户端仅连接到 mongos 路由器,而从不直接连接到分片副本集。但是,当您部署mongot 时,每个分片群组中的 mongot 进程将同时连接到 mongos 路由器和该分片的所有 mongod 进程。因此,您必须将每个分片的副本集直接公开给 mongot 进程。确保您的网络和防火墙规则允许从Kubernetes集群直接连接到每个分片的 mongod 实例,而不仅仅是 mongos 路由器。
您在 spec.source.external.shardedCluster.shards 中指定的 shardName 值必须遵循Kubernetes命名规则:
仅包含小写字母数字字符、
-或.。以字母字符开头,以字母数字字符结尾。
不包含下划线。如果您的MongoDB分片名称使用下划线,请将其替换为破折号。
MongoDBSearch.metadata.name和shardName的总长度必须小于 50 个字符。
shardName 不需要与MongoDB中的确切分片名称匹配。Kubernetes 操作符 仅使用它来命名Kubernetes资源。
当您将 MongoDBSearch 连接到外分片集群时,您必须:
使用
mongos路由器主机和按分片的副本集主机在 MongoDBSearch CR 中配置spec.source.external.shardedCluster。在每个分片的
mongod进程上设置mongotHost和searchIndexManagementHostAndPort参数。将每个分片指向自己的mongot群组(如果使用多个mongot实例,则指向自己的负载均衡器终结点)。确保以下之间的双向网络连接:
每个分片的
mongod节点和相应的mongotPod(或负载负载均衡器)。mongotPod 和mongos路由器(用于查询路由)。mongotPod 和每个分片的mongod节点(用于数据同步)。
如果将托管负载负载均衡器与外分片集群一起使用,请指定带有 {shardName} 占位符(示例{shardName}.search-lb.example.com)的 spec.loadBalancer.managed.externalHostname。向外部公开 Envoy 服务,以便每个分片的 mongod 节点都可以使用该分片的唯一主机名访问该服务。负载负载均衡器从传入连接中读取TLS SNI字段,以确定流量源自哪个分片,并将其分派到属于该分片的 mongot Pod。这种基于SNI的路由是负载负载均衡器用于区分分片之间流量的唯一机制,这就是每个分片必须通过不同主机名进行连接的原因。
Kubernetes配置
配置并应用MongoDBSearch CR,其中
spec.source.external指向外部MongoDB托管。为搜索同步用户的密码创建Kubernetes密钥。
apiVersion: v1 kind: Secret metadata: name: search-sync-source-password stringData: password: "your-search-sync-password" 配置网络和 DNS,确保外部MongoDB和搜索Pod 之间的双向连接。您的外部MongoDB环境必须能够解析您的搜索服务主机名 (
<search-service-hostname>)。
要学习;了解有关用于连接到外部 mongod进程的 mongot进程的CR设置的更多信息,请参阅MongoDB搜索和向量搜索设置。
安全性
下图说明了 mongot进程的安全配置。如果MongoDB服务器位于Kubernetes集群内部,Kubernetes Operator 会自动为MongoDB 搜索和向量搜索设置密钥文件身份验证。如果MongoDB服务器位于外部,则必须创建一个包含副本集凭证的kubernetes secret,并在 MongoDBSearch CR 中引用它。

身份验证
mongot进程使用 mTLS 对 mongod 连接进行身份验证。启用TLS后,mongot进程将使用MongoDB服务器的TLS证书作为客户端证书进行身份验证。此证书根据配置 mongot 的 CA 证书进行验证。为了使身份验证正常工作,您必须在启用 TLS 的情况下配置 mongot 和 mongod。
当配置为索引同一 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.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.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。