WebLogic Kubernetes Operatorは、起動される各WebLogic Serverインスタンスのポッドを作成します。 次に、「Kubernetesスケジューラ」はポッドごとにノードを選択します。 デフォルトのスケジューリング・アルゴリズムでは、必要なコンテナ・イメージがすでにプルされているノードを選択する場合に大幅に重み付けされるため、多くの場合、Kubernetesは同じノード上でWebLogic Serverインスタンスのポッドの多くを実行しますが、他のノードはあまり利用されません。 これは、一般的に「ノード・ヒーティングの問題」と呼ばれます。
解決策の1つは、ノードのプロビジョニングの一環として、必要なすべてのコンテナ・イメージをワーカー・ノードで使用できるようにすることです。 必要なコンテナ・イメージが各ワーカー・ノードで使用可能な場合、Kubernetesスケジューラは、かわりに、使用可能なCPUおよびメモリーや単純なラウンドロビンなどの他のファクタに基づいてノードを選択します。
オペレータ・チームは、「インターポッド・アフィニティとアンチ・アフィニティ」に基づく別のソリューションを推奨します。 このソリューションには、ノード・ヒーティング問題の解決と、特定のクラスタまたはドメインからWebLogic Serverインスタンスのポッドをより広範囲に分散するようにKubernetesスケジューラに明示的に指示する利点があります。 ポッド・アフィニティとアンチ・アフィニティは、スケジューラがすでに実行中のポッドの詳細に基づいて新しいポッドのノードを選択できるようにするKubernetesスケジューラの機能です。 WebLogic Serverユースケースでは、多くの場合、サーバー・インスタンスが使用可能なノードに分散するように、他のWebLogic Serverインスタンスのポッドとのアンチ・アフィニティを目的とします。
オペレータ・バージョン4.0から、デフォルトでは、オペレータは、ドメイン・カスタム・リソースのクラスタ・スコープのserverPod
要素に次のコンテンツを追加します。
clusters:
- clusterName: cluster-1
serverPod:
affinity:
podAntiAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 100
podAffinityTerm:
labelSelector:
matchExpressions:
- key: "weblogic.clusterName"
operator: In
values:
- $(CLUSTER_NAME)
- key: "weblogic.domainUID"
operator: In
values:
- $(DOMAIN_UID)
topologyKey: "kubernetes.io/hostname"
ここでのserverPod
要素はクラスタにスコープ指定されているため、affinity
要素のコンテンツは、このWebLogicクラスタのメンバーである各WebLogic Serverインスタンスに対して生成されたポッドに追加されます。 このポッド間アンチ・アフィニティ文は、スケジューラが新しいポッドに対してノードを選択するプリファレンスを表します。これによって、ラベルweblogic.clusterName
およびこのクラスタの名前を持つポッドがすでにあるノードと、ラベルweblogic.domainUID
およびこのドメインのUIDが回避されます。 weight
は最大重量である100
に設定されているため、この用語はコンテナ・イメージの可用性に基づいてノードの可能なプリファレンスを上回ることに注意してください。
WebLogicクラスタの一部ではないサーバー・ポッドの場合、オペレータは、ドメイン・カスタム・リソースのドメイン・スコープのserverPod
要素に次のコンテンツを追加します。 次に示すのはアフィニティ対策ですが、ドメイン内のすべてのWebLogic Serverインスタンスが、実行中のインスタンスに対してポッドがまだないノードで実行することを希望するようにテストを変更します。
clusters:
- clusterName: cluster-1
serverStartState: "RUNNING"
serverPod:
affinity:
podAntiAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 100
podAffinityTerm:
labelSelector:
matchExpressions:
- key: "weblogic.domainUID"
operator: In
values:
- $(DOMAIN_UID)
topologyKey: "kubernetes.io/hostname"
デフォルトのアフィニティ設定をカスタマイズしたり、ほかの多くのスケジューリング設定や制約を表示したりできます。 次の例も同様に、アンチ・アフィニティを表しますが、ドメイン内のすべてのWebLogic Serverインスタンスが、S1
の値を持つsecurity
ラベルを持つPodがまだないノードで実行することを希望するようにテストを変更します。
serverPod:
affinity:
podAntiAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 100
podAffinityTerm:
labelSelector:
matchExpressions:
- key: "security"
operator: In
values:
- "S1"
topologyKey: "kubernetes.io/hostname"
ラベルや変数置換の詳細など、オペレータがWebLogic Serverインスタンスのポッドを生成する方法の詳細は、「こちら」を参照してください。