NodeAffinityとPodAffinityを定義することで、Kubernetes 内で MongoDB リソースの配置トポロジーを構成できます。 NodeAffinityとPodAffinityは、Kubernetes が Kubernetes クラスターに MongoDB カスタム リソースを配置する場所を指定します。
Kubernetesクラスター内の特定のノードにノードラベルを適用し、labelSelector MongoDB CustomResourceDefinition で対応するラベルを持つ フィールドを定義することで、ノードアフィニティを実装できます。ノードラベルを適用し、labelSelector 値と一致すると、 Kubernetes は、 Kubernetesクラスター内で指定されたノードに特定のMongoDB CustomResourceDefinition のみを配置します。ノードアフィニティ ルールを実装すると、特定のノードノードにMongoDBリソースを配置する際に便利です。
同様に、クラスター内で実行中いるポッドにラベルを適用し、それらのラベル値をMongoDBCustomResourceDefinitionで定義されたlabelSelector値と整合させることで、Podアフィニティを実装できます。ラベルを適用し、labelSelector 値と一致させると、 Kubernetes は、一致するラベルが適用されたポッドとMongoDBカスタム リソースが管理するポッドとを照合します。ポッドを照合することで、システムのパフォーマンスが向上し、定期的に通信するポッド間のレイテンシが軽減されます。また、照合してはなりません。
スタンドアロンおよびレプリカセットの配置では、これらのアフィニティ ルールをMongoDB spec.podSpec の CustomResourceDefinition に適用できます。シャードクラスタ配置の場合、これらのアフィニティ ルールはMongoDBspec.configSrvPodSpec CustomResourceDefinitionspec.mongosPodSpec の 、spec.shardPodSpec 、および セクションに適用できます。
クラスターを配置する場合、mongos、シャード、コンフィギュレーションサーバーなどのMongoDBリソースは、 MongoDBリソースと同じ名前空間に配置する必要があります。ただし、その名前空間内では、 ShardedCluster CustomResourceDefinition で、mongos、シャード、コンフィギュレーションサーバーのリソースタイプに対して nodeAffinity と podAffinity を構成できます。
前提条件
MongoDBデプロイの配置トポロジーを構成するには、 MongoDB Kubernetes Operator を通じて配置されたMongoDBレプリカセットと、labelSelectors MongoDB CustomResourceDefinition で定義された と一致するKubernetesリソースに適用されたラベルが必要です。または、次の前提条件を満たす必要があります。
MongoDB CustomResourceDefinition で定義された
labelSelectorsと一致するKubernetesリソースに適用されるラベル。
手順
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