> ## Documentation Index
> Fetch the complete documentation index at: https://docs.abbyy.com/llms.txt
> Use this file to discover all available pages before exploring further.

# ノードグループとスケジューリング

`orchestrator`、`ingest`、`worker` では、それぞれ `nodeSelector`、`tolerations`、`affinity`、`podAnnotations` を指定できます。

## amd64 で実行する

FineParser のコンテナイメージは `linux/amd64` 向けにのみビルドされています。クラスターで `arm64` ノードも稼働できる場合は、すべてのコンポーネントを amd64 ノードに固定してください：

```yaml fineparser-values.yaml theme={null}
orchestrator:
  nodeSelector:
    kubernetes.io/arch: amd64
ingest:
  nodeSelector:
    kubernetes.io/arch: amd64
worker:
  nodeSelector:
    kubernetes.io/arch: amd64
```

## ワーカーに専用のノードを割り当てる

大規模なプールは、配置が許可されているすべてのノードを占有してしまう可能性があります。ワーカーは taint を設定した専用のノードグループに配置し、Orchestrator と取り込みサービスは別のノードで実行してください。`fineparser.abbyy.com/pool=worker` のラベルと taint が設定されたノードの場合は、次のようになります。

```yaml fineparser-values.yaml theme={null}
worker:
  nodeSelector:
    kubernetes.io/arch: amd64
    fineparser.abbyy.com/pool: worker
  tolerations:
    - key: fineparser.abbyy.com/pool
      operator: Equal
      value: worker
      effect: NoSchedule
```

## ワーカーイメージの事前プル

新しいノード上で多数のワーカーが一斉に起動すると、各ワーカーのイメージプルが kubelet のプルレート制限に達し、一斉起動が遅くなることがあります。`worker.prepull` を有効にすると、ワーカーはノードでのイメージのプルが一度完了するまで待機します。

```yaml fineparser-values.yaml theme={null}
worker:
  prepull:
    enabled: true
    taintKey: startup-taint.cluster-autoscaler.kubernetes.io/fineparser-image
```

ワーカーノードは、キーが `taintKey` の `NoSchedule` taint を付与した状態で登録する必要があります。DaemonSet が新しいノードごとにイメージをプルし、その後 taint を削除します。

* **Karpenter:** NodePool の `startupTaints` にこの taint を指定します。
* **Cluster Autoscaler:** ノードグループのノードを、この taint を付与した状態で作成します。デフォルトのキーに付いているプレフィックスにより、Cluster Autoscaler はこの taint を一時的なものとして扱います。

`images.worker.pullPolicy` は `IfNotPresent` に設定する必要があり、`worker.tolerations` でこの taint を許容しないようにしてください。この機能を有効にすると、Node の取得とパッチ適用が可能な ClusterRole が作成されます。

## ノードのドレインと中断

停止処理に入ったワーカーは、600 秒の猶予期間内に、処理中のユニットを完了させてから停止します。ノードのオートスケーラーでドレイン時間を制限している場合は、ワーカーノードに少なくともこの時間を確保してください。ユニットの処理途中で停止したワーカーはそのユニットを失いますが、リースの有効期限が切れた後、別のワーカーがそのユニットを再試行します。

この仕組みにより、ワーカーは Spot またはプリエンプティブルなキャパシティで実行できます。一方、Orchestratorと取り込みは通常のキャパシティで実行してください。Orchestratorはキューを保持しているため、再起動中は API を利用できなくなります。
