スケジューリング¶
Kubernetes のスケジューリングは、いくつかの基準に基づいて、可能な限り最適なノードに新しいポッドを配置するプロセスです。
利用可能なすべてのポリシーを含むスケジューリングの詳細については、 を参照してください。このページでは、アフィニティ、非アフィニティ、ノード セレクターなどの概念に精通していることを前提としています。
Pod の親和性と非親和性 を使用して、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:15.2
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 のコンテンツ全体を additionalPodAntiAffinity または additionalPodAffinity に渡す必要があります (次の YAML を、すべてのワーカーノードで実行されている PostgreSQL のインスタンスを 1 つだけ持つ例として見てください。属しているクラスター)。
additionalPodAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- key: postgresql
operator: Exists
values: []
topologyKey: "kubernetes.io/hostname"
nodeSelector によるノード選択¶
Kubernetes では、nodeSelector がラベルのリスト
(キーと値のペアとして定義)
を提供して、ポッドを実行できるノードを選択できます。具体的には、ノードは、スケジュールされて実行されるポッドのラベルとして、示された各キーと値のペアを持っている必要があります。
同様に、CloudNativePG は、affinity セクションで nodeSelector
を定義することに同意します。これにより、これらのラベルを持つノードでのみ
PostgreSQL クラスターを実行するように要求できます。
許容範囲¶
Kubernetes では、(tolerations を介して) taints
を明示的に許容していないすべてのポッドをノードが拒否するかどうかを
(taints を介して) 指定できます。
そのため、特定のノードの taints に一致するワークロードに
tolerations の適切なセットを設定することで、Kubernetes
スケジューラは、ワークロードをスケジュールするノードを決定する際に、汚染されたノードを考慮に入れるようになります。許容は、許容のための通常の
Kubernetes 構文を受け入れる .spec.affinity.tolerations
セクションを介して、クラスターのすべてのポッドに対して構成できます。