Docs 菜单
Docs 主页
/
Enterprise Kubernetes Operator
/ /

Considerations

本页详细介绍了 MongoDB Enterprise Kubernetes Operator 在生产环境中运行时的最佳实践和系统配置建议。

我们建议您使用 Kubernetes Operator 的单个实例并行部署最多 20 个副本集。

可以将此数字增加到 50,并预期 Kubernetes 操作符 下载、安装、部署和协调其资源所需的时间会合理增加。

对于 50 个副本集,部署时间各不相同,最长可能需要 40 分钟。 该时间取决于 Kubernetes 集群的网络带宽以及每个 MongoDB 助手从互联网上为每个 MongoDB 集群节点下载 MongoDB 安装二进制文件所需的时间。

要并行部署 50 个以上的 MongoDB 副本集,请使用 Kubernetes 操作符的多个实例。

注意

以下注意事项适用:

  • 本节中通过 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 Manager HTTPS 服务器上托管 二进制文件。

  • 您无法为静态容器运行大量CMD脚本。

  • 您无法使用initContainer在静态容器之间复制文件。

注意

作为静态容器部署时, Kubernetes Operator部署由两个容器组成 — 一个 mongodb-agent容器和一个 mongodb-enterprise-server容器。MongoDB 数据库自定义资源从 mongodb-agent容器继承资源限制定义,该容器在静态容器部署中运行 mongod进程。要修改MongoDB 数据库资源的资源限制,必须在 mongodb-agent容器上指定所需的资源限制。

要学习;了解详情,请参阅静态容器(公共预览版)。

您可以使用MongoDB在与应用程序相同的节点上运行轻量级 mongos实例。Kubernetes Operator 支持标准Kubernetes节点关联和反关联功能。利用这些功能,您可以在应用程序所在的同一节点上强制安装 mongos

以下简短示例显示了关联性和多个可用区配置。

podAffinity键确定是否将应用程序安装在与其他应用程序相同的 Pod、节点或数据中心上。

要指定 Pod 关联性,请执行以下操作:

  1. spec.podSpec.podTemplate.metadata.labels YAML 集合中添加标签和值以标签部署。请参阅 spec.podSpec.podTemplate.metadataKubernetes PodSpec v1 Core API。

  2. 指定mongosspec.mongosPodSpec.podAffinity .requiredDuringSchedulingIgnoredDuringExecution.labelSelector YAML collection中使用的标签。matchExpressionscollection定义了label Kubernetes 操作符用来识别托管mongos

例子

1apiVersion: mongodb.com/v1
2kind: MongoDB
3metadata:
4 name: my-replica-set
5spec:
6 members: 3
7 version: 4.2.1-ent
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 部署的关联性和多区域配置示例。

提示

spec.service参数设置为标识此部署用途的值,如以下示例所示。

1apiVersion: mongodb.com/v1
2kind: MongoDB
3metadata:
4 name: my-replica-set
5spec:
6 members: 3
7 version: "4.4.0-ent"
8 service: drilling-pumps-geosensors
9 featureCompatibilityVersion: "4.0"

使用Pod 关联性 Kubernetes功能可以:

  • 分隔不同的 MongoDB 资源,例如teststagingproduction环境。

  • Pod放在某些特定节点上,以利用固态硬盘支持等功能。

1mongosPodSpec:
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 监视哪些自定义资源。 这样,您就可以仅为希望 Kubernetes 操作符托管的资源安装 CustomResourceDefinition。

您必须使用helm将 Kubernetes Operator 配置为仅监视您指定的自定义资源。 按照相关的helm安装说明进行操作,但进行以下调整:

  1. 决定要安装哪个 CustomResourceDefinition。 您可以安装任意数量的以下内容:

    说明

    mongodb

    安装数据库资源的 CustomResourceDefinitions 并监视这些资源。

    mongodbusers

    为 MongoDB 用户资源安装 CustomResourceDefinitions 并监视这些资源。

    opsmanagers

    安装 Ops Manager 的 CustomResourceDefinitions 并监视这些资源。

  2. 安装 Helm Chart 并指定您希望 Kubernetes 操作符 监视的 CustomResourceDefinition。

    用逗号分隔每个自定义资源:

    helm install <deployment-name> mongodb/enterprise-operator \
    --set operator.watchedResources="{mongodb,mongodbusers}" \
    --skip-crds

Kubernetes Operator 编排的Kubernetes部署是有状态的。Kubernetes容器使用持久卷在两次重启之间维护集群状态。

为了满足有状态要求,Kubernetes Operator 执行以下操作:

  • 为MongoDB 部署创建持久卷

  • 将存储设备挂载到一个或多个称为挂载点的目录。

  • 为每个 MongoDB 挂载点创建一个持久卷。

  • 将每个 Kubernetes container中的默认路径设置为/data

