スケジューリング

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