このページでは、ポッドまたはそのコンテナを再起動せずに、実行中のポッドのコンテナに割り当てられた CPU およびメモリ リソースを調整する方法について説明します。Kubernetes ノードは、 requests
ポッドに基づいてリソースをポッドに割り当て、 limits
ポッドのコンテナで指定された仕様に基づいてポッドのリソース使用量を制限します。
Pod リソースを適切に調整するには:
- CPU リソースとメモリ リソースのコンテナの
requests
合計は 変更可能limits
です。 - ポッドの状態
containerStatuses
の フィールドはallocatedResources
、ポッドのコンテナに割り当てられたリソースを反映します。 - ポッド状態
containerStatuses
の フィールドはresources
、コンテナrequests
ランタイム によって報告される、実行中のコンテナに設定された実際のリソースの合計を反映しますlimits
。
- ポッドステータスの フィールドに
resize
は、最後に要求された保留中の調整のステータスが表示されます。このフィールドには次の値を指定できます。Proposed
: この値は、要求された調整が承認され、要求が検証されて記録されたことを示します。InProgress
: この値は、ノードが調整リクエストを受け入れ、それをポッドのコンテナに適用していることを示します。Deferred
: この値は、要求された調整が現時点では承認できず、ノードが再試行を続けることを意味します。調整は、他のポッドが終了してノード リソースを解放するときに実際に実装される場合があります。Infeasible
: この値は、ノードが要求された調整値を引き受けることができないことを示します。これは、要求された調整がノードがポッドに割り当てることができる最大リソースを超える場合に発生する可能性があります。
始める準備ができています
Kubernetes クラスターが必要であり、クラスターと通信できるように kubectl コマンドライン ツールを構成する必要があります。このチュートリアルは、コントロール プレーンのホストではない少なくとも 2 つのノードを含むクラスターで実行することをお勧めします。
Kubernetes サーバーのバージョンは少なくともバージョン 1.27 である必要があります。バージョン情報については、「 」と入力してください kubectl version
。
コンテナのサイジング戦略
チューニング ポリシーを使用すると、Pod 内のコンテナーが CPU およびメモリ リソースに対してどのように調整されるかをより詳細に制御できます。たとえば、コンテナ内のアプリケーションは再起動せずに CPU リソースの調整を処理できますが、メモリの調整にはアプリケーションの再起動が必要な場合があるため、コンテナも再起動する必要があります。
これを実現するために、コンテナ仕様ではユーザー指定が可能です resizePolicy
。CPU とメモリをチューニングするために次の再起動ポリシーを設定できます。
NotRequired
: 実行時にコンテナのリソースを調整します。RestartContainer
: コンテナを再起動し、再起動後に新しいリソースを適用します。
指定しない場合は resizePolicy[*].restartPolicy
、デフォルトの が使用されます NotRequired
。
例証します:
ポッドが restartPolicy
の 場合Never
、ポッド内のすべてのコンテナの調整された再起動ポリシーを に設定する必要があります NotRequired
。
以下の例は、コンテナを再起動せずに CPU を調整できる Pod を示していますが、メモリの調整にはコンテナの再起動が必要です。
apiVersion: v1
kind: Pod
metadata:
name: qos-demo-5
namespace: qos-example
spec:
containers:
- name: qos-demo-ctr-5
image: nginx
resizePolicy:
- resourceName: cpu
restartPolicy: NotRequired
- resourceName: memory
restartPolicy: RestartContainer
resources:
limits:
memory: "200Mi"
cpu: "700m"
requests:
memory: "200Mi"
cpu: "700m"
例証します:
上記の例では、必要な CPU およびメモリのリクエストまたは制限が変更された場合、コンテナはメモリを調整するために再起動されます。
リソースのリクエストと制限を含むポッドを作成する
ポッドのコンテナに対するリクエストや制限を指定することで、保証型またはバースタブル QoS クラスを持つポッドを作成できます。
1 つのコンテナを含む Pod の次のマニフェストを考えてみましょう。
pods/qos/qos-pod-5.yaml
apiVersion: v1
kind: Pod
metadata:
name: qos-demo-5
namespace: qos-example
spec:
containers:
- name: qos-demo-ctr-5
image: nginx
resources:
limits:
memory: "200Mi"
cpu: "700m"
requests:
memory: "200Mi"
cpu: "700m"
qos-example
名前空間に ポッドを作成します。
kubectl create namespace qos-example
kubectl create -f https://k8s.io/examples/pods/qos/qos-pod-5.yaml --namespace=qos-example
このポッドは保証型 QoS クラスとして分類され、700M CPU と 200Mi メモリを要求します。
ポッドに関する詳細を表示します。
kubectl get pod qos-demo-5 --output=yaml --namespace=qos-example
また、resizePolicy[*].restartPolicy
値のデフォルトは である ことに注意してくださいNotRequired
。これは、コンテナーの実行中に CPU とメモリのサイズを変更できることを意味します。
spec:
containers:
...
resizePolicy:
- resourceName: cpu
restartPolicy: NotRequired
- resourceName: memory
restartPolicy: NotRequired
resources:
limits:
cpu: 700m
memory: 200Mi
requests:
cpu: 700m
memory: 200Mi
...
containerStatuses:
...
name: qos-demo-ctr-5
ready: true
...
allocatedResources:
cpu: 700m
memory: 200Mi
resources:
limits:
cpu: 700m
memory: 200Mi
requests:
cpu: 700m
memory: 200Mi
restartCount: 0
started: true
...
qosClass: Guaranteed
ポッドのリソースを更新する
必要な CPU 需要が増加し、0.8 CPU が必要になったと仮定します。これは通常、VerticalPodAutoscaler (VPA) などのエンティティによって決定され、プログラム的に適用される場合があります。
例証します:
新しい必要なリソースを表すようにポッドのリクエストと制限を変更することはできますが、ポッドの作成に使用された QoS クラスを変更することはできません。
次に、ポッドのコンテナで patch コマンドを実行し、コンテナの CPU リクエストと制限を次のように設定します 800m
。
kubectl -n qos-example patch pod qos-demo-5 --patch '{"spec":{"containers":[{"name":"qos-demo-ctr-5", "resources":{"requests":{"cpu":"800m"}, "limits":{"cpu":"800m"}}}]}}'
パッチ適用後にポッドの詳細をクエリします。
kubectl get pod qos-demo-5 --output=yaml --namespace=qos-example
次のポッドの仕様には、更新された CPU リクエストと制限が反映されています。
spec:
containers:
...
resources:
limits:
cpu: 800m
memory: 200Mi
requests:
cpu: 800m
memory: 200Mi
...
containerStatuses:
...
allocatedResources:
cpu: 800m
memory: 200Mi
resources:
limits:
cpu: 800m
memory: 200Mi
requests:
cpu: 800m
memory: 200Mi
restartCount: 0
started: true
観測された allocatedResources
値は、新たに予想される CPU リクエストを反映するように更新されました。これは、ノードが CPU リソースの需要の増加に対応できることを示します。
コンテナ状態では、更新された CPU リソース値は、新しい CPU リソースが適用されたことを示します。コンテナー restartCount
は変更されず、コンテナーを再起動せずにコンテナーの CPU リソースが調整されたことを示します。