|
| 1 | +--- |
| 2 | +title: コンテナに割り当てるCPUとメモリ容量を変更する |
| 3 | +content_type: task |
| 4 | +weight: 30 |
| 5 | +min-kubernetes-server-version: 1.27 |
| 6 | +--- |
| 7 | + |
| 8 | + |
| 9 | +
|
| 10 | + |
| 11 | +{{< feature-state feature_gate_name="InPlacePodVerticalScaling" >}} |
| 12 | + |
| 13 | +このページは[Quality of Service](/ja/docs/tasks/configure-pod-container/quality-service-pod/)に馴染みのある読者を前提としています。 |
| 14 | + |
| 15 | +このページでは、稼働中のPodやコンテナを再起動することなく、コンテナに割り当てられるCPUやメモリ容量を変更(リサイズ)するための方法を示します。 |
| 16 | +Kubernetesノードは、PodのContainerに指定した`requests`に基づいてPodにリソースを割り当て、`limits`に基づいてPodのリソース使用量を制限します。 |
| 17 | + |
| 18 | +稼働中のPodのリソース割当を変更するには、 `InPlacePodVerticalScaling` [フィーチャーゲート](/ja/docs/reference/command-line-tools-reference/feature-gates/)を有効化する必要があります。 |
| 19 | +代替手法としては、Podを削除した上で、異なるリソース要求を有するPodを[ワークロードコントローラー](/ja/docs/concepts/workloads/controllers/) に作成させることもできます。 |
| 20 | + |
| 21 | +稼働中のPodのリソースを変更するために |
| 22 | + |
| 23 | +- Containerの `requests` と `limits` はCPUおよびメモリリソースに対して _可変_ なものとなっています。 |
| 24 | +- Podステータスの `containerStatuses` における `allocatedResources` フィールドは、PodのContainerに割り当てられたリソースを反映します。 |
| 25 | +- Podステータスの `containerStatuses` における `resources` フィールドは、稼働中Containerに設定済みの実際のリソース要求(`requests`)とリソース制限(`limits`)を反映しており、これらの値はコンテナランタイムが通知したものです。 |
| 26 | +- Podステータスの `resize` フィールドは直前の適用待ちのリサイズ要求を示します。 |
| 27 | +このフィールドの値には次のようなものがあります。 |
| 28 | + - `Proposed`: リサイズ要求の受理を表し、リクエストが検証済みかつ記録済み |
| 29 | + であることを示します。 |
| 30 | + - `InProgress`: リサイズ要求がノードによって受理され、Podのコンテナに対する |
| 31 | + 適用が進行中であることを示します。 |
| 32 | + - `Deferred`: リサイズ要求が現時点では通っていないことを示します。 |
| 33 | + 他のPodが除去されてノードの資源が開放されたら、リサイズが承認されるかもしれません。 |
| 34 | + - `Infeasible`: ノードがリサイズ要求に対応できないことを示すシグナルです。 |
| 35 | + Podに対してノードが割り当て可能なリソースの最大値を上回るリサイズ要求がある時に |
| 36 | + 発生する可能性があります。 |
| 37 | + |
| 38 | + |
| 39 | +## {{% heading "prerequisites" %}} |
| 40 | + |
| 41 | + |
| 42 | +{{< include "task-tutorial-prereqs.md" >}} {{< version-check >}} |
| 43 | + |
| 44 | +クラスターのコントロールプレーンを含む全ノードで`InPlacePodVerticalScaling` [フィーチャーゲート](/ja/docs/reference/command-line-tools-reference/feature-gates/)が有効化されている必要があります。 |
| 45 | + |
| 46 | +## コンテナリサイズポリシー |
| 47 | + |
| 48 | +リサイズポリシーはPodにおけるコンテナのCPUやメモリリソースを取り扱うためのきめ細かい制御を可能にします。 |
| 49 | +例えば、アプリケーションを再起動せずにコンテナのCPUリソースのリサイズを行える場合でも、メモリのリサイズについてはアプリケーションとコンテナの再起動が必要となる場合があります。 |
| 50 | + |
| 51 | +これを実現するために、ユーザーはContainerの仕様に `resizePolicy` を指定できるようになっています。 |
| 52 | +以下の再起動ポリシーをCPUやメモリのリサイズの際に指定できます。 |
| 53 | +* `NotRequired`: 稼働中のコンテナリソースをリサイズします。 |
| 54 | +* `RestartContainer`: コンテナを再起動させ、再起動時に新しいリソースを適用します。 |
| 55 | + |
| 56 | +`resizePolicy[*].restartPolicy` が指定されない場合のデフォルトは、`NotRequired`です。 |
| 57 | + |
| 58 | +{{< note >}} |
| 59 | +Podの`restartPolicy`が`Never`である場合、Podの全コンテナの再起動ポリシーが`NotRequired`である必要があります。 |
| 60 | +{{< /note >}} |
| 61 | + |
| 62 | +以下のPodの例は、ContainerのCPUのリサイズは再起動なしで実施させ、メモリのリサイズにはコンテナの再起動を要求するものです。 |
| 63 | + |
| 64 | +```yaml |
| 65 | +apiVersion: v1 |
| 66 | +kind: Pod |
| 67 | +metadata: |
| 68 | + name: qos-demo-5 |
| 69 | + namespace: qos-example |
| 70 | +spec: |
| 71 | + containers: |
| 72 | + - name: qos-demo-ctr-5 |
| 73 | + image: nginx |
| 74 | + resizePolicy: |
| 75 | + - resourceName: cpu |
| 76 | + restartPolicy: NotRequired |
| 77 | + - resourceName: memory |
| 78 | + restartPolicy: RestartContainer |
| 79 | + resources: |
| 80 | + limits: |
| 81 | + memory: "200Mi" |
| 82 | + cpu: "700m" |
| 83 | + requests: |
| 84 | + memory: "200Mi" |
| 85 | + cpu: "700m" |
| 86 | +``` |
| 87 | +
|
| 88 | +{{< note >}} |
| 89 | +この例の requests ないしは limits が CPUとメモリの _両方を_ 変化させる場合、 |
| 90 | +メモリのリサイズが生じるので、コンテナは再起動します。 |
| 91 | +{{< /note >}} |
| 92 | +
|
| 93 | +
|
| 94 | +
|
| 95 | +## リソース要求やリソース制限のあるPodを作成する |
| 96 | +
|
| 97 | +リソース要求やリソース制限をPodのコンテナに指定することで、保証(Guaranteed)ないしは バースト可能(Burstable)な[Quality of Service](/ja/docs/tasks/configure-pod-container/quality-service-pod/)クラスのPodを作成することができます。 |
| 98 | +
|
| 99 | +次のような単一のコンテナを含むPodのマニフェストを考えてみましょう。 |
| 100 | +
|
| 101 | +{{% code_sample file="pods/qos/qos-pod-5.yaml" %}} |
| 102 | +
|
| 103 | +Podを`qos-example` Namespace に作成します。 |
| 104 | + |
| 105 | +```shell |
| 106 | +kubectl create namespace qos-example |
| 107 | +kubectl create -f https://k8s.io/examples/pods/qos/qos-pod-5.yaml |
| 108 | +``` |
| 109 | + |
| 110 | +このPodは保証QoSクラスに区分され、700mのCPU、200Miのメモリを要求します。 |
| 111 | + |
| 112 | +Podの詳細な情報を見てみましょう。 |
| 113 | + |
| 114 | +```shell |
| 115 | +kubectl get pod qos-demo-5 --output=yaml --namespace=qos-example |
| 116 | +``` |
| 117 | +`resizePolicy[*].restartPolicy`の値がデフォルトの`NotRequired`になっていることに気づいたでしょうか。 |
| 118 | +これはCPUとメモリがコンテナ稼働中にリサイズできることを示しています。 |
| 119 | + |
| 120 | +```yaml |
| 121 | +spec: |
| 122 | + containers: |
| 123 | + ... |
| 124 | + resizePolicy: |
| 125 | + - resourceName: cpu |
| 126 | + restartPolicy: NotRequired |
| 127 | + - resourceName: memory |
| 128 | + restartPolicy: NotRequired |
| 129 | + resources: |
| 130 | + limits: |
| 131 | + cpu: 700m |
| 132 | + memory: 200Mi |
| 133 | + requests: |
| 134 | + cpu: 700m |
| 135 | + memory: 200Mi |
| 136 | +... |
| 137 | + containerStatuses: |
| 138 | +... |
| 139 | + name: qos-demo-ctr-5 |
| 140 | + ready: true |
| 141 | +... |
| 142 | + allocatedResources: |
| 143 | + cpu: 700m |
| 144 | + memory: 200Mi |
| 145 | + resources: |
| 146 | + limits: |
| 147 | + cpu: 700m |
| 148 | + memory: 200Mi |
| 149 | + requests: |
| 150 | + cpu: 700m |
| 151 | + memory: 200Mi |
| 152 | + restartCount: 0 |
| 153 | + started: true |
| 154 | +... |
| 155 | + qosClass: Guaranteed |
| 156 | +``` |
| 157 | + |
| 158 | + |
| 159 | +## Podのリソースを更新する |
| 160 | + |
| 161 | +要求CPUを0.8CPUに増やしてみます。 |
| 162 | +これは手動でも指定できますし、[VerticalPodAutoscaler](https://github.com/kubernetes/autoscaler/tree/master/vertical-pod-autoscaler#readme)(VPA)などを用いて自動的に検出/適用することもできます。 |
| 163 | + |
| 164 | +{{< note >}} |
| 165 | +Podのリソース要求やリソース制限を変更して希望の容量に合わせることはできますが、Pod作成時に指定したQoSクラスを変更することはできません。 |
| 166 | +{{< /note >}} |
| 167 | + |
| 168 | +PodのContainerのCPU要求とCPU制限をいずれも`800m`に指定するパッチを当ててみます。 |
| 169 | + |
| 170 | +```shell |
| 171 | +kubectl -n qos-example patch pod qos-demo-5 --patch '{"spec":{"containers":[{"name":"qos-demo-ctr-5", "resources":{"requests":{"cpu":"800m"}, "limits":{"cpu":"800m"}}}]}}' |
| 172 | +``` |
| 173 | + |
| 174 | +Podへのパッチが当たったら、Podの詳細情報を参照してみましょう。 |
| 175 | + |
| 176 | +```shell |
| 177 | +kubectl get pod qos-demo-5 --output=yaml --namespace=qos-example |
| 178 | +``` |
| 179 | + |
| 180 | +以下のPod仕様は更新済みのCPU要求とCPU制限を反映しています。 |
| 181 | + |
| 182 | +```yaml |
| 183 | +spec: |
| 184 | + containers: |
| 185 | + ... |
| 186 | + resources: |
| 187 | + limits: |
| 188 | + cpu: 800m |
| 189 | + memory: 200Mi |
| 190 | + requests: |
| 191 | + cpu: 800m |
| 192 | + memory: 200Mi |
| 193 | +... |
| 194 | + containerStatuses: |
| 195 | +... |
| 196 | + allocatedResources: |
| 197 | + cpu: 800m |
| 198 | + memory: 200Mi |
| 199 | + resources: |
| 200 | + limits: |
| 201 | + cpu: 800m |
| 202 | + memory: 200Mi |
| 203 | + requests: |
| 204 | + cpu: 800m |
| 205 | + memory: 200Mi |
| 206 | + restartCount: 0 |
| 207 | + started: true |
| 208 | +``` |
| 209 | + |
| 210 | +期待する新しいCPU要求を反映する形で `allocatedResources` の値が更新されていることを確認しておきましょう。 |
| 211 | +これはノードがCPUリソースの追加要求に対応できたことを示しています。 |
| 212 | + |
| 213 | +Containerの状態においてはCPUリソースの値が更新されており、新しいCPUリソースが適用されたことを示しています。 |
| 214 | +Containerの`restartCount`は変化しておらず、コンテナのCPUリソースがコンテナの再起動なしで変更されたことを示しています。 |
| 215 | + |
| 216 | +## クリーンアップ |
| 217 | + |
| 218 | +名前空間を削除しましょう。 |
| 219 | + |
| 220 | +```shell |
| 221 | +kubectl delete namespace qos-example |
| 222 | +``` |
| 223 | + |
| 224 | +## {{% heading "whatsnext" %}} |
| 225 | + |
| 226 | + |
| 227 | +### アプリケーション開発者向け |
| 228 | + |
| 229 | +* [コンテナおよびPodへのメモリーリソースの割り当て](/ja/docs/tasks/configure-pod-container/assign-memory-resource/) |
| 230 | + |
| 231 | +* [コンテナおよびPodへのCPUリソースの割り当て](/ja/docs/tasks/configure-pod-container/assign-cpu-resource/) |
| 232 | + |
| 233 | +### クラスター管理者向け |
| 234 | + |
| 235 | +* [Namespaceのデフォルトのメモリー要求と制限を設定する](/ja/docs/tasks/administer-cluster/manage-resources/memory-default-namespace/) |
| 236 | + |
| 237 | +* [NamespaceのデフォルトのCPU要求と制限を設定する](/docs/tasks/administer-cluster/manage-resources/cpu-default-namespace/) |
| 238 | + |
| 239 | +* [Namespaceに対する最小および最大メモリー制約の構成](/ja/docs/tasks/administer-cluster/manage-resources/memory-constraint-namespace/) |
| 240 | + |
| 241 | +* [Namespaceに対する最小および最大CPU制約の構成](/docs/tasks/administer-cluster/manage-resources/cpu-constraint-namespace/) |
| 242 | + |
| 243 | +* [Namespaceに対するメモリとCPUのクォータを設定する](/docs/tasks/administer-cluster/manage-resources/quota-memory-cpu-namespace/) |
| 244 | + |
| 245 | + |
0 commit comments