为了满足 MongoDB 集群的存储需求,请对使用 Kubernetes Operator 部署的每个副本集的配置进行以下更改:

以下简短示例显示了建议的持久存储大小。

1apiVersion: mongodb.com/v1
2kind: MongoDB
3metadata:
4 name: my-replica-cluster
5spec:
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 操作符部署副本集时,用于托管 Kubernetes 操作符的 Pod 的 CPU 使用率在协调过程中最初很高,但在部署完成时会降低。

对于生产部署,为了满足与 Kubernetes 操作符并行部署最多 50 个 MongoDB 副本集或分片集群的需求,请为 Kubernetes 操作符 Pod 设置 CPU 和内存资源及限制,如下所示:

  • spec.template.spec.containers.resources.requests.cpu 至 500m

  • spec.template.spec.containers.resources.limits.cpu 至 1100m

  • spec.template.spec.containers.resources.requests.memory 至 200Mi

  • spec.template.spec.containers.resources.limits.memory 至 1Gi

如果不包含 CPU 的测量单位, Kubernetes会将其解释为核心数。如果您指定 m,例如 500m, Kubernetes会将其解释为 millis。要学习;了解详情,请参阅 CPU 的含义。

以下简短示例显示了在 50 个副本集或分片集群部署中 Kubernetes 操作符 Pod 的建议 CPU 和内存边界配置。如果您部署的 MongoDB 集群少于 50 个,则可以在 Kubernetes 操作符 Pod 的配置文件中使用较小的数字。

注意

监控工具报告节点的大小,而不是容器的实际大小。

例子

1apiVersion: apps/v1
2kind: Deployment
3metadata:
4 name: mongodb-enterprise-operator
5 namespace: mongodb
6spec:
7 replicas: 1
8 selector:
9 matchLabels:
10 app.kubernetes.io/component: controller
11 app.kubernetes.io/name: mongodb-enterprise-operator
12 app.kubernetes.io/instance: mongodb-enterprise-operator
13 template:
14 metadata:
15 labels:
16 app.kubernetes.io/component: controller
17 app.kubernetes.io/name: mongodb-enterprise-operator
18 app.kubernetes.io/instance: mongodb-enterprise-operator
19 spec:
20 serviceAccountName: mongodb-enterprise-operator
21 securityContext:
22 runAsNonRoot: true
23 runAsUser: 2000
24 containers:
25 - name: mongodb-enterprise-operator
26 image: quay.io/mongodb/mongodb-enterprise-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-enterprise-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-enterprise.yaml 文件。

托管副本集或分片的集群的 Pod 的值映射到所创建 Pod 的 CPU 和内存的requests字段。这些值与针对MongoDB主机所述的注意事项一致。

Kubernetes Operator 使用分配的内存进行处理、WiredTiger 缓存以及在部署期间存储包。

对于生产部署,请按如下方式设置 MongoDB Pod 的 CPU 和内存资源及限制:

  • spec.podSpec.podTemplate.spec.containers.resources.requests.cpu 至 0.25

  • spec.podSpec.podTemplate.spec.containers.resources.limits.cpu 至 0.25

  • spec.podSpec.podTemplate.spec.containers.resources.requests.memory 至 512M

  • spec.podSpec.podTemplate.spec.containers.resources.limits.memory 至 512M

如果不包含 CPU 的测量单位, Kubernetes会将其解释为核心数。如果您指定 m,例如 500m, Kubernetes会将其解释为 millis。要学习;了解详情,请参阅 CPU 的含义。

以下简短示例显示了部署中托管 MongoDB 副本集成员的每个 Pod 的配置以及建议的 CPU 和内存限制。

例子

1apiVersion: mongodb.com/v1
2kind: MongoDB
3metadata:
4name: my-replica-set
5spec:
6 members: 3
7 version: 4.0.0-ent
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 和内存限制配置示例,用于:

设置Kubernetes Operator 和 StatefulSet,将一个副本集的所有成员分布到不同节点,以确保高可用性。

以下简短示例显示了关联性和多个可用区配置。

例子

1apiVersion: mongodb.com/v1
2kind: MongoDB
3metadata:
4 name: my-replica-set
5spec:
6 members: 3
7 version: 4.2.1-ent
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-az1e2e-az2可用区中具有标签kubernetes.io/e2e-az-name的节点。 更改nodeAffinity以安排将 Pod 部署到所需的区域。

请参阅 Affinity 样本目录中的 replica-set-affinity.yaml 中的多个可用区配置的完整示例。

此目录还包含分片集群和独立运行的实例 MongoDB 部署的关联性和多区域配置示例。

后退

设置部署范围

在此页面上