スケジューリング
================

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

..  Seealso::
   :ref:`Kubernetes documentation <スケジューリング>` を参照してください。

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

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

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

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

-  ノードセレクター

-  許容範囲

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

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

Kubernetesでは、これらのノードで既に実行されている実際のワークロードに基づいて、ポッドを
*アフィニティ*\ スケジュールするか、\ *アンチアフィニティ*\ しないノードを制御できます。これは、技術的には*\*
ポッド間アフィニティ/アンチアフィニティ**と呼ばれます。

デフォルトでのCloudNativePGは、クラスターのインスタンスをできれば別のノードで構成し、次の\ ``affinity``
定義になります。

.. code:: yaml

   affinity:
     podAntiAffinity:
       preferredDuringSchedulingIgnoredDuringExecution:
         - podAffinityTerm:
             labelSelector:
               matchExpressions:
                 - key: postgresql
                   operator: In
                   values:
                     - cluster-example
             topologyKey: kubernetes.io/hostname
           weight: 100

次のクラスター仕様の結果。

.. code:: yaml

   apiVersion: postgresql.cnpg.io/v1
   kind: Cluster
   metadata:
     name: cluster-example
   spec:
     instances: 3
     imageName: ghcr.io/cloudnative-pg/postgresql:16.0

     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 <https://github.com/kubernetes/autoscaler/tree/master/cluster-autoscaler>`_ を使用する場合に予想される条件です。

..  Seealso::
   このトピックの詳細については、 :ref:`Kubernetes documentation <スケジューリング>` を参照してください。

クラウド環境での\ ``topologyKey``
の別の値は\ ``topology.kubernetes.io/zone``
にすることができ、ポッドがノードだけでなくアベイラビリティーゾーンに分散されるようにします。
 `Well-Known Labels, Annotations and Taints <https://kubernetes.io/docs/reference/labels-annotations-taints/>`_ を参照してください。

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

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

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

..  Note::
   ポッド仕様で想定されている`podAntiAffinity` または`podAffinity` のコンテンツ全体を`additionalPodAntiAffinity` または`additionalPodAffinity` に渡す必要があります。どのPostgreSQLに関係なく、すべてのワーカーノードでPostgreSQLの1つのインスタンスのみを実行する例として、次のYAMLを参照してください。それらが属しているクラスター)。

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

..  Seealso::
   taintとtolerationの詳細については、 :ref:`Kubernetes documentation <スケジューリング>` を参照してください。
