本页详细介绍了MongoDB Controllers for Kubernetes Operator 在生产环境中运行时的最佳实践和系统配置建议。
部署多个MongoDB副本集
我们建议您使用Kubernetes Operator 的单个实例来部署和管理MongoDB副本集。
要并行部署超过10个MongoDB副本集,您可以增加Kubernetes Operator实例的线程数。
为Kubernetes Operator 部署设置MongoDB控制器范围
在安装Kubernetes Operator 之前,您可以设立Kubernetes Operator部署的范围。范围取决于您选择在其中部署Ops Manager和MongoDB资源的命名空间。
Kubernetes Operator 部署范围
您可以设置以下范围之一:
Operator 使用与资源相同的单一命名空间
您可以将Kubernetes Operator 的作用域设立为使用与资源相同的命名空间。在这种情况下, Kubernetes Operator 会监视同一命名空间中的Ops Manager和MongoDB资源。
安装 Kubernetes 操作符时,它会使用默认命名空间。
操作符使用命名空间的子集
您可以将Kubernetes Operator 的范围设立为使用一个或多个与Kubernetes Operator 资源使用的命名空间不同的命名空间。在这种情况下, Kubernetes Operator 会监视您指定的命名空间子集中的Ops Manager和MongoDB资源。
要安装具有此范围的 Kubernetes 操作符 instances,请将helm与操作符.watchNamespace结合使用参数。
在单个 Kubernetes 操作符实例监视不同集群资源类型的部署中,监视命名空间子集非常有用。例如,您可以将 Kubernetes 操作符 配置为监视一个命名空间子集中的MongoDB资源,并监视另一命名空间子集中的MongoDBMultiCluster资源。为了避免在资源协调期间出现竞争条件,对于您希望 Kubernetes 操作符监视的每种自定义资源类型,请确保将范围设置为命名空间的不同子集。
按照helm的相关安装说明进行操作,但在Operator.watchNamespace中指定一个或多个命名空间 Kubernetes Operator 要监视的参数:
# Watch one namespace helm install mongodb-kubernetes-operator mongodb/mongodb-kubernetes \ --set operator.watchNamespace='namespace-to-watch' <...>
# Watch both namespace-a and namespace-b helm install mongodb-kubernetes-operator mongodb/mongodb-kubernetes \ --set operator.watchNamespace="namespace-a\,namespace-b"
# Operator with name `mongodb-kubernetes-operator-qa-envs` will # watch ns-dev, ns-qa and ns-uat namespaces helm install mongodb-kubernetes-operator-qa-envs mongodb/mongodb-kubernetes \ --set operator.watchNamespace="ns-dev\,ns-qa\,ns-uat"
# Operator with name `mongodb-kubernetes-operator-staging` will # watch ns-staging and ns-pre-prod helm install mongodb-kubernetes-operator-staging mongodb/mongodb-kubernetes --set operator.watchNamespace="ns-staging\,ns-pre-prod"
安装 Kubernetes Operator 以监控一个或多个命名空间(部署 Kubernetes Operator 的命名空间以外)中的资源时:
创建以下资源:
可以访问权限多种资源的 ClusterRole。有关完整的资源定义,请参阅操作符角色模板示例。这是集群范围的资源。
创建ClusterRoleBinding以将ClusterRole与 ServiceAccount 关联。此
clusterRoleBinding将绑定您使用Kubernetes Operator 在安装它的命名空间上使用的 ServiceAccount 创建的clusterRole。
将 ClusterRole 和 ClusterRoleBinding 包含在安装期间应用的默认配置文件中。
创建本地Kubernetes ServiceAccounts:
为每个命名空间创建以下部分或全部本地Kubernetes ServiceAccounts:
如果要在命名空间中部署 MongoDB 实例,请使用
mongodb-kubernetes-database-pods。如果要在命名空间中部署 Ops Manager,请使用
mongodb-kubernetes-appdb和mongodb-kubernetes-ops-manager。
以下示例说明了 ClusterRole 和 ClusterRoleBinding 如何在集群中协同工作。
假设您在mongodb命名空间中创建一个 ServiceAccount,然后在此命名空间中安装 Kubernetes 操作符。Kubernetes 操作符 使用此 ServiceAccount。
要将 Kubernetes 操作符范围设置为监视命名空间ns1和ns2 ,请执行以下操作:
获取集群管理员权限。
使用这些特权,创建一个集群范围的、无命名空间的ClusterRole。
在三个命名空间中创建 ClusterRoleBinding:
mongodb、ns1和ns2。此 ClusterRoleBinding 会将 ClusterRole 绑定到mongodb命名空间中的 ServiceAccount。clusterRoleBinding将允许部署在mongodb命名空间中的Kubernetes Operator访问权限目标命名空间的clusterRole中描述的资源,即mongodb、ns1和ns2中描述的资源。
Operator 使用集群范围的作用域
您可以将Kubernetes Operator 的作用域设立为Kubernetes集群。在这种情况下, Kubernetes Operator 会监视Kubernetes集群中所有命名空间中的Ops Manager和MongoDB资源。
重要
对于每个 Kubernetes 集群,您只能部署一个具有集群范围范围的 Kubernetes Operator 实例。
要为 Kubernetes Operator 设置集群范围的作用域,请按照您的首选安装方法的说明进行操作。
指定 CPU 和内存资源要求
注意
以下注意事项适用:
本节中通过 Kubernetes Operator 进行常见 MongoDB 部署的所有大小调整和性能建议均可能更改。 请勿将这些建议视为任何类型的保证或限制。
这些建议反映了性能测试结果,也是我们对生产部署的建议。 我们在一个集群上运行了测试,该集群由七个类型为
t2.2xlarge的 AWS EC2 实例和一个类型为t2.medium的主节点组成。本节中的建议不讨论任何特定部署的特征。 您的部署特征可能与创建这些建议时所做的假设不同。 请联系MongoDB支持部门以获取有关大小调整的更多帮助。
在Kubernetes中,每个 Pod 都包含参数,允许您为 Pod 中的每个容器指定 CPU 资源 和 内存资源。
为了指示资源边界, Kubernetes使用 requests 和 limit 参数,其中:
request表示资源的下限。
limit表示资源的上限。
以下部分说明如何:
对于托管MongoDB Ops Manager 的Pod,请使用默认资源限制配置。
考虑推荐的存储实践
以下建议适用于MongoDB MongoDB Ops ManagerOperator托管的 部署和Kubernetes 应用程序数据库部署。
注意
存储类不需要冗余,因为MongoDB会自动在副本集或分片的成员之间复制数据。
您不能在副本集或分片的成员之间股票存储。
根据您的限制,使用可提供最佳性能的存储类。 请参阅扩展部署以学习;了解更多信息。
为您的存储类预配支持
ReadWriteOnce的持久卷。在工作线程节点级别,应用Linux上MongoDB的最佳实践。
确保使用支持卷扩展的存储类,以便启用调整数据库卷大小。
使用静态容器(公共预览版)
静态容器比非静态容器更简单、更安全。 静态容器在运行时是不可变的,这意味着它们不会从用于创建容器的映像中更改。 此外:
运行时,静态容器不会通过网络连接下载二进制文件或运行脚本或其他实用程序。 静态容器仅下载运行时配置文件。
运行时,静态容器不会修改除存储卷挂载之外的任何文件。
您可以对容器映像运行安全扫描,以确定实际运行的容器,并且运行的容器不会运行映像中定义以外的二进制文件。
静态容器不要求您在MongoDB MongoDB Ops Manager或其他 HTTPS 服务器上托管 二进制文件,如果您有气隙环境,这一点尤其有用。
您无法为静态容器运行大量
CMD脚本。您无法使用
initContainer在静态容器之间复制文件。
注意
使用静态容器时, MongoDB数据库 CR 和应用程序数据库部署之间的容器布局和资源限制不同。
当部署为静态容器时, MongoDB数据库 CR 由两个具有不同角色的容器组成:
The
mongodb-agent容器运行 MongoDB Agent,然后 MongoDB Agent 运行mongod进程。该容器处理实际的数据库工作负载。mongodb-enterprise-server容器提供MongoDB二进制文件,但不运行任何活动进程。
要修改MongoDB 数据库资源的资源限制,请在 mongodb-agent容器上指定所需的资源限制。在 mongodb-enterprise-server容器上设立的资源限制对性能没有功能性影响,但仍计入节点资源分配。
对于静态架构中的应用程序数据库,mongod 直接在 mongod容器中运行,而不是在 mongodb-agent 中运行。要修改应用程序数据库的资源限制,请改为在 mongod容器上指定所需的资源限制。
要学习;了解更多信息,请参阅静态容器(公共预览版)。
将 mongos Pod 与应用程序共置一地
您可以使用MongoDB在与应用程序相同的节点上运行轻量级 mongos实例。Kubernetes Operator 支持标准Kubernetes节点关联和反关联功能。利用这些功能,您可以在应用程序所在的同一节点上强制安装 mongos。
以下简短示例显示了关联性和多个可用区配置。
podAffinity键确定是否将应用程序安装在与其他应用程序相同的 Pod、节点或数据中心上。
要指定 Pod 关联性,请执行以下操作:
在
spec.podSpec.podTemplate.metadata.labelsYAML 集合中添加标签和值以标签部署。请参阅spec.podSpec.podTemplate.metadata和 Kubernetes PodSpec v1 Core API。指定
mongos在spec.mongosPodSpec.podAffinity.requiredDuringSchedulingIgnoredDuringExecution.labelSelectorYAML collection中使用的标签。matchExpressionscollection定义了labelKubernetes 操作符用来识别托管mongos。
例子
1 apiVersion: mongodb.com/v1 2 kind: MongoDB 3 metadata: 4 name: my-replica-set 5 spec: 6 members: 3 7 version: 8.0.0 8 service: my-service 9 10 ... 11 podTemplate: 12 spec: 13 affinity: 14 podAffinity: 15 requiredDuringSchedulingIgnoredDuringExecution: 16 - labelSelector: 17 matchExpressions: 18 - key: security 19 operator: In 20 values: 21 - S1 22 topologyKey: failure-domain.beta.kubernetes.io/zone 23 nodeAffinity: 24 requiredDuringSchedulingIgnoredDuringExecution: 25 nodeSelectorTerms: 26 - matchExpressions: 27 - key: kubernetes.io/e2e-az-name 28 operator: In 29 values: 30 - e2e-az1 31 - e2e-az2 32 podAntiAffinity: 33 requiredDuringSchedulingIgnoredDuringExecution: 34 - podAffinityTerm: 35 topologyKey: nodeId
请参阅 Affinity Samples目录中的 replica-set-affinity.yaml 中的多个可用区和节点关联性配置的完整示例。
此目录还包含分片集群和独立运行的实例 MongoDB 部署的关联性和多区域配置示例。
根据其用途为 MongoDB 服务命名
将spec.service参数设置为标识此部署用途的值,如以下示例所示。
1 apiVersion: mongodb.com/v1 2 kind: MongoDB 3 metadata: 4 name: my-replica-set 5 spec: 6 members: 3 7 version: "8.0.0" 8 service: drilling-pumps-geosensors 9 featureCompatibilityVersion: "8.0"
使用标签区分部署
使用Pod 关联性 Kubernetes功能可以:
分隔不同的 MongoDB 资源,例如
test、staging和production环境。将Pod放在某些特定节点上,以利用固态硬盘支持等功能。
1 mongosPodSpec: 2 podAffinity: 3 requiredDuringSchedulingIgnoredDuringExecution: 4 - labelSelector: 5 matchExpressions: 6 - key: security 7 operator: In 8 values: 9 - S1 10 topologyKey: failure-domain.beta.kubernetes.io/zone
提示
自定义 Kubernetes Operator 监视的 CustomResourceDefinitions
您可以指定希望 Kubernetes Operator 监视哪些自定义资源。 这样,您就可以仅为希望 Kubernetes 操作符托管的资源安装 CustomResourceDefinition。
您必须使用helm将 Kubernetes Operator 配置为仅监视您指定的自定义资源。 按照相关的helm安装说明进行操作,但进行以下调整:
决定要安装哪个 CustomResourceDefinition。 您可以安装任意数量的以下内容:
值说明mongodb安装数据库资源的 CustomResourceDefinitions 并监视这些资源。
mongodbusers为 MongoDB 用户资源安装 CustomResourceDefinitions 并监视这些资源。
opsmanagers安装 Ops Manager 的 CustomResourceDefinitions 并监视这些资源。
安装 Helm Chart 并指定您希望 Kubernetes 操作符 监视的 CustomResourceDefinition。
用逗号分隔每个自定义资源:
helm install <deployment-name> mongodb/mongodb-kubernetes \ --set operator.watchedResources="{mongodb,mongodbusers}" \ --skip-crds
确保正确的持久性配置
Kubernetes Operator 编排的Kubernetes部署是有状态的。Kubernetes容器使用持久卷在两次重启之间维护集群状态。
为了满足有状态要求,Kubernetes Operator 执行以下操作:
为MongoDB 部署创建持久卷。
将存储设备挂载到一个或多个称为挂载点的目录。
为每个 MongoDB 挂载点创建一个持久卷。
将每个 Kubernetes container中的默认路径设置为
/data。
为了满足 MongoDB 集群的存储需求,请对使用 Kubernetes Operator 部署的每个副本集的配置进行以下更改:
验证是否在
spec.persistent中启用了持久卷。 此设置默认为true。为 Kubernetes 操作符指定足够的存储量,以便为每个卷分配。卷存储数据和日志。
要设置多个卷,每个卷用于数据、日志和
oplog,请使用spec.podSpec.persistence.multiple.data。要设置单个卷来存储数据、日志和
oplog,请使用spec.podSpec.persistence.single。
以下简短示例显示了建议的持久存储大小。
1 apiVersion: mongodb.com/v1 2 kind: MongoDB 3 metadata: 4 name: my-replica-cluster 5 spec: 6 7 ... 8 persistent: true 9 10 11 shardPodSpec: 12 ... 13 persistence: 14 multiple: 15 data: 16 storage: "20Gi" 17 logs: 18 storage: "4Gi" 19 storageClass: standard
有关持久卷配置的完整示例,请参阅持久卷样本目录中的 replica-set-persistent-volumes.yaml。此目录还包含分片的集群和独立运行运行部署的持久卷配置示例。
为 Kubernetes 操作符 Pod 设置 CPU 和内存利用率边界
使用Kubernetes Operator部署MongoDB副本集时,初始协调进程会增加运行Kubernetes Operator 的 Pod 的 CPU 使用率。 但是,当副本集部署进程完成后, Kubernetes Operator 的 CPU 使用率会大幅降低。
注意
Kubernetes Operator 中 CPU 使用量峰值的严重性直接受Kubernetes Operator线程数的Kubernetes,因为线程数(由MDB_MAX_CONCURRENT_RECONCILES值定义)等于可以在任何给定时间并行运行的调节进程数。时间。
对于生产部署,为了满足与 Kubernetes 操作符并行部署最多 50 个 MongoDB 副本集或分片集群的需求,请为 Kubernetes 操作符 Pod 设置 CPU 和内存资源及限制,如下所示:
spec.template.spec.containers.resources.requests.cpu至 500mspec.template.spec.containers.resources.limits.cpu至 1100mspec.template.spec.containers.resources.requests.memory至 200Mispec.template.spec.containers.resources.limits.memory至 1Gi
如果使用 Helm部署资源,请在values.yaml文件中定义这些值。
以下简短示例显示了在 50 个副本集或分片集群部署中 Kubernetes 操作符 Pod 的建议 CPU 和内存边界配置。如果您部署的 MongoDB 集群少于 50 个,则可以在 Kubernetes 操作符 Pod 的配置文件中使用较小的数字。
例子
1 apiVersion: apps/v1 2 kind: Deployment 3 metadata: 4 name: mongodb-kubernetes-operator 5 namespace: mongodb 6 spec: 7 replicas: 1 8 selector: 9 matchLabels: 10 app.kubernetes.io/component: controller 11 app.kubernetes.io/name: mongodb-kubernetes-operator 12 app.kubernetes.io/instance: mongodb-kubernetes-operator 13 template: 14 metadata: 15 labels: 16 app.kubernetes.io/component: controller 17 app.kubernetes.io/name: mongodb-kubernetes-operator 18 app.kubernetes.io/instance: mongodb-kubernetes-operator 19 spec: 20 serviceAccountName: mongodb-kubernetes-operator 21 securityContext: 22 runAsNonRoot: true 23 runAsUser: 2000 24 containers: 25 - name: mongodb-kubernetes-operator 26 image: quay.io/mongodb/mongodb-kubernetes-operator:1.9.2 27 imagePullPolicy: Always 28 args: 29 - "-watch-resource=mongodb" 30 - "-watch-resource=opsmanagers" 31 - "-watch-resource=mongodbusers" 32 command: 33 - "/usr/local/bin/mongodb-kubernetes-operator" 34 resources: 35 limits: 36 cpu: 1100m 37 memory: 1Gi 38 requests: 39 cpu: 500m 40 memory: 200Mi
有关满足部署最多 50 个MongoDB副本集的Kubernetes Operator Pod 的 CPU 和内存利用率资源和限制的完整示例,请参阅 mongodb-kubernetes.yaml 文件。
为 MongoDB Pod 设置 CPU 和内存利用率边界
托管副本集或分片的集群的 Pod 的值映射到所创建 Pod 的 CPU 和内存的requests字段。这些值与针对MongoDB主机所述的注意事项一致。
Kubernetes Operator 使用分配的内存进行处理、WiredTiger 缓存以及在部署期间存储包。
对于生产部署,请按如下方式设置 MongoDB Pod 的 CPU 和内存资源及限制:
spec.podSpec.podTemplate.spec.containers.resources.requests.cpu至 0.25spec.podSpec.podTemplate.spec.containers.resources.limits.cpu至 0.25spec.podSpec.podTemplate.spec.containers.resources.requests.memory至 512Mspec.podSpec.podTemplate.spec.containers.resources.limits.memory至 512M
如果使用 Helm部署资源,请在values.yaml文件中定义这些值。
以下简短示例显示了部署中托管 MongoDB 副本集成员的每个 Pod 的配置以及建议的 CPU 和内存限制。
例子
1 apiVersion: mongodb.com/v1 2 kind: MongoDB 3 metadata: 4 name: my-replica-set 5 spec: 6 members: 3 7 version: 8.0.0 8 service: my-service 9 ... 10 11 persistent: true 12 podSpec: 13 podTemplate: 14 spec: 15 containers: 16 - name: mongodb-enterprise-database 17 resources: 18 limits: 19 cpu: "0.25" 20 memory: 512M
有关托管MongoDB副本集成员的 Pod 的 CPU 和内存利用率资源和限制的完整示例,请参阅MongoDB Podspec 样本目录中的 replica-set-podspec.yaml文件。
此目录还包含 Pod 的 CPU 和内存限制配置示例,用于:
sharded-cluster-podspec.yaml 中的分片集群。
独立运行MongoDB部署,位于standalone-podspec.yaml中。
使用多个可用区
设置Kubernetes Operator 和 StatefulSets,将一个副本集的所有成员分布到不同节点,以确保高可用性。
以下简短示例显示了关联性和多个可用区配置。
例子
1 apiVersion: mongodb.com/v1 2 kind: MongoDB 3 metadata: 4 name: my-replica-set 5 spec: 6 members: 3 7 version: 8.0.0 8 service: my-service 9 ... 10 podAntiAffinityTopologyKey: nodeId 11 podAffinity: 12 requiredDuringSchedulingIgnoredDuringExecution: 13 - labelSelector: 14 matchExpressions: 15 - key: security 16 operator: In 17 values: 18 - S1 19 topologyKey: failure-domain.beta.kubernetes.io/zone 20 21 nodeAffinity: 22 requiredDuringSchedulingIgnoredDuringExecution: 23 nodeSelectorTerms: 24 - matchExpressions: 25 - key: kubernetes.io/e2e-az-name 26 operator: In 27 values: 28 - e2e-az1 29 - e2e-az2
在此示例中,Kubernetes Operator 将 Pod 部署安排到e2e-az1或e2e-az2可用区中具有标签kubernetes.io/e2e-az-name的节点。 更改nodeAffinity以安排将 Pod 部署到所需的区域。
请参阅 Affinity 样本目录中的 replica-set-affinity.yaml 中的多个可用区配置的完整示例。
此目录还包含分片集群和独立运行的实例 MongoDB 部署的关联性和多区域配置示例。
增加线程数以并行运行多个调节进程
如果计划并行部署超过10个MongoDB副本集,则可以通过在Kubernetes Operator部署中设置MDB_MAX_CONCURRENT_RECONCILES环境变量,或通过 .maxConcurrentReconciles 操作操作符,将Kubernetes Operator 配置为并行运行多个协调进程。 字段以配置更高的values.yaml文件。
增加Kubernetes Operator 的线程数可让您将Kubernetes Operator部署垂直扩展为Kubernetes集群内运行的数百个MongoDB资源,并优化 CPU 利用率。
请监控Kubernetes API 服务器和Kubernetes Operator资源使用情况,并在必要时调整各自的资源分配。
注意
将MDB_MAX_CONCURRENT_RECONCILES 增加到超过10时,请务必谨慎。 特别是,您必须密切监控Kubernetes Operator 和Kubernetes API ,以避免因这些组件的负载增加而导致停机。
要确定适合部署需求的线程数,请遵循以下准则:
您对Kubernetes Operator 在协调大量资源时的响应速度的要求
Kubernetes环境中可用的计算资源以及Kubernetes计算资源承受的总处理负载,包括可能与MongoDB无关的资源
要增加单个Kubernetes Operator实例的线程数,同时增加Kubernetes集群中可支持的MongoDB资源数量,另一种方法是在Kubernetes集群中部署多个Kubernetes Operator 实例。但是,部署多个Kubernetes Operator 实例需要确保没有两个Kubernetes Operator 实例监控相同的MongoDB资源。
运行多个Kubernetes Operator实例时应小心谨慎,因为更多Kubernetes Operator 实例(尤其是启用了并行协调功能的情况下)会使API 服务器面临更大的过载风险。
Kubernetes API服务器的扩展不是运行多个Kubernetes Operator实例的正当理由。 如果您发现API 服务器的性能受到影响,则添加更多Kubernetes Operator 实例可能会使问题变得更加复杂。