スケジューリング¶
Kubernetesでのスケジューリングは、いくつかの基準に基づいて、可能な限り最適なノードに新しいポッドを配置するプロセスです。
クラスターの定義の AffinityConfiguration セクションを使用して、CloudNativePGクラスターのインスタンスをスケジュールする方法を制御できます。
ポッドアフィニティ/アンチアフィニティ
ノードセレクター
寛容
Podのアフィニティとアンチアフィニティ¶
Kubernetesでは、それらのノードで既に実行されている実際のワークロードに基づいて、ポッドをスケジュールする(アフィニティ)かしない(アンチアフィニティ)かを制御できます。これは、技術的に ポッド間アフィニティ/アンチアフィニティ として知られています。
CloudNativePGはデフォルトで、クラスターのインスタンスを好ましくは異なるノードで構成し、次の
affinity 定義になります。
affinity:
podAntiAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
- podAffinityTerm:
labelSelector:
matchExpressions:
- key: postgresql
operator: In
values:
- cluster-example
topologyKey: kubernetes.io/hostname
weight: 100
次のクラスタ仕様の結果:
apiVersion: postgresql.cnpg.io/v1
kind: Cluster
metadata:
name: cluster-example
spec:
instances: 3
imageName: ghcr.io/cloudnative-pg/postgresql:14.4
affinity:
enablePodAntiAffinity: true #default value
topologyKey: kubernetes.io/hostname #defaul value
podAntiAffinityType: preferred #default value
storage:
size: 1Gi
したがって、Kubernetesは3つの異なるノードで3ノードのPostgreSQLクラスターをスケジュールすることを優先します。
上記の設定を調整することで、前述のデフォルトの動作を変更できます。
podAntiAffinityType をrequired に設定できます。その結果、
preferredDuringSchedulingIgnoredDuringExecution
の代わりにrequiredDuringSchedulingIgnoredDuringExecution
が使用されます。このような強力な要件により、リソースが利用できない場合に保留中のインスタンスが発生する可能性があることに注意してください(これは、Kubernetesクラスターの自動水平スケーリングに
Cluster Autoscaler を使用する場合に予想される条件です) 。
クラウド環境での topologyKey
の別の可能な値は、ポッドがノードだけでなくアベイラビリティーゾーンに分散されるように、
topology.kubernetes.io/zone です。その他のオプションについては、
Well-Known Labels, Annotations and Taints を参照してください。
enablePodAntiAffinity
をfalseに設定することにより、オペレーターの生成された非アフィニティーポリシーを無効にできます。
さらに、よりきめ細かな制御が必要な場合は、 additionalPodAffinity
および additionalPodAntiAffinity
構成属性を介してカスタムポッドアフィニティまたはアンチアフィニティルールのリストを指定できます。これらのルールは、有効になっている場合はオペレーターによって生成されたルールに追加され、それ以外の場合は透過的に渡されます。
注釈
Pod仕様で予想される`podAntiAffinity` または`podAffinity` のコンテンツ全体をワーカーまたは`additionalPodAffinity` に渡す必要があります(どのPostgreSQL彼らが属するクラスター)。
additionalPodAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- key: postgresql
operator: Exists
values: []
topologyKey: "kubernetes.io/hostname"
nodeSelector によるノード選択¶
Kubernetesでは、 nodeSelector
がラベル(キーと値のペアとして定義)のリストを提供して、ポッドを実行できるノードを選択できます。具体的には、ノードには、スケジュールされて実行されるポッドのラベルとして、指定された各キーと値のペアが必要です。
同様に、CloudNativePGは、 affinity セクションでnodeSelector
を定義することに同意し、これらのラベルがあるノードでのみ実行するようにPostgreSQLクラスターをリクエストできます。
寛容¶
Kubernetesでは、ノードがtaints
を明示的に許容していない(tolerations
を介して)すべてのポッドを撃退するかどうかを(taints
を介して)指定できます。
したがって、特定のノードのtaints
に一致するワークロードにtolerations
の適切なセットを設定することにより、Kubernetesスケジューラーは汚染されたノードを考慮に入れ、ワークロードをスケジュールするノードを決定します。容認は、容認の通常のKubernetes構文を受け入れる
.spec.affinity.tolerations
セクションを介して、クラスターのすべてのポッドに対して構成できます。