スケジューリング

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

参考

Kubernetes documentation を参照してください。

使用可能なすべてのポリシーを含むスケジュールの詳細については、 をご覧ください。このページでは、アフィニティ、アンチアフィニティ、ノードセレクターなどの概念に精通していることを前提としています。

AffinityConfiguration {postgresql-cnpg-io-v1-AffinityConfiguration} を介してCloudNativePGクラスターのインスタンスをスケジュールする方法を制御できます

クラスターの定義のセクション。以下をサポートします。

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

  • ノードセレクター

  • 許容範囲

注釈

CloudNativePGは、ワークロードのスケジュールをより詳細に制御するためのポッドテンプレートをサポートしていません。これらは初期コンセプトの一部でしたが、開発チームは、APIの新しいバージョンおそらくCNPGのv2での導入を延期することにしました。

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

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:16.1

  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 を使用する場合に予想される条件です。 。

参考

このトピックの詳細については、 Kubernetes documentation を参照してください。

クラウド環境でのtopologyKey の別の値はtopology.kubernetes.io/zone にすることができ、ポッドがノードだけでなくアベイラビリティーゾーンに分散されるようにします。

Well-Known Labels, Annotations and Taints を参照してください。

さらに多くのオプションについては。

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

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

注釈

ポッド仕様で想定されている`podAntiAffinity` または`podAffinity` のコンテンツ全体を`additionalPodAntiAffinity` または`additionalPodAffinity` に渡す必要があります。どの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スケジューラーは、汚染されたノードを考慮に入れて、ワークロードをスケジュールするノードを決定するようになります。 .spec.affinity.tolerations セクションを介して、クラスターのすべてのポッドの許容値を構成できます。このセクションは、許容値の通常のKubernetes構文を受け入れます。

参考

taintとtolerationの詳細については、 Kubernetes documentation を参照してください。