MongoDB Ops Manager 是 MongoDB Enterprise 部署的自托管理平面。在 Kubernetes 上运行时,您将其定义为 MongoDBOpsManager 自定义资源,Kubernetes 操作符处理 MongoDB Ops Manager 应用程序服务器、后端应用程序数据库以及(可选)整个备份基础设施的生命周期。正确配置此资源是基础性的:您之后部署的每个 MongoDB 数据库资源都依赖于健康且连接良好的 MongoDB Ops Manager 实例。
本指南将带您了解 MongoDB Ops Manager 自定义资源的设计决策和概念区域,解释每个区块控制的内容、何时需要以及各部分如何协作。目标是帮助您从第一天起就准备好编写反映组织要求的显示文件,并为您提供一个心理模型,以便在要求变化时可以对该显示文件进行迭代。
有关完整的字段规范,请参阅 MongoDB Ops Manager 资源规范。
管理员凭证和初始设置
在 MongoDB Ops Manager 应用程序启动之前,它需要一个初始管理员账户。您通过 spec.adminCredentials 引用的 Kubernetes Secret 提供这些凭证。Secret 必须包含四个密钥:Username (电子邮件地址)、Password、FirstName 和 LastName。当 MongoDB Ops Manager 节点初始化时,Kubernetes 操作符使用此信息启动第一个全局所有者账户:
kubectl create secret generic ops-manager-admin-secret \ --from-literal=Username="admin@example.com" \ --from-literal=Password="<secure-password>" \ --from-literal=FirstName="Admin" \ --from-literal=LastName="User"
MongoDB Ops Manager 运行后,您可以通过 MongoDB Ops Manager 用户界面或 API 创建其他用户和 API 密钥。初始管理员密钥仅在首次设置期间使用,但 Kubernetes 操作符会在协调时引用它,因此它应保留在集群中。
spec.version 字段确定 Kubernetes 操作符 部署的 Ops Manager 版本。将其固定到特定的 X.Y.Z 版本,而不是任其浮动。准备升级时,更新此字段,并让 Kubernetes 操作符 执行滚动升级,如下例所示:
apiVersion: mongodb.com/v1 kind: MongoDBOpsManager metadata: name: ops-manager spec: replicas: 1 version: "8.0.0" adminCredentials: ops-manager-admin-secret
有关每个必填字段的详细信息,请参阅规格参考中的必填设置。
MongoDB Ops Manager 资源的大小调整和拓扑结构
spec.replicas 字段控制在共享服务后台并行运行的 Ops Manager 应用程序实例数量。单个副本足以进行开发和评估,但生产环境应在负载均衡器后台运行至少两个副本,以在 Pod 重启和节点故障时不停机。副本之间没有功能差异;它们都是由相同的应用程序数据库支持的无状态应用程序服务器。
对于需要地理备份或跨区域高可用性的组织,Kubernetes 操作符支持 MongoDB Ops Manager 本身的 MultiCluster 拓扑结构。在此模式下,设置 spec.topology: MultiCluster 并定义 clusterSpecList 以将 MongoDB Ops Manager 实例分布到命名的 Kubernetes 集群,如下示例所示:
spec: topology: MultiCluster clusterSpecList: - clusterName: "cluster-us-east" members: 1 - clusterName: "cluster-eu-west" members: 1
使用 MultiCluster 拓扑结构时,spec.replicas 字段将被忽略;节点数将从 clusterSpecList 中获取。多集群 MongoDB Ops Manager 部署引入了跨集群网络要求,因此在采用此模型之剄,请查看 在多个 Kubernetes 集群上部署 MongoDB Ops Manager 资源。
重要
一旦使用 SingleCluster 拓扑结构创建 MongoDB Ops Manager 资源,就无法将其原位转换为 MultiCluster。在初次部署之前规划拓扑结构。
应用程序配置属性
MongoDB Ops Manager 拥有一套广泛的服务器端配置属性,范围从电子邮件设置到功能标志再到二进制下载源。Kubernetes 操作符不会将每个属性转换为一级 CRD 字段,而是提供 spec.configuration 块作为通过块:您可以设置直接映射到 MongoDB Ops Manager 系统属性的键值对。
在部署时最常设置的属性是电子邮件配置,以便 Ops Manager 可以发送警报和邀请,以及安全默认值,如下示例所示:
spec: configuration: mms.fromEmailAddr: "ops-manager@example.com" mms.replyToEmailAddr: "ops-manager@example.com" mms.adminEmailAddr: "admin@example.com" mms.mail.hostname: "smtp.example.com" mms.mail.port: "587" mms.mail.ssl: "true" mms.mail.transport: "smtp" mms.ignoreInitialUiSetup: "true"
将 mms.ignoreInitialUiSetup 设置为 "true" 可以在首次启动时跳过交互式设置导向,这对于完全自动化部署至关重要。
其他有用属性包括以下内容:
mms.security.allowCORS——控制用户界面是否接受跨源请求。automation.versions.source— 设置为"remote"(默认)、"local"或"hybrid",以控制 MongoDB 二进制文件的下载方式。请参阅下文“本地和远程模式”。mms.featureFlag.automation.verifyDownloads— 当设置为"enabled"时,代理需要对所有 MongoDB 二进制文件进行加密签名。
有关属性的完整目录,请参阅规范参考中的 Ops Manager 配置设置和 spec.configuration。
使用 TLS 保护连接
强烈建议在局部开发以外的任何环境中通过 HTTPS 运行 Ops Manager。如果没有安装,则管理员凭证、API 密钥和监控数据将以明文形式穿越网络。
启用 HTTPS 需要满足以下条件:
Ops Manager 应用程序本身的 TLS 证书。
应用程序数据库的 TLS 证书。
每个证书都存储在一个名称遵循模式 <certsSecretPrefix>-<metadata.name>-cert (用于应用程序)或 <certsSecretPrefix>-<metadata.name>-db-cert (用于应用程序数据库)的 秘密 中。
certsSecretPrefix 是 Kubernetes 操作符将这些命名约定绑定在一起的方式。如果将 spec.security.certsSecretPrefix 设置为 "om-prod",并且资源命名为 ops-manager,则 Kubernetes 操作符预计命名为 om-prod-ops-manager-cert 和(对于应用程序数据库) appdb-prod-ops-manager-db-cert 的秘密,如下示例所示:
Create the Ops Manager TLS certificate secret kubectl create secret tls om-prod-ops-manager-cert \ --cert=om-tls.crt \ --key=om-tls.key Create the Application Database TLS certificate secret kubectl create secret tls appdb-prod-ops-manager-db-cert \ --cert=appdb-tls.crt \ --key=appdb-tls.key
如果您的证书由自定义证书授权机构签名,则还必须创建包含 CA 证书的 ConfigMap。MongoDB Ops Manager CA 证书在 ConfigMap 内部必须命名为 mms-ca.crt。此外,此 CA 文件必须包含 downloads.mongodb.com 的证书链,以便备份守护程序可以下载 MongoDB 二进制文件:
spec: security: certsSecretPrefix: "om-prod" tls: ca: "om-ca-configmap" applicationDatabase: security: certsSecretPrefix: "appdb-prod" tls: ca: "appdb-ca-configmap"
有关步骤 HTTPS 部署程序,包括组装 CA 链的 openssl 命令,请参阅部署 MongoDB Ops Manager 资源。有关证书续订自动化,请参阅设置证书经理集成。
外部连接
开箱即用的 MongoDB Ops Manager 仅在 Kubernetes 集群的内部网络中可访问。要使在集群外运行的管理员和监控代理访问 MongoDB Ops Manager 用户界面和 API,您需要配置外部连接。
spec.externalConnectivity 块指示 Kubernetes 操作符创建指定类型的 Kubernetes 服务。当云提供商支持 LoadBalancer 时,我们强烈建议您使用它,因为它会自动预配稳定的外部终结点。NodePort 是本地部署或裸机集群的备用方案,如以下示例所示:
spec: externalConnectivity: type: LoadBalancer
您可以添加云特定注释以影响负载均衡器行为。例如,要在内部子网上使用 Amazon Web Services 网络负载均衡器:
spec: externalConnectivity: type: LoadBalancer annotations: service.beta.kubernetes.io/aws-load-balancer-type: "nlb" service.beta.kubernetes.io/aws-load-balancer-internal: "true"
如果外部终结点具有自定义域名(例如 https://opsmanager.example.com),请设置 spec.opsManagerURL,以便 Kubernetes 操作符及其代理在与 MongoDB Ops Manager 通信时使用正确地址:
spec: opsManagerURL: "https://opsmanager.example.com:8443" externalConnectivity: type: LoadBalancer
有关全部外部连接字段,请参阅规格参考中的 spec.externalConnectivity。
应用程序数据库
应用程序数据库是一个 MongoDB 副本集,可存储 Ops Manager 的所有内部状态:项目配置、用户账户、警报定义等。它与 Ops Manager 应用程序服务器紧密耦合,必须保持健康才能使 Ops Manager 正常运行。操作符将应用程序数据库作为同一自定义资源的一部分进行管理,这意味着单个 YAML 显示可以控制应用程序及其后端数据库。
版本和节点
您必须指定应用程序数据库版本和副本集大小。企业版本使用 X.Y.Z-ubi8 格式。-ubi8 后缀可确保 Kubernetes 操作符 使用基于 UBI 的容器影像。三个节点是生产级副本集的标准最小值:
spec: applicationDatabase: members: 3 version: "8.0.0-ubi8"
升级期间的功能兼容性
升级应用程序数据库时,将 featureCompatibilityVersion 设置为当前部署的版本,以创建安全的回滚点。在确认新二进制版本的稳定性后,在后续更改中提高 特征兼容性版本:
spec: applicationDatabase: version: "8.0.0-ubi8" featureCompatibilityVersion: "7.0"
身份验证和密码
您可以通过 Kubernetes Secret 引用为应用程序数据库用户提供自定义密码。这是可选的;如果省略,则操作符会自动托管密码:
spec: applicationDatabase: passwordSecretKeyRef: name: appdb-user-secret key: password
存储和资源
应用程序数据库有其自己的存储和节点规格。其大小取决于 MongoDB Ops Manager 管理的项目和部署数量。MongoDB Ops Manager 的默认存储请求为 16Gi。对于中小型部署,50-100 GiB 的快速存储是一个合理的起始点。对于较大的环境,请考虑分离数据卷和日志卷:
spec: applicationDatabase: members: 3 version: "8.0.0-ubi8" podSpec: cpu: "2" memory: "4Gi" persistence: multiple: data: storage: "100Gi" storageClass: "fast-ssd" journal: storage: "30Gi" storageClass: "fast-ssd" logs: storage: "10Gi" storageClass: "standard"
多集群应用程序数据库
应用程序数据库还可以跨多个 Kubernetes 集群,以提高韧性。将 spec.applicationDatabase.topology 设置为 MultiCluster,并定义每个集群中运行的节点数:
spec: applicationDatabase: topology: MultiCluster version: "8.0.0-ubi8" clusterSpecList: - clusterName: "cluster-1" members: 2 - clusterName: "cluster-2" members: 2 - clusterName: "cluster-3" members: 1
使用 MultiCluster 拓扑结构时,应用程序数据库级别的 members 字段将被忽略;每个集群的节点数来自其 clusterSpecList 条目。
有关所有应用程序数据库设置,请参阅 spec.applicationDatabase 下的规格参考。
备份基础架构
MongoDB Ops Manager 为其托管的 MongoDB 部署提供连续备份。与在 MongoDB CR 上的每个部署 spec.backup.mode 标志不同,MongoDB Ops Manager 资源上的备份设置定义了存储备份数据的基础设施:头部数据库、oplog 存储和快照存储。如果没有此基础设施,在单个 MongoDB 资源上启用备份将失败。
启用备份
将 spec.backup.enabled 设置为 true 以激活备份子系统。仅此一点是不够的;您还必须至少配置一个 oplog 存储和一个快照存储:
spec: backup: enabled: true
头部数据库
头部数据库存储备份元数据和作业状态。分配足够的存储空间以容纳所有正在备份的部署的元数据占用空间。对于大多数环境,30-100 GiB已足:
spec: backup: enabled: true headDB: storage: "50Gi" storageClass: "fast-ssd"
Oplog 存储
oplog 存储可以捕获 MongoDB oplog,从而实现时间点恢复。每个 oplog 存储都由单独的 MongoDB 部署提供支持(您可以将其创建为常规 MongoDB CR)。您可以按名称引用该部署:
spec: backup: enabled: true opLogStores: - name: oplog1 mongodbResourceRef: name: oplog-db mongodbUserRef: name: oplog-user assignmentLabels: - "production"
对于偏好对象存储的组织,可使用 S3 支持的 oplog 存储:
spec: backup: s3OpLogStores: - name: s3-oplog-store s3SecretRef: name: s3-credentials pathStyleAccessEnabled: true s3BucketEndpoint: "s3.us-east-1.amazonaws.com" s3BucketName: "oplog-bucket"
快照存储
快照存储可以存储周期性的全状态快照。您可以使用 MongoDB 支持的块存储或 S3 支持的存储。S3 通常因其所需费用和可扩展性而成为首选:
spec: backup: enabled: true s3Stores: - name: s3-snapshot-store mongodbResourceRef: name: s3-metadata-db mongodbUserRef: name: s3-store-user s3SecretRef: name: s3-credentials pathStyleAccessEnabled: true s3BucketEndpoint: "s3.us-east-1.amazonaws.com" s3BucketName: "snapshot-bucket" assignmentLabels: - "production"
MongoDB 支持的块存储区遵循相同的模式,但不包含 S3 字段:
spec: backup: blockStores: - name: blockstore1 mongodbResourceRef: name: blockstore-db mongodbUserRef: name: blockstore-user
备份的 KMIP 加密
如果您的合规要求强制规定必须对静态数据进行备份加密,则可以集成符合 KMIP 标准的密钥管理服务器:
spec: backup: enabled: true encryption: kmip: server: url: "kmip.example.com:5696" ca: "kmip-ca-configmap" client: clientCertificatePrefix: "kmip-client"
分配标签可以将特定的 MongoDB 部署路由到特定的存储,从而可以对备份数据的存储位置进行细粒控制。
有关完整备份规格,请参阅规格参考中的 spec.backup。有关步骤程序,请参阅使用 Kubernetes 操作符配置文件系统备份存储和为 Ops Manager 配置 KMIP 备份加密。
资源分配和 Java 虚拟机(JVM)调优
MongoDB Ops Manager 是一个 Java 应用程序,其资源消耗取决于监控的部署数量、指标数据量以及是否启用备份。操作符将 Ops Manager 部署为 StatefulSet,并通过 spec.statefulSet 控制其 pod 规格。
至少设置 CPU 和内存请求和限制。MongoDB 建议小型部署至少使用 4 个 CPU 和 8 GiB 内存,大型环境可以扩展:
spec: statefulSet: spec: template: spec: containers: - name: mongodb-ops-manager resources: requests: cpu: "4" memory: "8Gi" limits: cpu: "8" memory: "16Gi"
操作符根据容器的内存限制计算 Java虚拟机(JVM) 堆设置。如果您需要覆盖 Java 堆或 GC 参数,请使用 spec.jvmParameters,但请谨慎操作:堆值不正确可能会导致 MongoDB Ops Manager 不稳定:
spec: jvmParameters: - "-Xmx12g" - "-Xms8g" - "-XX:+UseG1GC"
警告
将内存限制设置在 32 GiB 以上可能会导致备份服务出现问题,这是由于 Java 虚拟机(JVM)压缩哦行为。将限制保持在 32 GiB 或以下。
有关完整 StatefulSet 规格字段,请参阅规格参考中的 spec.statefulSet.spec。
本地和远程模式
默认情况下,MongoDB Ops Manager 从互联网下载 MongoDB 安装二进制文件(远程模式)。在空隔或限制网络环境中,您可以配置本地模式(二进制文件从挂载到 MongoDB Ops Manager Pod 的 PersistentVolume 中提供服务),或者配置带有自定义终结点的远程模式。
远程模式(默认):
spec: configuration: automation.versions.source: "remote"
本地模式(用于空隔离环境):
spec: configuration: automation.versions.source: "local" automation.versions.directory: "/mongodb-ops-manager/mongodb-releases"
有关详细步骤,请参阅 配置 MongoDB Ops Manager 资源以使用本地模式 和 配置 MongoDB Ops Manager 资源以使用远程模式。
迭代 MongoDB Ops Manager 配置
MongoDB Ops Manager 自定义资源随着您的组织发展。常见迭代场景包括升级 MongoDB Ops Manager 版本、扩展副本以实现高可用性、为新部署的数据库添加备份基础设施以及轮换 TLS 证书。
安全变更指南:
升级 |onprem| 到位。更改
spec.version并应用。操作员对应用程序 Pod 执行滚动升级。在升级之前,请确保应用程序数据库版本与新的 MongoDB Ops Manager 版本兼容。独立扩展副本。您可以在不停机的情况下增加
spec.replicas。新节点会自动加入现有服务。逐渐添加备份存储。在 CR 中定义新的 oplog 或快照存储,然后应用。现有的备份分配不受影响。
主动轮换证书。更新 TLS 证书秘密信息,如有必要,请更新 CA ConfigMap。操作符检测到变更的秘密信息并重启受影响的 Pod。
观察资源状态。在任何更改后,运行
kubectl get om并检查status字段以获取协调进度和任何错误条件。
有关版本升级程序,请参阅 升级 MongoDB Ops Manager 和后端数据库版本。有关灾难恢复指导,请参阅 MongoDB Ops Manager 和 AppDB 资源的灾难恢复。
汇总所有内容:完整的 MongoDB Ops Manager 资源示例
以下示例将本页介绍的概念组合到可用于生产环境的 Ops Manager 部署中。它包括 HTTPS、电子邮件配置、具有分割存储的三节点应用程序数据库、带 S3 快照和 oplog 存储的备份、KMIP 加密和资源限制:
apiVersion: mongodb.com/v1 kind: MongoDBOpsManager metadata: name: ops-manager-prod namespace: ops-manager spec: replicas: 2 version: "8.0.0" adminCredentials: ops-manager-admin-secret opsManagerURL: "https://opsmanager.example.com:8443" configuration: mms.fromEmailAddr: "ops-manager@example.com" mms.replyToEmailAddr: "ops-manager@example.com" mms.adminEmailAddr: "admin@example.com" mms.mail.hostname: "smtp.example.com" mms.mail.port: "587" mms.mail.ssl: "true" mms.mail.transport: "smtp" mms.ignoreInitialUiSetup: "true" security: certsSecretPrefix: "om-prod" tls: ca: "om-ca-configmap" externalConnectivity: type: LoadBalancer annotations: service.beta.kubernetes.io/aws-load-balancer-type: "nlb" statefulSet: spec: template: spec: containers: - name: mongodb-ops-manager resources: requests: cpu: "4" memory: "8Gi" limits: cpu: "8" memory: "16Gi" jvmParameters: - "-Xmx12g" - "-Xms8g" applicationDatabase: members: 3 version: "8.0.0-ubi8" featureCompatibilityVersion: "8.0" security: certsSecretPrefix: "appdb-prod" tls: ca: "appdb-ca-configmap" podSpec: cpu: "4" memory: "8Gi" persistence: multiple: data: storage: "200Gi" storageClass: "fast-ssd" journal: storage: "50Gi" storageClass: "fast-ssd" logs: storage: "20Gi" storageClass: "standard" backup: enabled: true encryption: kmip: server: url: "kmip.example.com:5696" ca: "kmip-ca-configmap" client: clientCertificatePrefix: "kmip-client" headDB: storage: "100Gi" storageClass: "fast-ssd" opLogStores: - name: oplog1 mongodbResourceRef: name: oplog-db mongodbUserRef: name: oplog-user assignmentLabels: - "production" s3Stores: - name: s3-snapshots mongodbResourceRef: name: s3-metadata-db mongodbUserRef: name: s3-store-user s3SecretRef: name: s3-credentials pathStyleAccessEnabled: true s3BucketEndpoint: "s3.us-east-1.amazonaws.com" s3BucketName: "backup-snapshots-prod" assignmentLabels: - "production"
提示
Ops Manager 资源规格 — 完整的 Ops Manager CR 字段参考
部署 MongoDB Ops Manager 资源 — 单集群部署的分步说明
在多个 Kubernetes 集群上部署 Ops Manager 资源 — 多集群 Ops Manager 部署
配置 Ops Manager 资源以使用远程模式 — 远程二进制源
使用 Kubernetes Operator 配置文件系统备份存储 — 文件系统备份存储
为 Ops Manager 配置 KMIP 备份加密 — KMIP 备份加密
设置 cert-manager 集成 — 自动证书续订
MongoDB Ops Manager 和 AppDB 资源的灾难恢复 — 灾难恢复程序