|
| 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