Configure Cluster Topology for MongoDB Resources
On this page
You can configure the deployment topology of your MongoDB resources within
Kubernetes by defining NodeAffinity
and PodAffinity
.
NodeAffinity
and PodAffinity
specify
where Kubernetes deploys MongoDB custom resources in your Kubernetes cluster.
You can implement node affinity by applying node labels to specific
nodes within your Kubernetes cluster and defining labelSelector
fields
with corrosponding labels in your MongoDB CustomResourceDefinition. When you apply
node labels and matching labelSelector
values, Kubernetes only
deploys a given MongoDB CustomResourceDefinition on the nodes you
specify within your Kubernetes cluster. Implementing node affinity rules can be useful when
deploying MongoDB resources in heterogeneous node groups, as it allows you
to deploy specific resources on specific node varieties.
Similarly, you can implement Pod affinity by applying labels to Pods that are
running in your cluster and aligning those label values with labelSelector
values defined in your MongoDB CustomResourceDefinition. When you apply labels
and matching labelSelector
values, Kubernetes colocates MongoDB
custom resource-managed Pods with Pods with matching labels applied. By
collocating Pods, you can improve system performance and reduce latency
between Pods that communicate regularly. You can also define Pod antiaffinity
rules which allow you to specify Pods which should not be colocated.
For Standalone and Replica Set deployments, you can apply these affinity rules
to the spec.podSpec
of your MongoDB CustomResourceDefinition.
For Sharded Cluster deployments, you can apply these affinity rules to the
spec.configSrvPodSpec
, spec.shardPodSpec
,
and spec.mongosPodSpec
sections of your MongoDB CustomResourceDefinition.
You must deploy MonogDB resources, such as mongos
, shards,
and config servers in the case of a Sharded Cluster deployment,
in the same namespace as the MongoDB resource. However, within that namespace,
you can configure the nodeAffinity
and podAffinity
for mongos
,
shards, and config server resource types in the ShardedCluster
CustomResourceDefinition.
Prerequisites
To configure the deployment topology for your
MongoDB deployment, you must either have a MongoDB replica set deployed
through the MongoDB Kubernetes Operator along with labels applied
to the Kubernetes resources that will align with labelSelectors
defined
in the MongoDB CustomResourceDefinition or meet the following prerequisites:
Credentials for the Kubernetes Operator or configure a different secret storage tool.
Labels applied to the Kubernetes resources that will align with
labelSelectors
defined in the MongoDB CustomResourceDefinition.
Procedure
Update your MongoDB CRD manifest.
Populate the podTemplate.affinity
sections of your MongoDB Sharded Cluster
definition as shown in the following example:
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 ...