Skip to content

Commit ba42874

Browse files
authored
Merge pull request #28075 from hikkie3110/fix-26117
create topology-manager.md
2 parents 3ca34b9 + 30b9889 commit ba42874

File tree

1 file changed

+252
-0
lines changed

1 file changed

+252
-0
lines changed
Lines changed: 252 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,252 @@
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

Comments
 (0)