您可以通过定义NodeAffinity和PodAffinity在Kubernetes中配置MongoDB资源的部署拓扑结构。 NodeAffinity和PodAffinity指定Kubernetes在Kubernetes集群中部署MongoDB自定义资源的位置。
您可以通过将 节点标签labelSelector 应用于Kubernetes集群中的特定节点,并在MongoDB CustomResourceDefinition 中定义具有相应标签的 字段实现 节点关联性 。当您应用节点标签并匹配labelSelector值时,Kubernetes仅在Kubernetes集群中您指定的节点上部署给定的MongoDBCustomResourceDefinition。在异构节点组中部署MongoDB资源时,实施节点关联性规则非常有用,因为它允许您在特定的节点类型上部署特定的资源。
同样,您可以通过向集群中运行的Pod 应用标签,并将这些标签值与MongoDB CustomResourceDefinition 中定义的 labelSelector 值对齐来实现Pod 关联性。当您应用标签并匹配 labelSelector 值时,Kubernetes会将MongoDB自定义资源托管 Pod 与应用了匹配标签的 Pod 并置。通过并置 Pod,可以提高系统性能并减少定期通信的 Pod 之间的延迟。您还可以定义 Pod 反关联规则,指定不应共置的 Pod。
对于独立运行和副本集部署,您可以应用spec.podSpec的MongoDB CustomResourceDefinition。对于分片集群部署,您可以应用MongoDB CustomResourceDefinitionspec.mongosPodSpec 的spec.configSrvPodSpec 、spec.shardPodSpec 和 部分。
您必须将MongoDB资源(例如分片集群部署中的 mongos、分片和配置服务器)部署在与MongoDB资源相同的命名空间中。但是,在该命名空间内,您可以在 ShardedCluster CustomResourceDefinition 中配置 mongos、分片和配置服务器资源类型的 nodeAffinity 和 podAffinity。
先决条件
要为MongoDB 部署配置部署拓扑结构,您必须通过MongoDB Kubernetes Operator 部署MongoDB副本集,并应用于Kubernetes资源的标签,这些标签将与MongoDB CustomResourceDefinition 中定义的 labelSelectors 保持一致,或者满足以下先决条件:
应用于Kubernetes资源的标签,这些标签将与MongoDB CustomResourceDefinition 中定义的
labelSelectors保持一致。
步骤
更新您的MongoDB CRD 清单。
填充MongoDB分片集群定义的podTemplate.spec.affinity部分,如以下示例所示:
apiVersion: mongodb.com/v1kind: MongoDBmetadata: name: my-sharded-clusterspec: shardCount: 2 mongodsPerShardCount: 3 mongosCount: 2 configServerCount: 3 version: 8.0.0 service: my-service
opsManager: configMapRef: name: my-project credentials: my-credentials type: ShardedCluster
persistent: true configSrvPodSpec: podTemplate: spec: affinity: podAffinity: requiredDuringSchedulingIgnoredDuringExecution: - labelSelector: matchExpressions: - key: security operator: In values: - S1 topologyKey: failure-domain.beta.kubernetes.io/zone nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: - key: kubernetes.io/e2e-az-name operator: In values: - e2e-az1 - e2e-az2 podAntiAffinity: requiredDuringSchedulingIgnoredDuringExecution: - podAffinityTerm: topologyKey: nodeId mongosPodSpec: podTemplate: spec: affinity: podAffinity: requiredDuringSchedulingIgnoredDuringExecution: - labelSelector: matchExpressions: - key: security operator: In values: - S1 topologyKey: failure-domain.beta.kubernetes.io/zone nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: - key: kubernetes.io/e2e-az-name operator: In values: - e2e-az1 - e2e-az2 podAntiAffinity: requiredDuringSchedulingIgnoredDuringExecution: - podAffinityTerm: topologyKey: nodeId shardPodSpec: podTemplate: spec: affinity: podAffinity: requiredDuringSchedulingIgnoredDuringExecution: - labelSelector: matchExpressions: - key: security operator: In values: - S1 topologyKey: failure-domain.beta.kubernetes.io/zone nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: - key: kubernetes.io/e2e-az-name operator: In values: - e2e-az1 - e2e-az2 podAntiAffinity: requiredDuringSchedulingIgnoredDuringExecution: - podAffinityTerm: topologyKey: nodeId