此页面介绍了mongot 开启到 mongod(或mongos )的连接,以供应数据并读取复制状态,适用于使用 MongoDB Controllers for Kubernetes 操作符 管理的 MongoDB Search 和向量搜索部署。在此连接上,mongot 是客户端,mongod 是服务器。此页面介绍了 mongot 如何向 mongod 进行身份验证(SCRAM 或 X.509)、其身份所需的角色,以及 mongot 如何通过 TLS 信任 mongod 服务器证书。
应用程序用户从不直接连接到 mongot。对于相反方向(即 mongod 向 mongot 监听服务器开启的连接),请参阅 保护 MongoDB 到搜索的连接。
有关此页上引用的每个 MongoDBSearch 设置的完整模式,请参阅 MongoDB Search 和向量搜索设置。
mongot 如何对 mongod 进行身份验证
当 mongot 连接到 mongod 时,它会使用两种互斥模式之一作为数据库客户端进行身份验证:
模式 | 凭证 | 使用时 |
|---|---|---|
SCRAM | 用户名和密码 | 您的 |
x.509 | 客户端证书 | 您的组织会从 PKI 预配用于集群服务的证书,或合规要求更倾向使用基于证书的身份验证而不是密码。 |
您可以通过更新 MongoDBSearch 资源并让 Kubernetes 操作符重新启动 mongot 节点来实现事后切换模式。如果 mongot 身份持有下一节中描述的必要角色,则不需要更改 mongod 侧身份。
注意
从 SCRAM 切换到 X.509 要求同步源上启用 TLS。当源 mongod 未运行 TLS 时,Kubernetes 操作符将拒绝 X.509。首次启用搜索 TLS 时,会出现短暂但实际存在的查询服务中断,而非无缝重启。进行此切换时,请计划一段短暂的停机时间。有关割接行为,请参见 Secure the Connection from MongoDB to Search。
角色 mongot 在 mongod 上的需求
无论 mongot 使用何种模式,其身份验证必须具有在 mongod 上源数据和维护搜索目录的权限。该身份必须拥有内置 searchCoordinator 角色,该角色随 MongoDB Server 8.2 及更高版本提供,并仅授予 mongot 所需的权限。
您始终自己创建此身份;MongoDBSearch 控制器从不会为您创建此身份。创建方式取决于 Kubernetes Operator 是否管理源 mongod:
操作符托管的源。声明持有
searchCoordinator角色的用户,并在 Community 的MongoDBCommunity资源的users列表中引用密码Secret,或将其作为 Enterprise 的单独MongoDBUser资源。Kubernetes 操作符将为您在mongod上预配该用户。然后,您在MongoDBSearch资源上引用相同的用户和Secret,以便mongot可以与其进行身份验证。外部来源。直接在自己的
mongod部署上创建用户并授予其searchCoordinator角色,然后在MongoDBSearch资源上引用其凭证,如下所示。
本页的其余部分展示了如何在 MongoDBSearch 资源上配置每种身份验证模式,以及如何通过 TLS 信任 mongod 服务器证书。
配置 SCRAM 身份验证
提供一个 Kubernetes Secret,其中包含 mongot 应用于向 mongod 进行身份验证的密码。通过 spec.source.passwordSecretRef 参考 MongoDBSearch 资源上的秘钥,并通过 spec.source.username 设置用户名。
spec: source: username: search-sync-source passwordSecretRef: name: my-mongot-password
引用的 Secret 必须在名为 password 的密钥下包含密码。如果将密码存储在不同的密钥下,则通过 spec.source.passwordSecretRef.key 覆盖密钥。
由 spec.source.username 标识的用户必须已存在于 mongod,并且必须拥有 searchCoordinator 角色。如果省略 spec.source.username,Kubernetes Operator 会将用户名视为 search-sync-source。
要在 SCRAM 之上添加网络层 mTLS,请提供包含客户端证书和私钥的 Kubernetes Secret,并通过 spec.source.tls.clientCertificateSecretRef 引用它。Secret 必须包含 tls.crt 和 tls.key。Kubernetes 操作符 在 TLS 握手期间呈现此证书,同时仍通过用户名和密码进行身份验证。
spec: source: username: search-sync-source passwordSecretRef: name: my-mongot-password tls: clientCertificateSecretRef: name: my-mongot-client-cert
如果客户端私钥已加密,请在单独的 Secret 中提供密码,并通过 spec.source.tls.keyFilePasswordSecretRef 引用密码。Secret 必须在 keyFilePassword 键处包含密码。
配置 X.509 身份验证
X.509 身份验证通过客户端证书而不是用户名和密码来向 mongod 识别 mongot。证书上的主题标识名 (DN) 成为 mongod 上 mongot 的身份。
注意
spec.source.x509 与 spec.source.username 和 spec.source.passwordSecretRef 互斥。如果同时设置这两个,Kubernetes 操作符将拒绝 MongoDBSearch 资源。
提供一个 Kubernetes Secret,其中包含客户端证书和私钥,分别位于 tls.crt 和 tls.key 密钥下,并通过 spec.source.x509.clientCertificateSecretRef 在 MongoDBSearch 资源上引用它:
spec: source: x509: clientCertificateSecretRef: name: my-mongot-x509-cert
如果客户端私钥已加密,请在 keyFilePassword 键下的单独 Secret 中提供密语,并通过 spec.source.x509.keyFilePasswordSecretRef 引用它:
spec: source: x509: clientCertificateSecretRef: name: my-mongot-x509-cert keyFilePasswordSecretRef: name: my-mongot-key-password
仅客户端证书不授予访问权限:mongod 必须将其主题标识名识别为授权身份。创建上述证书秘密后,如下所述,在 mongod 上授权该证书的主题标识名。
授权 X.509 主题标识名 mongod
在 mongod 侧,在 $external 数据库中创建一个用户,其名称与上面预配的客户端证书上的主题标识名匹配,并将 searchCoordinator 角色授予该用户。mongod 使用 $external 数据库来追踪通过 X.509 等外部机制进行身份验证的身份。要在 Kubernetes 操作符管理的部署上创建 X.509 用户,请参阅 使用 X.509 保护客户端身份验证。
您还必须在 mongod 部署上启用 TLS,并将其配置为信任签署 mongot 客户端证书的证书颁发机构 (CA)。您需要在 mongod 部署本身上通过 MongoDB 或 MongoDBCommunity 资源进行此配置,而不是通过 MongoDBSearch 资源。要对托管的 mongod 部署启用 TLS,请参阅 安全的单集群客户端连接 (TLS/SSL)。
信任 mongod 服务器证书
上述设置建立 mongot 的身份。独立地,当源 mongod 使用 TLS 时,mongot 必须信任 mongod 在 mongot 连接到它时提供的证书。mongot 是此连接上的 TLS 客户端;mongod 提供其服务器证书,mongot 会使用您提供的 CA 对该证书进行验证。
当源 mongod 位于 Kubernetes 操作符外部(即通过 spec.source.external 声明)时,请提供签发 mongod 服务器证书的 CA:
spec: source: external: hostAndPorts: - mongod-0.example.com:27017 tls: ca: name: my-external-mongod-ca
spec.source.external.tls.ca.name 字段引用一个 Kubernetes ConfigMap,其中包含 ca.crt 键下的 CA 证书。CA 必须是颁发 mongod 服务器证书的 CA。
当源 mongod 由 Kubernetes 操作符(通过 spec.source.mongodbResourceRef)托管时,Kubernetes 操作符会为您处理此 CA 信任,并且 spec.source.external.tls.ca.name 字段不适用。
证书轮换
mongot 在进程启动时读取其客户端证书。要轮换证书,请更新 spec.source.x509.clientCertificateSecretRef 引用的 Secret (对于 X.509)或 spec.source.tls.clientCertificateSecretRef (对于在 SCRAM 之上的 mTLS)在 MongoDBSearch 资源上。Kubernetes 操作符 会检测到更改,并自动重启 mongot 节点以加载新的证书材料。对于 spec.source.passwordSecretRef 引用的 SCRAM 密码 Secret,也适用同样的操作。
要在 MCK 下轮换 X.509 客户端证书:
无法通过 MongoDBSearch CRD 配置自动轮换。更新 spec.source.x509.clientCertificateSecretRef 引用的 Secret 以 trigger 轮换;Kubernetes 操作符 会自动重启节点。