Scheduling

Kubernetesのスケジューリングは、いくつかの基準に基づいて、可能な限り最適なノードに新しいポッドを配置するプロセスです。

CloudNativePGクラスターのインスタンスのスケジュール方法は、クラスターの定義の AffinityConfiguration セクションで制御できます。

  • ポッドアフィニティ/アンチアフィニティ

  • ノードセレクター

  • 寛容

ポッドアフィニティとアンチアフィニティ

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.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 が使用されます。リソースが使用できない場合、このような強い要件により保留インスタンスが発生する可能性があることに注意してください( Cluster Autoscaler <!- マスタ : ルール = master-> Kubernetesクラスターの自動水平スケーリングの使用時に予想される条件です)。

クラウド環境での topologyKey の別の可能な値はb topology.kubernetes.io/zone で、ポッドがノードだけでなくアベイラビリティゾーン全体に広がるようにします。その他のオプションについては、 Well-Known Labels, Annotations and Taints を参照してください。

enablePodAntiAffinity をfalseに設定すると、オペレーターが生成した非アフィニティポリシーを無効にできます。

さらに、よりきめ細かな制御が必要な場合は、 additionalPodAffinity および additionalPodAntiAffinity 構成属性を介してカスタムポッドアフィニティまたは非アフィニティルールのリストを指定できます。これらのルールは、有効になっている場合は演算子によって生成されたルールに追加され、そうでない場合は透過的に渡されます。

注釈

additionalPodAntiAffinity または additionalPodAffinity に、Pod仕様で予期される podAntiAffinity または podAffinity のコンテンツ全体を渡す必要があります(どのPostgreSQLでも、すべてのワーカーノードで実行されるPostgreSQLのインスタンスが1つだけの例として、次のYAMLを見てください)それらが属するクラスター)。

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構文を受け入れます。