9.12. Pod スケジューリングの設定
同じ OpenShift ノード上でスケジュールされたアプリケーション間のリソース競合によるパフォーマンスの低下を回避するために、Kafka Pod を重要なワークロードとは別にスケジュールできます。これは、特定のノードを選択するか、ノードのセットを Kafka 専用にすることで実現できます。
9.12.1. アフィニティー、容認 (Toleration)、およびトポロジー分散制約の指定
アフィニティー、容認 (Toleration)、およびトポロジー分散制約を使用して、kafka リソースの Pod をノードにスケジュールします。アフィニティー、容認 (Toleration)、およびトポロジー分散制約は、以下のリソースの affinity
、tolerations
、および topologySpreadConstraint
プロパティーを使用して設定されます。
-
Kafka.spec.kafka.template.pod
-
Kafka.spec.zookeeper.template.pod
-
Kafka.spec.entityOperator.template.pod
-
KafkaConnect.spec.template.pod
-
KafkaBridge.spec.template.pod
-
KafkaMirrorMaker.spec.template.pod
-
KafkaMirrorMaker2.spec.template.pod
affinity
、tolerations
、および topologySpreadConstraint
プロパティーの形式は、OpenShift の仕様に準拠します。アフィニティー設定には、さまざまなタイプのアフィニティーを含めることができます。
- Pod のアフィニティーおよび非アフィニティー
- ノードのアフィニティー
関連情報
9.12.1.1. Pod の非アフィニティーを使用して重要なアプリケーションがノードを共有しないようにする
Pod の非アフィニティーを使用して、重要なアプリケーションが同じディスクにスケジュールされないようにします。Kafka クラスターの実行時に、Pod の非アフィニティーを使用して、Kafka ブローカーがデータベースなどの他のワークロードとノードを共有しないようにすることが推奨されます。
9.12.1.2. ノードのアフィニティーを使用したワークロードの特定ノードへのスケジュール
OpenShift クラスターは通常、さまざまなタイプのワーカーノードで構成されます。ワークロードが非常に大きい環境の CPU に対して最適化されたものもあれば、メモリー、ストレージ (高速のローカル SSD)、または ネットワークに対して最適化されたものもあります。異なるノードを使用すると、コストとパフォーマンスの両面で最適化しやすくなります。最適なパフォーマンスを実現するには、Streams for Apache Kafka コンポーネントが適切なノードを使用するようにスケジュール設定することが重要です。
OpenShift はノードのアフィニティーを使用してワークロードを特定のノードにスケジュールします。ノードのアフィニティーにより、Pod がスケジュールされるノードにスケジューリングの制約を作成できます。制約はラベルセレクターとして指定されます。beta.kubernetes.io/instance-type
などの組み込みノードラベルまたはカスタムラベルのいずれかを使用してラベルを指定すると、適切なノードを選択できます。
9.12.1.3. 専用ノードへのノードのアフィニティーと容認 (Toleration) の使用
テイントを使用して専用ノードを作成し、ノードのアフィニティーおよび容認 (Toleration) を設定して専用ノードに Kafka Pod をスケジュールします。
クラスター管理者は、選択した OpenShift ノードをテイントとしてマーク付けできます。テイントのあるノードは、通常のスケジューリングから除外され、通常の Pod はそれらのノードでの実行はスケジュールされません。ノードに設定されたテイントを許容できるサービスのみをスケジュールできます。このようなノードで実行されるその他のサービスは、ログコレクターやソフトウェア定義のネットワークなどのシステムサービスのみです。
専用のノードで Kafka とそのコンポーネントを実行する利点は多くあります。障害の原因になったり、Kafka に必要なリソースを消費するその他のアプリケーションが同じノードで実行されません。これにより、パフォーマンスと安定性が向上します。
9.12.2. それぞれの Kafka ブローカーを別のワーカーノードでスケジュールするための Pod の非アフィニティーの設定
多くの Kafka ブローカーまたは ZooKeeper ノードは、同じ OpenShift ワーカーノードで実行できます。ワーカーノードが失敗すると、それらはすべて同時に利用できなくなります。信頼性を向上させるために、podAntiAffinity
設定を使用して、各 Kafka ブローカーまたは ZooKeeper ノードを異なる OpenShift ワーカーノードにスケジュールすることができます。
前提条件
- OpenShift クラスター
- 稼働中の Cluster Operator
手順
クラスターデプロイメントを指定するリソースの
affinity
プロパティーを編集します。ワーカーノードが Kafka ブローカーまたは ZooKeeper ノードで共有されないようにするには、strimzi.io/name
ラベルを使用します。topologyKey
をkubernetes.io/hostname
に設定して、選択した Pod が同じホスト名のノードでスケジュールされないように指定します。これにより、同じワーカーノードを単一の Kafka ブローカーと単一の ZooKeeper ノードで共有できます。以下に例を示します。apiVersion: kafka.strimzi.io/v1beta2 kind: Kafka spec: kafka: # ... template: pod: affinity: podAntiAffinity: requiredDuringSchedulingIgnoredDuringExecution: - labelSelector: matchExpressions: - key: strimzi.io/name operator: In values: - CLUSTER-NAME-kafka topologyKey: "kubernetes.io/hostname" # ... zookeeper: # ... template: pod: affinity: podAntiAffinity: requiredDuringSchedulingIgnoredDuringExecution: - labelSelector: matchExpressions: - key: strimzi.io/name operator: In values: - CLUSTER-NAME-zookeeper topologyKey: "kubernetes.io/hostname" # ...
CLUSTER-NAME
は、Kafka カスタムリソースの名前です。Kafka ブローカーと ZooKeeper ノードが同じワーカーノードを共有しないようにする場合は、
strimzi.io/cluster
ラベルを使用します。以下に例を示します。apiVersion: kafka.strimzi.io/v1beta2 kind: Kafka spec: kafka: # ... template: pod: affinity: podAntiAffinity: requiredDuringSchedulingIgnoredDuringExecution: - labelSelector: matchExpressions: - key: strimzi.io/cluster operator: In values: - CLUSTER-NAME topologyKey: "kubernetes.io/hostname" # ... zookeeper: # ... template: pod: affinity: podAntiAffinity: requiredDuringSchedulingIgnoredDuringExecution: - labelSelector: matchExpressions: - key: strimzi.io/cluster operator: In values: - CLUSTER-NAME topologyKey: "kubernetes.io/hostname" # ...
CLUSTER-NAME
は、Kafka カスタムリソースの名前です。リソースを作成または更新します。
oc apply -f <kafka_configuration_file>
9.12.3. Kafka コンポーネントでの Pod の非アフィニティーの設定
Pod の非アフィニティー設定は、Kafka ブローカーの安定性とパフォーマンスに役立ちます。podAntiAffinity
を使用すると、OpenShift は他のワークロードと同じノードで Kafka ブローカーをスケジュールしません。通常、Kafka が他のネットワークと同じワーカーノードで実行されないようにし、データベース、ストレージ、その他のメッセージングプラットフォームなどのストレージを大量に消費するアプリケーションで実行されないようにします。
前提条件
- OpenShift クラスター
- 稼働中の Cluster Operator
手順
クラスターデプロイメントを指定するリソースの
affinity
プロパティーを編集します。ラベルを使用して、同じノードでスケジュールすべきでない Pod を指定します。topologyKey
をkubernetes.io/hostname
に設定し、選択した Pod が同じホスト名のノードでスケジュールされてはならないことを指定する必要があります。以下に例を示します。apiVersion: kafka.strimzi.io/v1beta2 kind: Kafka spec: kafka: # ... template: pod: affinity: podAntiAffinity: requiredDuringSchedulingIgnoredDuringExecution: - labelSelector: matchExpressions: - key: application operator: In values: - postgresql - mongodb topologyKey: "kubernetes.io/hostname" # ... zookeeper: # ...
リソースを作成または更新します。
oc apply
を使用して、これを行うことができます。oc apply -f <kafka_configuration_file>
9.12.4. Kafka コンポーネントでのノードのアフィニティーの設定
前提条件
- OpenShift クラスター
- 稼働中の Cluster Operator
手順
Streams for Apache Kafka コンポーネントをスケジュールする必要があるノードにラベルを付けます。
oc label
を使用してこれを行うことができます。oc label node NAME-OF-NODE node-type=fast-network
または、既存のラベルによっては再利用が可能です。
クラスターデプロイメントを指定するリソースの
affinity
プロパティーを編集します。以下に例を示します。apiVersion: kafka.strimzi.io/v1beta2 kind: Kafka spec: kafka: # ... template: pod: affinity: nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: - key: node-type operator: In values: - fast-network # ... zookeeper: # ...
リソースを作成または更新します。
oc apply
を使用して、これを行うことができます。oc apply -f <kafka_configuration_file>
9.12.5. 専用ノードの設定と Pod のスケジューリング
前提条件
- OpenShift クラスター
- 稼働中の Cluster Operator
手順
- 専用ノードとして使用するノードを選択します。
- これらのノードにスケジュールされているワークロードがないことを確認します。
選択したノードにテイントを設定します。
oc adm taint
を使用してこれを行うことができます。oc adm taint node NAME-OF-NODE dedicated=Kafka:NoSchedule
さらに、選択したノードにラベルも追加します。
oc label
を使用してこれを行うことができます。oc label node NAME-OF-NODE dedicated=Kafka
クラスターデプロイメントを指定するリソースの
affinity
およびtolerations
プロパティーを編集します。以下に例を示します。
apiVersion: kafka.strimzi.io/v1beta2 kind: Kafka spec: kafka: # ... template: pod: tolerations: - key: "dedicated" operator: "Equal" value: "Kafka" effect: "NoSchedule" affinity: nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: - key: dedicated operator: In values: - Kafka # ... zookeeper: # ...
リソースを作成または更新します。
oc apply
を使用して、これを行うことができます。oc apply -f <kafka_configuration_file>