|
| 1 | +--- |
| 2 | +title: ノードのトポロジー管理ポリシーを制御する |
| 3 | + |
| 4 | +content_template: templates/task |
| 5 | +min-kubernetes-server-version: v1.18 |
| 6 | +--- |
| 7 | + |
| 8 | +{{% capture overview %}} |
| 9 | + |
| 10 | +{{< feature-state state="beta" for_k8s_version="v1.18" >}} |
| 11 | + |
| 12 | +近年、CPUやハードウェア・アクセラレーターの組み合わせによって、レイテンシーが致命的となる実行や高いスループットを求められる並列計算をサポートするシステムが増えています。このようなシステムには、通信、科学技術計算、機械学習、金融サービス、データ分析などの分野のワークロードが含まれます。このようなハイブリッドシステムは、高い性能の環境で構成されます。 |
| 13 | + |
| 14 | +最高のパフォーマンスを引き出すために、CPUの分離やメモリーおよびデバイスの位置に関する最適化が求められます。しかしながら、Kubernetesでは、これらの最適化は分断されたコンポーネントによって処理されます。 |
| 15 | + |
| 16 | +_トポロジーマネージャー_ はKubeletコンポーネントの1つで最適化の役割を担い、コンポーネント群を調和して機能させます。 |
| 17 | + |
| 18 | +{{% /capture %}} |
| 19 | + |
| 20 | +{{% capture prerequisites %}} |
| 21 | + |
| 22 | +{{< include "task-tutorial-prereqs.md" >}} {{< version-check >}} |
| 23 | + |
| 24 | +{{% /capture %}} |
| 25 | + |
| 26 | +{{% capture steps %}} |
| 27 | + |
| 28 | +## トポロジーマネージャーはどのように機能するか |
| 29 | + |
| 30 | +トポロジーマネージャー導入前は、KubernetesにおいてCPUマネージャーやデバイスマネージャーはそれぞれ独立してリソースの割り当てを決定します。 |
| 31 | +これは、マルチソケットのシステムでは望ましくない割り当てとなり、パフォーマンスやレイテンシーが求められるアプリケーションは、この望ましくない割り当てに悩まされます。 |
| 32 | +この場合の望ましくない例として、CPUやデバイスが異なるNUMAノードに割り当てられ、それによりレイテンシー悪化を招くことが挙げられます。 |
| 33 | + |
| 34 | +トポロジーマネージャーはKubeletコンポーネントであり、信頼できる情報源として振舞います。それによって、他のKubeletコンポーネントはトポロジーに沿ったリソース割り当ての選択を行うことができます。 |
| 35 | + |
| 36 | +トポロジーマネージャーは *Hint Providers* と呼ばれるコンポーネントのインターフェースを提供し、トポロジー情報を送受信します。トポロジーマネージャーは、ノード単位のポリシー群を保持します。ポリシーについて以下で説明します。 |
| 37 | + |
| 38 | +トポロジーマネージャーは *Hint Providers* からトポロジー情報を受け取ります。トポロジー情報は、利用可能なNUMAノードと優先割り当て表示を示すビットマスクです。トポロジーマネージャーのポリシーは、提供されたヒントに対して一連の操作を行い、ポリシーに沿ってヒントをまとめて最適な結果を得ます。もし、望ましくないヒントが保存された場合、ヒントの優先フィールドがfalseに設定されます。現在のポリシーでは、最も狭い優先マスクが優先されます。 |
| 39 | + |
| 40 | +選択されたヒントはトポロジーマネージャーの一部として保存されます。設定されたポリシーにしたがい、選択されたヒントに基づいてノードがPodを許可したり、拒否することができます。 |
| 41 | +トポロジーマネージャーに保存されたヒントは、*Hint Providers* が使用しリソース割り当てを決定します。 |
| 42 | + |
| 43 | +### トポロジーマネージャーの機能を有効にする |
| 44 | + |
| 45 | +トポロジーマネージャーをサポートするには、`TopologyManager` [フィーチャーゲート](/ja/docs/reference/command-line-tools-reference/feature-gates/)を有効にする必要があります。Kubernetes 1.18ではデフォルトで有効です。 |
| 46 | + |
| 47 | +## トポロジーマネージャーのスコープとポリシー |
| 48 | + |
| 49 | +トポロジーマネージャは現在: |
| 50 | + |
| 51 | + - 全てのQoAクラスのPodを調整する |
| 52 | + - Hint Providerによって提供されたトポロジーヒントから、要求されたリソースを調整する |
| 53 | + |
| 54 | +これらの条件が合致した場合、トポロジーマネージャーは要求されたリソースを調整します。 |
| 55 | + |
| 56 | +この調整をどのように実行するかカスタマイズするために、トポロジーマネージャーは2つのノブを提供します: `スコープ` と`ポリシー`です。 |
| 57 | + |
| 58 | +`スコープ`はリソースの配置を行う粒度を定義します(例:`pod`や`container`)。そして、`ポリシー`は調整を実行するための実戦略を定義します(`best-effort`, `restricted`, `single-numa-node`等)。 |
| 59 | + |
| 60 | +現在利用可能な`スコープ`と`ポリシー`の値について詳細は以下の通りです。 |
| 61 | + |
| 62 | +{{< note >}} |
| 63 | +PodのSpecにある他の要求リソースとCPUリソースを調整するために、CPUマネージャーを有効にし、適切なCPUマネージャーのポリシーがノードに設定されるべきです。[CPU管理ポリシー](/docs/tasks/administer-cluster/cpu-management-policies/)を参照してください。 |
| 64 | +{{< /note >}} |
| 65 | + |
| 66 | +{{< note >}} |
| 67 | +PodのSpecにある他の要求リソースとメモリー(およびhugepage)リソースを調整するために、メモリーマネージャーを有効にし、適切なメモリーマネージャーポリシーがノードに設定されるべきです。[メモリーマネージャー](/docs/tasks/administer-cluster/memory-manager/) のドキュメントを確認してください。 |
| 68 | +{{< /note >}} |
| 69 | + |
| 70 | +### トポロジーマネージャーのスコープ |
| 71 | + |
| 72 | +トポロジーマネージャーは、以下の複数の異なるスコープでリソースの調整を行う事が可能です: |
| 73 | + |
| 74 | +* `container` (デフォルト) |
| 75 | +* `pod` |
| 76 | + |
| 77 | +いずれのオプションも、`--topology-manager-scope`フラグによって、kubelet起動時に選択できます。 |
| 78 | + |
| 79 | +### containerスコープ |
| 80 | + |
| 81 | +`container`スコープはデフォルトで使用されます。 |
| 82 | + |
| 83 | +このスコープでは、トポロジーマネージャーは連続した複数のリソース調整を実行します。つまり、Pod内の各コンテナは、分離された配置計算がされます。言い換えると、このスコープでは、コンテナを特定のNUMAノードのセットにグループ化するという概念はありません。実際には、トポロジーマネージャーは各コンテナのNUMAノードへの配置を任意に実行します。 |
| 84 | + |
| 85 | +コンテナをグループ化するという概念は、以下のスコープで設定・実行されます。例えば、`pod`スコープが挙げられます。 |
| 86 | + |
| 87 | +### podスコープ |
| 88 | + |
| 89 | +`pod`スコープを選択するには、コマンドラインで`--topology-manager-scope=pod`オプションを指定してkubeletを起動します。 |
| 90 | + |
| 91 | +このスコープでは、Pod内全てのコンテナを共通のNUMAノードのセットにグループ化することができます。トポロジーマネージャーはPodをまとめて1つとして扱い、ポッド全体(全てのコンテナ)を単一のNUMAノードまたはNUMAノードの共通セットのいずれかに割り当てようとします。以下の例は、さまざまな場面でトポロジーマネージャーが実行する調整を示します: |
| 92 | + |
| 93 | +* 全てのコンテナは、単一のNUMAノードに割り当てられます。 |
| 94 | +* 全てのコンテナは、共有されたNUMAノードのセットに割り当てられます。 |
| 95 | + |
| 96 | +Pod全体に要求される特定のリソースの総量は[有効なリクエスト/リミット](/ja/docs/concepts/workloads/pods/init-containers/#resources)の式に従って計算されるため、この総量の値は以下の最大値となります。 |
| 97 | +* 全てのアプリケーションコンテナのリクエストの合計。 |
| 98 | +* リソースに対するinitコンテナのリクエストの最大値。 |
| 99 | + |
| 100 | +`pod`スコープと`single-numa-node`トポロジーマネージャーポリシーを併用することは、レイテンシーが重要なワークロードやIPCを行う高スループットのアプリケーションに対して特に有効です。両方のオプションを組み合わせることで、Pod内の全てのコンテナを単一のNUMAノードに配置できます。そのため、PodのNUMA間通信によるオーバーヘッドを排除することができます。 |
| 101 | + |
| 102 | +`single-numa-node`ポリシーの場合、可能な割り当ての中に適切なNUMAノードのセットが存在する場合にのみ、Podが許可されます。上の例をもう一度考えてみましょう: |
| 103 | + |
| 104 | +* 1つのNUMAノードのみを含むセット - Podが許可されます。 |
| 105 | +* 2つ以上のNUMAノードを含むセット - Podが拒否されます(1つのNUMAノードの代わりに、割り当てを満たすために2つ以上のNUMAノードが必要となるため)。 |
| 106 | + |
| 107 | + |
| 108 | +要約すると、トポロジーマネージャーはまずNUMAノードのセットを計算し、それをトポロジーマネージャーのポリシーと照合し、Podの拒否または許可を検証します。 |
| 109 | + |
| 110 | +### トポロジーマネージャーのポリシー |
| 111 | + |
| 112 | +トポロジーマネージャーは4つの調整ポリシーをサポートします。`--topology-manager-policy`というKubeletフラグを通してポリシーを設定できます。 |
| 113 | +4つのサポートされるポリシーがあります: |
| 114 | + |
| 115 | +* `none` (デフォルト) |
| 116 | +* `best-effort` |
| 117 | +* `restricted` |
| 118 | +* `single-numa-node` |
| 119 | + |
| 120 | +{{< note >}} |
| 121 | +トポロジーマネージャーが **pod** スコープで設定された場合、コンテナはポリシーによって、Pod全体の要求として反映します。 |
| 122 | +したがって、Podの各コンテナは **同じ** トポロジー調整と同じ結果となります。 |
| 123 | +{{< /note >}} |
| 124 | + |
| 125 | +### none ポリシー {#policy-none} |
| 126 | + |
| 127 | +これはデフォルトのポリシーで、トポロジーの調整を実行しません。 |
| 128 | + |
| 129 | +### best-effort ポリシー {#policy-best-effort} |
| 130 | + |
| 131 | +Pod内の各コンテナに対して、`best-effort` トポロジー管理ポリシーが設定されたkubeletは、各Hint Providerを呼び出してそれらのリソースの可用性を検出します。 |
| 132 | +トポロジーマネージャーはこの情報を使用し、そのコンテナの推奨されるNUMAノードのアフィニティーを保存します。アフィニティーが優先されない場合、トポロジーマネージャーはこれを保存し、Podをノードに許可します。 |
| 133 | + |
| 134 | +*Hint Providers* はこの情報を使ってリソースの割り当てを決定します。 |
| 135 | + |
| 136 | +### restricted ポリシー {#policy-restricted} |
| 137 | + |
| 138 | +Pod内の各コンテナに対して、`restricted` トポロジー管理ポリシーが設定されたkubeletは各Hint Providerを呼び出してそれらのリソースの可用性を検出します。 |
| 139 | +トポロジーマネージャーはこの情報を使用し、そのコンテナの推奨されるNUMAノードのアフィニティーを保存します。アフィニティーが優先されない場合、トポロジーマネージャーはPodをそのノードに割り当てることを拒否します。この結果、PodはPodの受付失敗となり`Terminated` 状態になります。 |
| 140 | + |
| 141 | +Podが一度`Terminated`状態になると、KubernetesスケジューラーはPodの再スケジューリングを試み **ません** 。Podの再デプロイをするためには、ReplicasetかDeploymenを使用してください。`Topology Affinity`エラーとなったpodを再デプロイするために、外部のコントロールループを実行することも可能です。 |
| 142 | + |
| 143 | +Podが許可されれば、 *Hint Providers* はこの情報を使ってリソースの割り当てを決定します。 |
| 144 | + |
| 145 | +### single-numa-node ポリシー {#policy-single-numa-node} |
| 146 | + |
| 147 | +Pod内の各コンテナに対して、`single-numa-node`トポロジー管理ポリシーが設定されたkubeletは各Hint Prociderを呼び出してそれらのリソースの可用性を検出します。 |
| 148 | +トポロジーマネージャーはこの情報を使用し、単一のNUMAノードアフィニティが可能かどうか決定します。 |
| 149 | +可能な場合、トポロジーマネージャーは、この情報を保存し、*Hint Providers* はこの情報を使ってリソースの割り当てを決定します。 |
| 150 | +不可能な場合、トポロジーマネージャーは、Podをそのノードに割り当てることを拒否します。この結果、Pod は Pod の受付失敗となり`Terminated`状態になります。 |
| 151 | + |
| 152 | +Podが一度`Terminated`状態になると、KubernetesスケジューラーはPodの再スケジューリングを試み**ません**。Podの再デプロイをするためには、ReplicasetかDeploymentを使用してください。`Topology Affinity`エラーとなったpodを再デプロイするために、外部のコントロールループを実行することも可能です。 |
| 153 | + |
| 154 | +### Podとトポロジー管理ポリシーの関係 |
| 155 | + |
| 156 | +以下のようなpodのSpecで定義されるコンテナを考えます: |
| 157 | + |
| 158 | +```yaml |
| 159 | +spec: |
| 160 | + containers: |
| 161 | + - name: nginx |
| 162 | + image: nginx |
| 163 | +``` |
| 164 | +
|
| 165 | +`requests`も`limits`も定義されていないため、このPodは`BestEffort`QoSクラスで実行します。 |
| 166 | + |
| 167 | +```yaml |
| 168 | +spec: |
| 169 | + containers: |
| 170 | + - name: nginx |
| 171 | + image: nginx |
| 172 | + resources: |
| 173 | + limits: |
| 174 | + memory: "200Mi" |
| 175 | + requests: |
| 176 | + memory: "100Mi" |
| 177 | +``` |
| 178 | + |
| 179 | +requestsがlimitsより小さい値のため、このPodは`Burstable`QoSクラスで実行します。 |
| 180 | + |
| 181 | +選択されたポリシーが`none`以外の場合、トポロジーマネージャーは、これらのPodのSpecを考慮します。トポロジーマネージャーは、Hint Providersからトポロジーヒントを取得します。CPUマネージャーポリシーが`static`の場合、デフォルトのトポロジーヒントを返却します。これらのPodは明示的にCPUリソースを要求していないからです。 |
| 182 | + |
| 183 | + |
| 184 | +```yaml |
| 185 | +spec: |
| 186 | + containers: |
| 187 | + - name: nginx |
| 188 | + image: nginx |
| 189 | + resources: |
| 190 | + limits: |
| 191 | + memory: "200Mi" |
| 192 | + cpu: "2" |
| 193 | + example.com/device: "1" |
| 194 | + requests: |
| 195 | + memory: "200Mi" |
| 196 | + cpu: "2" |
| 197 | + example.com/device: "1" |
| 198 | +``` |
| 199 | + |
| 200 | +整数値でCPUリクエストを指定されたこのPodは、`requests`が`limits`が同じ値のため、`Guaranteed`QoSクラスで実行します。 |
| 201 | + |
| 202 | + |
| 203 | +```yaml |
| 204 | +spec: |
| 205 | + containers: |
| 206 | + - name: nginx |
| 207 | + image: nginx |
| 208 | + resources: |
| 209 | + limits: |
| 210 | + memory: "200Mi" |
| 211 | + cpu: "300m" |
| 212 | + example.com/device: "1" |
| 213 | + requests: |
| 214 | + memory: "200Mi" |
| 215 | + cpu: "300m" |
| 216 | + example.com/device: "1" |
| 217 | +``` |
| 218 | + |
| 219 | +CPUの一部をリクエストで指定されたこのPodは、`requests`が`limits`が同じ値のため、`Guaranteed`QoSクラスで実行します。 |
| 220 | + |
| 221 | + |
| 222 | +```yaml |
| 223 | +spec: |
| 224 | + containers: |
| 225 | + - name: nginx |
| 226 | + image: nginx |
| 227 | + resources: |
| 228 | + limits: |
| 229 | + example.com/deviceA: "1" |
| 230 | + example.com/deviceB: "1" |
| 231 | + requests: |
| 232 | + example.com/deviceA: "1" |
| 233 | + example.com/deviceB: "1" |
| 234 | +``` |
| 235 | +CPUもメモリもリクエスト値がないため、このPodは `BestEffort` QoSクラスで実行します。 |
| 236 | + |
| 237 | +トポロジーマネージャーは、上記Podを考慮します。トポロジーマネージャーは、Hint ProvidersとなるCPUマネージャーとデバイスマネージャーに問い合わせ、トポロジーヒントを取得します。 |
| 238 | + |
| 239 | +整数値でCPU要求を指定された`Guaranteed`QoSクラスのPodの場合、`static`が設定されたCPUマネージャーポリシーは、排他的なCPUに関するトポロジーヒントを返却し、デバイスマネージャーは要求されたデバイスのヒントを返します。 |
| 240 | + |
| 241 | +CPUの一部を要求を指定された`Guaranteed`QoSクラスのPodの場合、排他的ではないCPU要求のため`static`が設定されたCPUマネージャーポリシーはデフォルトのトポロジーヒントを返却します。デバイスマネージャーは要求されたデバイスのヒントを返します。 |
| 242 | + |
| 243 | +上記の`Guaranteed`QoSクラスのPodに関する2ケースでは、`none`で設定されたCPUマネージャーポリシーは、デフォルトのトポロジーヒントを返却します。 |
| 244 | + |
| 245 | +`BestEffort`QoSクラスのPodの場合、`static`が設定されたCPUマネージャーポリシーは、CPUの要求がないためデフォルトのトポロジーヒントを返却します。デバイスマネージャーは要求されたデバイスごとのヒントを返します。 |
| 246 | + |
| 247 | +トポロジーマネージャーはこの情報を使用してPodに最適なヒントを計算し保存します。保存されたヒントは Hint Providersが使用しリソースを割り当てます。 |
| 248 | + |
| 249 | +### 既知の制限 |
| 250 | +1. トポロジーマネージャーが許容するNUMAノードの最大値は8です。8より多いNUMAノードでは、可能なNUMAアフィニティを列挙しヒントを生成する際に、生成する状態数が爆発的に増加します。 |
| 251 | + |
| 252 | +2. スケジューラーはトポロジーを意識しません。そのため、ノードにスケジュールされた後に実行に失敗する可能性があります。 |
0 commit comments