12.6. NUMA 対応ワークロードのスケジューリング
通常、遅延の影響を受けやすいワークロードを実行するクラスターは、ワークロードの遅延を最小限に抑え、パフォーマンスを最適化するのに役立つパフォーマンスプロファイルを備えています。NUMA 対応スケジューラーは、使用可能なノードの NUMA リソースと、ノードに適用されるパフォーマンスプロファイル設定に基づいき、ワークロードをデプロイします。NUMA 対応デプロイメントとワークロードのパフォーマンスプロファイルを組み合わせることで、パフォーマンスを最大化するようにワークロードがスケジュールされます。
NUMA Resources Operator を完全に動作させるには、NUMAResourcesOperator カスタムリソースと NUMA 対応のセカンダリー Pod スケジューラーをデプロイする必要があります。
12.6.1. NUMAResourcesOperator カスタムリソースの作成 リンクのコピーリンクがクリップボードにコピーされました!
NUMA Resources Operator をインストールしたら、NUMAResourcesOperator カスタムリソース (CR) を作成します。この CR は、デーモンセットや API など、NUMA 対応スケジューラーをサポートするために必要なすべてのクラスターインフラストラクチャーをインストールするように NUMA Resources Operator に指示します。
前提条件
-
OpenShift CLI (
oc) がインストールされている。 -
cluster-admin権限を持つユーザーとしてログインしている。 - NUMA Resources Operator をインストールしている。
手順
NUMAResourcesOperatorカスタムリソースを作成します。次の最小限必要な YAML ファイルの例を
nrop.yamlとして保存します。apiVersion: nodetopology.openshift.io/v1 kind: NUMAResourcesOperator metadata: name: numaresourcesoperator spec: nodeGroups: - machineConfigPoolSelector: matchLabels: pools.operator.machineconfiguration.openshift.io/worker: ""1 - 1
- これは、NUMA Resources Operator を設定する
MachineConfigPoolリソースと一致する必要があります。たとえば、通信ワークロードを実行することが予想されるノードのセットを指定するworker-cnfという名前のMachineConfigPoolリソースを作成したとします。各NodeGroupは 1 つのMachineConfigPoolに完全に一致する必要があります。NodeGroupが複数のMachineConfigPoolに一致する設定はサポートされていません。
以下のコマンドを実行して、
NUMAResourcesOperatorCR を作成します。$ oc create -f nrop.yaml
オプション: 複数のマシン設定プール (MCP) に対して NUMA 対応スケジューリングを有効にするには、プールごとに個別の
NodeGroupを定義します。たとえば、次の例に示すように、NUMAResourcesOperatorCR で、worker-cnf、worker-ht、およびworker-otherの 3 つのNodeGroupsを定義します。複数の
NodeGroupsを含むNUMAResourcesOperatorCR の YAML 定義の例apiVersion: nodetopology.openshift.io/v1 kind: NUMAResourcesOperator metadata: name: numaresourcesoperator spec: logLevel: Normal nodeGroups: - machineConfigPoolSelector: matchLabels: machineconfiguration.openshift.io/role: worker-ht - machineConfigPoolSelector: matchLabels: machineconfiguration.openshift.io/role: worker-cnf - machineConfigPoolSelector: matchLabels: machineconfiguration.openshift.io/role: worker-other
検証
以下のコマンドを実行して、NUMA Resources Operator が正常にデプロイされたことを確認します。
$ oc get numaresourcesoperators.nodetopology.openshift.io出力例
NAME AGE numaresourcesoperator 27s数分後、次のコマンドを実行して、必要なリソースが正常にデプロイされたことを確認します。
$ oc get all -n openshift-numaresources出力例
NAME READY STATUS RESTARTS AGE pod/numaresources-controller-manager-7d9d84c58d-qk2mr 1/1 Running 0 12m pod/numaresourcesoperator-worker-7d96r 2/2 Running 0 97s pod/numaresourcesoperator-worker-crsht 2/2 Running 0 97s pod/numaresourcesoperator-worker-jp9mw 2/2 Running 0 97s
12.6.2. Hosted Control Plane 用の NUMAResourcesOperator カスタムリソースの作成 リンクのコピーリンクがクリップボードにコピーされました!
NUMA Resources Operator をインストールした後、NUMAResourcesOperator カスタムリソース (CR) を作成します。CR は、デーモンセットや API など、Hosted Control Plane 上の NUMA 対応スケジューラーをサポートするために必要なすべてのクラスターインフラストラクチャーをインストールするように NUMA Resources Operator に指示します。
Hosted Control Plane 用の NUMAResourcesOperator カスタムリソースの作成は、テクノロジープレビュー機能です。テクノロジープレビュー機能は、Red Hat 製品のサービスレベルアグリーメント (SLA) の対象外であり、機能的に完全ではないことがあります。Red Hat は、実稼働環境でこれらを使用することを推奨していません。テクノロジープレビュー機能は、最新の製品機能をいち早く提供して、開発段階で機能のテストを行い、フィードバックを提供していただくことを目的としています。
Red Hat のテクノロジープレビュー機能のサポート範囲に関する詳細は、以下のリンクを参照してください。
前提条件
-
OpenShift CLI (
oc) がインストールされている。 -
cluster-admin権限を持つユーザーとしてログインしている。 - NUMA Resources Operator をインストールしている。
手順
次のコマンドを実行して、管理クラスターの kubeconfig ファイルをエクスポートします。
$ export KUBECONFIG=<path-to-management-cluster-kubeconfig>次のコマンドを実行して、クラスターの
node-pool-nameを見つけます。$ oc --kubeconfig="$MGMT_KUBECONFIG" get np -A出力例
NAMESPACE NAME CLUSTER DESIRED NODES CURRENT NODES AUTOSCALING AUTOREPAIR VERSION UPDATINGVERSION UPDATINGCONFIG MESSAGE clusters democluster-us-east-1a democluster 1 1 False False 4.19.0 False Falsenode-pool-nameは出力のNAMEフィールドです。この例では、node-pool-nameはdemocluster-us-east-1aです。少なくとも次の内容を含む、
nrop-hcp.yamlという名前の YAML ファイルを作成します。apiVersion: nodetopology.openshift.io/v1 kind: NUMAResourcesOperator metadata: name: numaresourcesoperator spec: nodeGroups: - poolName: democluster-us-east-1a1 - 1
poolNameは、手順 2 で取得したnode-pool-nameです。
管理クラスターで次のコマンドを実行して、利用可能なシークレットをリスト表示します。
$ oc get secrets -n clusters出力例
NAME TYPE DATA AGE builder-dockercfg-25qpp kubernetes.io/dockercfg 1 128m default-dockercfg-mkvlz kubernetes.io/dockercfg 1 128m democluster-admin-kubeconfig Opaque 1 127m democluster-etcd-encryption-key Opaque 1 128m democluster-kubeadmin-password Opaque 1 126m democluster-pull-secret Opaque 1 128m deployer-dockercfg-8lfpd kubernetes.io/dockercfg 1 128m次のコマンドを実行して、ホステッドクラスターの
kubeconfigファイルを抽出します。$ oc get secret <SECRET_NAME> -n clusters -o jsonpath='{.data.kubeconfig}' | base64 -d > hosted-cluster-kubeconfig例
$ oc get secret democluster-admin-kubeconfig -n clusters -o jsonpath='{.data.kubeconfig}' | base64 -d > hosted-cluster-kubeconfig次のコマンドを実行して、ホステッドクラスターの
kubeconfigファイルをエクスポートします。$ export HC_KUBECONFIG=<path_to_hosted-cluster-kubeconfig>ホステッドクラスターで次のコマンドを実行して、
NUMAResourcesOperatorCR を作成します。$ oc create -f nrop-hcp.yaml
検証
以下のコマンドを実行して、NUMA Resources Operator が正常にデプロイされたことを確認します。
$ oc get numaresourcesoperators.nodetopology.openshift.io出力例
NAME AGE numaresourcesoperator 27s数分後、次のコマンドを実行して、必要なリソースが正常にデプロイされたことを確認します。
$ oc get all -n openshift-numaresources出力例
NAME READY STATUS RESTARTS AGE pod/numaresources-controller-manager-7d9d84c58d-qk2mr 1/1 Running 0 12m pod/numaresourcesoperator-democluster-7d96r 2/2 Running 0 97s pod/numaresourcesoperator-democluster-crsht 2/2 Running 0 97s pod/numaresourcesoperator-democluster-jp9mw 2/2 Running 0 97s
12.6.3. NUMA 対応のセカンダリー Pod スケジューラーのデプロイ リンクのコピーリンクがクリップボードにコピーされました!
NUMA Resources Operator をインストールした後、次の手順に従って NUMA 対応のセカンダリー Pod スケジューラーをデプロイします。
手順
NUMA 対応のカスタム Pod スケジューラーをデプロイする
NUMAResourcesSchedulerカスタムリソースを作成します。次の最小限必要な YAML を
nro-scheduler.yamlファイルに保存します。apiVersion: nodetopology.openshift.io/v1 kind: NUMAResourcesScheduler metadata: name: numaresourcesscheduler spec: imageSpec: "registry.redhat.io/openshift4/noderesourcetopology-scheduler-rhel9:v4.19"1 - 1
- 非接続環境では、次のいずれかの方法でこのイメージの解像度を設定してください。
-
ImageTagMirrorSetカスタムリソース (CR) を作成する。詳細は、「関連情報」セクションの「イメージレジストリーのリポジトリーミラーリングの設定」を参照してください。 - 切断されたレジストリーへの URL を設定する。
-
次のコマンドを実行して、
NUMAResourcesSchedulerCR を作成します。$ oc create -f nro-scheduler.yaml注記Hosted Control Plane クラスターでは、Hosted Control Plane ノードでこのコマンドを実行します。
数秒後、次のコマンドを実行して、必要なリソースのデプロイメントが成功したことを確認します。
$ oc get all -n openshift-numaresources出力例
NAME READY STATUS RESTARTS AGE pod/numaresources-controller-manager-7d9d84c58d-qk2mr 1/1 Running 0 12m pod/numaresourcesoperator-worker-7d96r 2/2 Running 0 97s pod/numaresourcesoperator-worker-crsht 2/2 Running 0 97s pod/numaresourcesoperator-worker-jp9mw 2/2 Running 0 97s pod/secondary-scheduler-847cb74f84-9whlm 1/1 Running 0 10m NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE daemonset.apps/numaresourcesoperator-worker 3 3 3 3 3 node-role.kubernetes.io/worker= 98s NAME READY UP-TO-DATE AVAILABLE AGE deployment.apps/numaresources-controller-manager 1/1 1 1 12m deployment.apps/secondary-scheduler 1/1 1 1 10m NAME DESIRED CURRENT READY AGE replicaset.apps/numaresources-controller-manager-7d9d84c58d 1 1 1 12m replicaset.apps/secondary-scheduler-847cb74f84 1 1 1 10m
12.6.4. NUMA 対応スケジューラーを使用したワークロードのスケジューリング リンクのコピーリンクがクリップボードにコピーされました!
topo-aware-scheduler をインストールし、NUMAResourcesOperator および NUMAResourcesScheduler CR を適用し、クラスターが一致するパフォーマンスプロファイルまたは kubeletconfig を含むようになったので、ワークロードを処理する必要最小限のリソースを指定するデプロイメント CR を使用して、NUMA 対応スケジューラーでワークロードをスケジュールできます。
次のデプロイメント例では、サンプルワークロードに NUMA 対応のスケジューリングを使用します。
前提条件
-
OpenShift CLI (
oc) がインストールされている。 -
cluster-admin権限を持つユーザーとしてログインしている。
手順
次のコマンドを実行して、クラスターにデプロイされている NUMA 対応スケジューラーの名前を取得します。
$ oc get numaresourcesschedulers.nodetopology.openshift.io numaresourcesscheduler -o json | jq '.status.schedulerName'出力例
"topo-aware-scheduler"topo-aware-schedulerという名前のスケジューラーを使用するDeploymentCR を作成します。次に例を示します。以下の YAML を
nro-deployment.yamlファイルに保存します。apiVersion: apps/v1 kind: Deployment metadata: name: numa-deployment-1 namespace: openshift-numaresources spec: replicas: 1 selector: matchLabels: app: test template: metadata: labels: app: test spec: schedulerName: topo-aware-scheduler1 containers: - name: ctnr image: quay.io/openshifttest/hello-openshift:openshift imagePullPolicy: IfNotPresent resources: limits: memory: "100Mi" cpu: "10" requests: memory: "100Mi" cpu: "10" - name: ctnr2 image: registry.access.redhat.com/rhel:latest imagePullPolicy: IfNotPresent command: ["/bin/sh", "-c"] args: [ "while true; do sleep 1h; done;" ] resources: limits: memory: "100Mi" cpu: "8" requests: memory: "100Mi" cpu: "8"- 1
schedulerNameは、クラスターにデプロイされている NUMA 対応のスケジューラーの名前 (topo-aware-schedulerなど) と一致する必要があります。
次のコマンドを実行して、
DeploymentCR を作成します。$ oc create -f nro-deployment.yaml
検証
デプロイメントが正常に行われたことを確認します。
$ oc get pods -n openshift-numaresources出力例
NAME READY STATUS RESTARTS AGE numa-deployment-1-6c4f5bdb84-wgn6g 2/2 Running 0 5m2s numaresources-controller-manager-7d9d84c58d-4v65j 1/1 Running 0 18m numaresourcesoperator-worker-7d96r 2/2 Running 4 43m numaresourcesoperator-worker-crsht 2/2 Running 2 43m numaresourcesoperator-worker-jp9mw 2/2 Running 2 43m secondary-scheduler-847cb74f84-fpncj 1/1 Running 0 18m次のコマンドを実行して、
topo-aware-schedulerがデプロイされた Pod をスケジュールしていることを確認します。$ oc describe pod numa-deployment-1-6c4f5bdb84-wgn6g -n openshift-numaresources出力例
Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal Scheduled 4m45s topo-aware-scheduler Successfully assigned openshift-numaresources/numa-deployment-1-6c4f5bdb84-wgn6g to worker-1注記スケジューリングに使用可能なリソースよりも多くのリソースを要求するデプロイメントは、
MinimumReplicasUnavailableエラーで失敗します。必要なリソースが利用可能になると、デプロイメントは成功します。Pod は、必要なリソースが利用可能になるまでPending状態のままになります。ノードに割り当てられる予定のリソースが一覧表示されていることを確認します。
次のコマンドを実行して、デプロイメント Pod を実行しているノードを特定します。
$ oc get pods -n openshift-numaresources -o wide出力例
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES numa-deployment-1-6c4f5bdb84-wgn6g 0/2 Running 0 82m 10.128.2.50 worker-1 <none> <none>次のコマンドを実行します。このとき、デプロイメント Pod を実行しているノードの名前を指定します。
$ oc describe noderesourcetopologies.topology.node.k8s.io worker-1出力例
... Zones: Costs: Name: node-0 Value: 10 Name: node-1 Value: 21 Name: node-0 Resources: Allocatable: 39 Available: 211 Capacity: 40 Name: cpu Allocatable: 6442450944 Available: 6442450944 Capacity: 6442450944 Name: hugepages-1Gi Allocatable: 134217728 Available: 134217728 Capacity: 134217728 Name: hugepages-2Mi Allocatable: 262415904768 Available: 262206189568 Capacity: 270146007040 Name: memory Type: Node- 1
- 保証された Pod に割り当てられたリソースが原因で、
Availableな容量が減少しています。
保証された Pod によって消費されるリソースは、
noderesourcetopologies.topology.node.k8s.ioにリスト表示されている使用可能なノードリソースから差し引かれます。
Best-effortまたはBurstableのサービス品質 (qosClass) を持つ Pod のリソース割り当てが、noderesourcetopologies.topology.node.k8s.ioの NUMA ノードリソースに反映されていません。Pod の消費リソースがノードリソースの計算に反映されない場合は、Pod のqosClassがGuaranteedで、CPU 要求が 10 進値ではなく整数値であることを確認してください。次のコマンドを実行すると、Pod のqosClassがGuaranteedであることを確認できます。$ oc get pod numa-deployment-1-6c4f5bdb84-wgn6g -n openshift-numaresources -o jsonpath="{ .status.qosClass }"出力例
Guaranteed