スケジューリング

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 セクションを介して、クラスターのすべてのポッドに対して構成できます。