为MongoDB资源配置集群拓扑
您可以通过定义 NodeAffinity
和PodAffinity
在Kubernetes中配置MongoDB资源的部署拓扑结构。 NodeAffinity
和PodAffinity
指定Kubernetes在Kubernetes集群中部署MongoDB自定义资源的位置。
您可以通过将节点标签应用于Kubernetes集群中的特定节点,并在MongoDB CustomResourceDefinition 中定义具有相应标签的 字段,来实现 节点关联性labelSelector
。当您应用节点标签并匹配 labelSelector
值时, Kubernetes仅在您在Kubernetes集群中指定的节点上部署给定的MongoDB CustomResourceDefinition。在异构节点组中部署MongoDB资源时,实施节点关联性规则非常有用,因为它允许您在特定的节点类型上部署特定的资源。
同样,您可以通过应用 标签 来实现Pod 亲和性 到集群中运行的labelSelector
Pod,并将这些标签值与MongoDB CustomResourceDefinition 中定义的 值保持一致 。应用 标签 时 和匹配的labelSelector
值,Kubernetes MongoDB自定义资源托管 Pod 与应用了匹配标签的 Pod 并置。通过并置 Pod,可以提高系统性能并减少定期通信的 Pod 之间的延迟。 您还可以定义 Pod 反关联规则,指定不应共置的 Pod。
spec.podSpec
对于独立运行和副本集部署,您可以应用这些关联性规则应用于MongoDB CustomResourceDefinition 的 。对于分片集群部署,您可以应用这些关联性规则应用于MongoDB CustomResourceDefinitionspec.mongosPodSpec
的spec.configSrvPodSpec
、spec.shardPodSpec
和 部分 。
您必须部署MonogDB 资源(例如分片集群部署中的mongos
、分片和配置服务器)部署在与MongoDB资源相同的命名空间中。 但是,在该命名空间内,您可以在 CustomResourceDefinition 中为 nodeAffinity
podAffinity
mongos
、分片和配置服务器资源类型配置 和ShardedCluster
。 。
先决条件
要为MongoDB 部署配置部署拓扑结构,您必须通过MongoDB Kubernetes OperatorlabelSelectors
部署MongoDB副本集,并应用到Kubernetes资源的标签,这些标签将与MongoDB CustomResourceDefinition 中定义的 保持一致。 或满足以下先决条件:
应用于Kubernetes资源的标签,这些标签将与MongoDB CustomResourceDefinition 中定义的 保持一致
labelSelectors
。
步骤
更新您的MongoDB CRD 清单。
填充MongoDB分片集群定义的podTemplate.affinity
部分,如以下示例所示:
1 2 apiVersion: mongodb.com/v1 3 kind: MongoDB 4 metadata: 5 name: my-sharded-cluster 6 spec: 7 shardCount: 2 8 mongodsPerShardCount: 3 9 mongosCount: 2 10 configServerCount: 3 11 version: 6.0.0 12 service: my-service 13 14 opsManager: 15 configMapRef: 16 name: my-project 17 credentials: my-credentials 18 type: ShardedCluster 19 20 persistent: true 21 configSrvPodSpec: 22 podTemplate: 23 spec: 24 affinity: 25 podAffinity: 26 requiredDuringSchedulingIgnoredDuringExecution: 27 - labelSelector: 28 matchExpressions: 29 - key: security 30 operator: In 31 values: 32 - S1 33 topologyKey: failure-domain.beta.kubernetes.io/zone 34 nodeAffinity: 35 requiredDuringSchedulingIgnoredDuringExecution: 36 nodeSelectorTerms: 37 - matchExpressions: 38 - key: kubernetes.io/e2e-az-name 39 operator: In 40 values: 41 - e2e-az1 42 - e2e-az2 43 podAntiAffinity: 44 requiredDuringSchedulingIgnoredDuringExecution: 45 - podAffinityTerm: 46 topologyKey: nodeId 47 mongosPodSpec: 48 podTemplate: 49 spec: 50 affinity: 51 podAffinity: 52 requiredDuringSchedulingIgnoredDuringExecution: 53 - labelSelector: 54 matchExpressions: 55 - key: security 56 operator: In 57 values: 58 - S1 59 topologyKey: failure-domain.beta.kubernetes.io/zone 60 nodeAffinity: 61 requiredDuringSchedulingIgnoredDuringExecution: 62 nodeSelectorTerms: 63 - matchExpressions: 64 - key: kubernetes.io/e2e-az-name 65 operator: In 66 values: 67 - e2e-az1 68 - e2e-az2 69 podAntiAffinity: 70 requiredDuringSchedulingIgnoredDuringExecution: 71 - podAffinityTerm: 72 topologyKey: nodeId 73 shardPodSpec: 74 podTemplate: 75 spec: 76 affinity: 77 podAffinity: 78 requiredDuringSchedulingIgnoredDuringExecution: 79 - labelSelector: 80 matchExpressions: 81 - key: security 82 operator: In 83 values: 84 - S1 85 topologyKey: failure-domain.beta.kubernetes.io/zone 86 nodeAffinity: 87 requiredDuringSchedulingIgnoredDuringExecution: 88 nodeSelectorTerms: 89 - matchExpressions: 90 - key: kubernetes.io/e2e-az-name 91 operator: In 92 values: 93 - e2e-az1 94 - e2e-az2 95 podAntiAffinity: 96 requiredDuringSchedulingIgnoredDuringExecution: 97 - podAffinityTerm: 98 topologyKey: nodeId 99 ...