このページでは、メモリリクエスト(リクエスト) とメモリ制限(リミット) をコンテナに割り当てる方法を示します。コンテナーには要求された量のメモリがあることが保証されますが、制限を超えて使用することは許可されません。
始める準備ができています
Kubernetes クラスターが必要であり、クラスターと通信できるように kubectl コマンドライン ツールを構成する必要があります。このチュートリアルは、コントロール プレーンのホストではない少なくとも 2 つのノードを含むクラスターで実行することをお勧めします。
バージョン情報については、「 」と入力します kubectl version
。
クラスター内の各ノードには少なくとも 300 MiB のメモリが必要です。
このページの一部の手順では、クラスター内で metrics-server サービスを実行する必要があります。すでに metrics-server を実行している場合は、これらの手順をスキップできます。
Minikube を実行している場合は、次のコマンドを実行して metrics-server を有効にできます。
minikube addons enable metrics-server
metrics.k8s.io
メトリクス サーバーまたはリソース メトリクス API ( ) がすでに実行されているかどうかを確認するには、次のコマンドを実行します。
kubectl get apiservices
Resource Metrics API が利用可能な場合、出力 metrics.k8s.io
には への参照が含まれます。
NAME
v1beta1.metrics.k8s.io
名前空間を作成する
名前空間を作成して、この演習で作成したリソースをクラスターの残りの部分から分離します。
kubectl create namespace mem-example
メモリ要求と制限を指定する
コンテナーのメモリ要求を指定するには、 resources: requests
コンテナー マニフェストにフィールドを含めます。同様に、メモリ制限を指定するには、 を含めます resources: limits
。
この演習では、1 つのコンテナーを含むポッドを作成します。コンテナーは 100 MiB のメモリを要求しますが、メモリは 200 MiB に制限されます。ポッドの設定ファイルは次のとおりです。
pods/resource/memory-request-limit.yaml
apiVersion: v1
kind: Pod
metadata:
name: memory-demo
namespace: mem-example
spec:
containers:
- name: memory-demo-ctr
image: polinux/stress
resources:
requests:
memory: "100Mi"
limits:
memory: "200Mi"
command: ["stress"]
args: ["--vm", "1", "--vm-bytes", "150M", "--vm-hang", "1"]
構成ファイルの セクションにはargs
、コンテナーの起動時のパラメーターが提供されます。 "--vm-bytes", "150M"
パラメータは、コンテナに 150 MiB のメモリの割り当てを試みるよう指示します。
ポッドの作成を開始します。
kubectl apply -f https://k8s.io/examples/pods/resource/memory-request-limit.yaml --namespace=mem-example
ポッド内のコンテナが実行されていることを確認します。
kubectl get pod memory-demo --namespace=mem-example
ポッドに関する詳細情報を表示します。
kubectl get pod memory-demo --output=yaml --namespace=mem-example
出力は、このポッド内のコンテナーのメモリ要求が 100 MiB で、メモリ制限が 200 MiB であることを示しています。
...
resources:
requests:
memory: 100Mi
limits:
memory: 200Mi
...
コマンドを実行して kubectl top
ポッドのメトリック データを取得します。
kubectl top pod memory-demo --namespace=mem-example
出力は、Pod が約 162,900,000 バイトのメモリ、つまり約 150 MiB を使用していることを示しています。これはポッドが要求した 100 MiB よりも大きくなりますが、ポッドの制限である 200 MiB 内にあります。
NAME CPU(cores) MEMORY(bytes)
memory-demo <something> 162856960
ポッドを削除します。
kubectl delete pod memory-demo --namespace=mem-example
メモリがコンテナの制限を超えています
ノードに十分なメモリがあれば、コンテナは要求したメモリを使用できます。ただし、コンテナーはその制限を超えるメモリを使用することはできません。コンテナーがその制限を超えるメモリを割り当てた場合、そのコンテナーは終了の候補になります。コンテナが制限を超えてメモリを消費し続ける場合、コンテナを終了します。終了したコンテナを再起動できる場合は、他の種類のランタイム障害と同様に、kubelet がコンテナを再起動します。
この演習では、制限を超えてメモリを割り当てようとする Pod を作成します。以下は、50 MiB のメモリリクエストと 100 MiB のメモリ制限を持つコンテナを持つ Pod の設定ファイルです。
pods/resource/memory-request-limit-2.yaml
apiVersion: v1
kind: Pod
metadata:
name: memory-demo-2
namespace: mem-example
spec:
containers:
- name: memory-demo-2-ctr
image: polinux/stress
resources:
requests:
memory: "50Mi"
limits:
memory: "100Mi"
command: ["stress"]
args: ["--vm", "1", "--vm-bytes", "250M", "--vm-hang", "1"]
構成ファイルの args
セクションでは、コンテナーが 250 MiB のメモリを割り当てようとしていることがわかります。これは、制限の 100 MiB をはるかに超えています。
ポッドを作成します。
kubectl apply -f https://k8s.io/examples/pods/resource/memory-request-limit-2.yaml --namespace=mem-example
ポッドに関する詳細情報を表示します。
kubectl get pod memory-demo-2 --namespace=mem-example
この時点で、コンテナは実行中であるか、強制終了されている可能性があります。コンテナが強制終了されるまで、前のコマンドを繰り返します。
NAME READY STATUS RESTARTS AGE
memory-demo-2 0/1 OOMKilled 1 24s
コンテナに関するより詳細なステータス情報を取得します。
kubectl get pod memory-demo-2 --output=yaml --namespace=mem-example
出力は、コンテナーがメモリ不足 (OOM) により強制終了されたことを示しています。
lastState:
terminated:
containerID: 65183c1877aaec2e8427bc95609cc52677a454b56fcb24340dbd22917c23b10f
exitCode: 137
finishedAt: 2017-06-20T20:52:19Z
reason: OOMKilled
startedAt: null
この演習のコンテナーは再起動できるため、kubelet によってコンテナーが再起動されます。次のコマンドを複数回実行すると、コンテナーが繰り返し強制終了され、再起動されることがわかります。
kubectl get pod memory-demo-2 --namespace=mem-example
出力には、コンテナーが強制終了され、再起動され、再度強制終了され、再起動されました...: が表示されます。
kubectl get pod memory-demo-2 --namespace=mem-example
NAME READY STATUS RESTARTS AGE
memory-demo-2 0/1 OOMKilled 1 37s
kubectl get pod memory-demo-2 --namespace=mem-example
NAME READY STATUS RESTARTS AGE
memory-demo-2 1/1 Running 2 40s
ポッドの履歴に関する詳細情報を表示します。
kubectl describe pod memory-demo-2 --namespace=mem-example
出力には、コンテナーが起動と失敗を繰り返していることが示されています。
... Normal Created Created container with id 66a3a20aa7980e61be4922780bf9d24d1a1d8b7395c09861225b0eba1b1f8511
... Warning BackOff Back-off restarting failed container
クラスターノードに関する詳細情報を表示するには、次の手順を実行します。
kubectl describe nodes
出力には、演習内のコンテナーがメモリ不足により強制終了されたというレコードが含まれています。
Warning OOMKilling Memory cgroup out of memory: Kill process 4481 (stress) score 1994 or sacrifice child
ポッドを削除します。
kubectl delete pod memory-demo-2 --namespace=mem-example
メモリがノードの全容量を超えています
メモリのリクエストと制限はコンテナに関連付けられていますが、Pod にもメモリのリクエストと制限があると考えることも役に立ちます。ポッドのメモリ リクエストは、ポッド内のすべてのコンテナのメモリ リクエストの合計です。同様に、Pod のメモリ制限は、Pod 内のすべてのコンテナのメモリ制限の合計です。
ポッドはリクエストに基づいてスケジュールされます。ポッドのメモリ要求を満たすのに十分なメモリがノードにある場合にのみ、ポッドはノード上で実行されるようにスケジュールされます。
この演習では、クラスター内の 1 つのノードが持つメモリ リクエストを超えるメモリ リクエストを持つポッドを作成します。以下は、1000 GiB のメモリを要求するコンテナを備えた Pod の設定ファイルです。これは、クラスタ内のノードが保持できるメモリ量を超える必要があります。
pods/resource/memory-request-limit-3.yaml
apiVersion: v1
kind: Pod
metadata:
name: memory-demo-3
namespace: mem-example
spec:
containers:
- name: memory-demo-3-ctr
image: polinux/stress
resources:
requests:
memory: "1000Gi"
limits:
memory: "1000Gi"
command: ["stress"]
args: ["--vm", "1", "--vm-bytes", "150M", "--vm-hang", "1"]
ポッドを作成します。
kubectl apply -f https://k8s.io/examples/pods/resource/memory-request-limit-3.yaml --namespace=mem-example
ポッドのステータスを確認します。
kubectl get pod memory-demo-3 --namespace=mem-example
出力には、Pod が PENDING 状態であることが示されます。これは、Pod がどのノードでも実行されるようにスケジュールされておらず、この状態が無期限に維持されることを意味します。
kubectl get pod memory-demo-3 --namespace=mem-example
NAME READY STATUS RESTARTS AGE
memory-demo-3 0/1 Pending 0 25s
イベントを含むポッドに関する詳細情報を表示します。
kubectl describe pod memory-demo-3 --namespace=mem-example
出力は、ノード上のメモリ不足のためコンテナをスケジュールできないことを示しています。
Events:
... Reason Message
------ -------
... FailedScheduling No nodes are available that match all of the following predicates:: Insufficient memory (3).
メモリユニット
メモリリソースの基本単位はバイトです。E、P、T、G、M、K、Ei、Pi、Ti、Gi、Mi、Ki の接尾辞のいずれかを使用して、メモリをプレーン整数または固定小数点整数として表すことができます。たとえば、ほぼ同じ値をいくつか示します。
128974848, 129e6, 129M, 123Mi
ポッドを削除します。
kubectl delete pod memory-demo-3 --namespace=mem-example
メモリ制限を指定しない場合
コンテナーのメモリ制限を指定しない場合は、次のいずれかが自動的に適用されます。
-
コンテナーのメモリ使用量は無制限です。コンテナはホスト ノード上の利用可能なメモリをすべて使用することができるため、ノードが OOM Killer を呼び出す可能性があります。また、OOM Kill が発生した場合、リソース制約のないコンテナーが強制終了される可能性が高くなります。
-
実行中のコンテナーの名前空間にデフォルトのメモリー制限がある場合、コンテナーにはデフォルトの制限が自動的に割り当てられます。
メモリ要求と制限の目的
クラスター内で実行されているコンテナーのメモリー要求と制限を構成することにより、クラスター・ノードで使用可能なメモリー・リソースを効率的に利用できます。ポッドのメモリ要求を低く保つことで、ポッドのスケジューリングを改善できます。メモリ制限をメモリ要求よりも大きくすることで、次の 2 つのことを達成できます。
- ポッドは、利用可能なメモリを有効に活用するためにアクティビティをバーストできます。
- ポッドは、アクティビティのバースト中に使用できる適切な量のメモリに制限されます。
そうじする
ネームスペースを削除します。次のコマンドは、このタスクで作成したすべての Pod を削除します。
kubectl delete namespace mem-example