Skip to content

Commit 538510d

Browse files
authored
Merge pull request #31928 from 196Ikuchil/trans_pod_overhead
[ja] Translate concepts/scheduling-eviction/pod-overhead/ into Japanese
2 parents be227b3 + 30de7d9 commit 538510d

File tree

1 file changed

+160
-0
lines changed

1 file changed

+160
-0
lines changed
Lines changed: 160 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,160 @@
1+
---
2+
title: Podのオーバーヘッド
3+
content_type: concept
4+
weight: 30
5+
---
6+
7+
<!-- overview -->
8+
9+
{{< feature-state for_k8s_version="v1.18" state="beta" >}}
10+
11+
12+
PodをNode上で実行する時に、Pod自身は大量のシステムリソースを消費します。これらのリソースは、Pod内のコンテナ(群)を実行するために必要なリソースとして追加されます。Podのオーバーヘッドは、コンテナの要求と制限に加えて、Podのインフラストラクチャで消費されるリソースを計算するための機能です。
13+
14+
15+
16+
17+
<!-- body -->
18+
19+
Kubernetesでは、Podの[RuntimeClass](/docs/concepts/containers/runtime-class/)に関連するオーバーヘッドに応じて、[アドミッション](/ja/docs/reference/access-authn-authz/extensible-admission-controllers/#what-are-admission-webhooks)時にPodのオーバーヘッドが設定されます。
20+
21+
Podのオーバーヘッドを有効にした場合、Podのスケジューリング時にコンテナのリソース要求の合計に加えて、オーバーヘッドも考慮されます。同様に、Kubeletは、Podのcgroupのサイズ決定時およびPodの退役の順位付け時に、Podのオーバーヘッドを含めます。
22+
23+
## Podのオーバーヘッドの有効化 {#set-up}
24+
25+
クラスター全体で`PodOverhead`[フィーチャーゲート](/ja/docs/reference/command-line-tools-reference/feature-gates/)が有効になっていること(1.18時点ではデフォルトでオンになっています)と、`overhead`フィールドを定義する`RuntimeClass`が利用されていることを確認する必要があります。
26+
27+
## 使用例
28+
29+
Podのオーバーヘッド機能を使用するためには、`overhead`フィールドが定義されたRuntimeClassが必要です。例として、仮想マシンとゲストOSにPodあたり約120MiBを使用する仮想化コンテナランタイムで、次のようなRuntimeClassを定義できます。
30+
31+
```yaml
32+
---
33+
kind: RuntimeClass
34+
apiVersion: node.k8s.io/v1
35+
metadata:
36+
name: kata-fc
37+
handler: kata-fc
38+
overhead:
39+
podFixed:
40+
memory: "120Mi"
41+
cpu: "250m"
42+
```
43+
44+
`kata-fc`RuntimeClassハンドラーを指定して作成されたワークロードは、リソースクォータの計算や、Nodeのスケジューリング、およびPodのcgroupのサイズ決定にメモリーとCPUのオーバーヘッドが考慮されます。
45+
46+
次のtest-podのワークロードの例を実行するとします。
47+
48+
```yaml
49+
apiVersion: v1
50+
kind: Pod
51+
metadata:
52+
name: test-pod
53+
spec:
54+
runtimeClassName: kata-fc
55+
containers:
56+
- name: busybox-ctr
57+
image: busybox
58+
stdin: true
59+
tty: true
60+
resources:
61+
limits:
62+
cpu: 500m
63+
memory: 100Mi
64+
- name: nginx-ctr
65+
image: nginx
66+
resources:
67+
limits:
68+
cpu: 1500m
69+
memory: 100Mi
70+
```
71+
72+
アドミッション時、RuntimeClass[アドミッションコントローラー](/docs/reference/access-authn-authz/admission-controllers/)は、RuntimeClass内に記述された`オーバーヘッド`を含むようにワークロードのPodSpecを更新します。もし既にPodSpec内にこのフィールドが定義済みの場合、そのPodは拒否されます。この例では、RuntimeClassの名前しか指定されていないため、アドミッションコントローラーは`オーバーヘッド`を含むようにPodを変更します。
73+
74+
RuntimeClassのアドミッションコントローラーの後、更新されたPodSpecを確認できます。
75+
76+
```bash
77+
kubectl get pod test-pod -o jsonpath='{.spec.overhead}'
78+
```
79+
80+
出力は次の通りです:
81+
```
82+
map[cpu:250m memory:120Mi]
83+
```
84+
ResourceQuotaが定義されている場合、コンテナ要求の合計と`オーバーヘッド`フィールドがカウントされます。
85+
86+
kube-schedulerが新しいPodを実行すべきNodeを決定する際、スケジューラーはそのPodの`オーバーヘッド`と、そのPodに対するコンテナ要求の合計を考慮します。この例だと、スケジューラーは、要求とオーバーヘッドを追加し、2.25CPUと320MiBのメモリを持つNodeを探します。
87+
88+
PodがNodeにスケジュールされると、そのNodeのkubeletはPodのために新しい{{< glossary_tooltip text="cgroup" term_id="cgroup" >}}を生成します。基盤となるコンテナランタイムがコンテナを作成するのは、このPod内です。
89+
90+
リソースにコンテナごとの制限が定義されている場合(制限が定義されているGuaranteed QoSまたはBustrable QoS)、kubeletはそのリソース(CPUはcpu.cfs_quota_us、メモリはmemory.limit_in_bytes)に関連するPodのcgroupの上限を設定します。この上限は、コンテナの制限とPodSpecで定義された`オーバーヘッド`の合計に基づきます。
91+
92+
CPUについては、PodがGuaranteedまたはBurstable QoSの場合、kubeletはコンテナの要求の合計とPodSpecに定義された`オーバーヘッド`に基づいて`cpu.share`を設定します。
93+
94+
次の例より、ワークロードに対するコンテナの要求を確認できます。
95+
```bash
96+
kubectl get pod test-pod -o jsonpath='{.spec.containers[*].resources.limits}'
97+
```
98+
99+
コンテナの要求の合計は、CPUは2000m、メモリーは200MiBです。
100+
```
101+
map[cpu: 500m memory:100Mi] map[cpu:1500m memory:100Mi]
102+
```
103+
104+
Nodeで観測される値と比較してみましょう。
105+
```bash
106+
kubectl describe node | grep test-pod -B2
107+
```
108+
109+
出力では、2250mのCPUと320MiBのメモリーが要求されており、Podのオーバーヘッドが含まれていることが分かります。
110+
```
111+
Namespace Name CPU Requests CPU Limits Memory Requests Memory Limits AGE
112+
--------- ---- ------------ ---------- --------------- ------------- ---
113+
default test-pod 2250m (56%) 2250m (56%) 320Mi (1%) 320Mi (1%) 36m
114+
```
115+
116+
## Podのcgroupの制限を確認
117+
118+
ワークロードで実行中のNode上にある、Podのメモリーのcgroupを確認します。次に示す例では、CRI互換のコンテナランタイムのCLIを提供するNodeで[`crictl`](https://github.com/kubernetes-sigs/cri-tools/blob/master/docs/crictl.md)を使用しています。これはPodのオーバーヘッドの動作を示すための高度な例であり、ユーザーがNode上で直接cgroupsを確認する必要はありません。
119+
120+
まず、特定のNodeで、Podの識別子を決定します。
121+
122+
```bash
123+
# PodがスケジュールされているNodeで実行
124+
POD_ID="$(sudo crictl pods --name test-pod -q)"
125+
```
126+
127+
ここから、Podのcgroupのパスが決定します。
128+
```bash
129+
# PodがスケジュールされているNodeで実行
130+
sudo crictl inspectp -o=json $POD_ID | grep cgroupsPath
131+
```
132+
133+
結果のcgroupパスにはPodの`ポーズ中`コンテナも含まれます。Podレベルのcgroupは1つ上のディレクトリです。
134+
```
135+
"cgroupsPath": "/kubepods/podd7f4b509-cf94-4951-9417-d1087c92a5b2/7ccf55aee35dd16aca4189c952d83487297f3cd760f1bbf09620e206e7d0c27a"
136+
```
137+
138+
今回のケースでは、Podのcgroupパスは、`kubepods/podd7f4b509-cf94-4951-9417-d1087c92a5b2`となります。メモリーのPodレベルのcgroupの設定を確認しましょう。
139+
```bash
140+
# PodがスケジュールされているNodeで実行
141+
# また、Podに割り当てられたcgroupと同じ名前に変更
142+
cat /sys/fs/cgroup/memory/kubepods/podd7f4b509-cf94-4951-9417-d1087c92a5b2/memory.limit_in_bytes
143+
```
144+
145+
予想通り320MiBです。
146+
```
147+
335544320
148+
```
149+
150+
### Observability
151+
152+
Podのオーバヘッドが利用されているタイミングを特定し、定義されたオーバーヘッドで実行されているワークロードの安定性を観察するため、[kube-state-metrics](https://github.com/kubernetes/kube-state-metrics)には`kube_pod_overhead`というメトリクスが用意されています。この機能はv1.9のkube-state-metricsでは利用できませんが、次のリリースで期待されています。それまでは、kube-state-metricsをソースからビルドする必要があります。
153+
154+
155+
156+
## {{% heading "whatsnext" %}}
157+
158+
159+
* [RuntimeClass](/ja/docs/concepts/containers/runtime-class/)
160+
* [Podのオーバーヘッドの設計](https://github.com/kubernetes/enhancements/tree/master/keps/sig-node/688-pod-overhead)

0 commit comments

Comments
 (0)