Namespaceのデフォルトのメモリ要求と制限を設定する

Namespaceのデフォルトのメモリリソース制限を定義して、そのNamespace内のすべての新しいPodにメモリリソース制限が設定されるようにします。

このページでは、Namespaceのデフォルトのメモリ要求と制限を設定する方法を説明します。

KubernetesクラスターはNamespaceに分割することができます。 デフォルトのメモリ制限を持つNamespaceがあり、独自のメモリ制限を指定しないコンテナでPodを作成しようとすると、コントロールプレーンはそのコンテナにデフォルトのメモリ制限を割り当てます。

Kubernetesは特定の条件下でデフォルトのメモリ要求を割り当てます。 その条件については、このトピックの後半で説明します。

始める前に

Kubernetesクラスターが必要、かつそのクラスターと通信するためにkubectlコマンドラインツールが設定されている必要があります。 このチュートリアルは、コントロールプレーンのホストとして動作していない少なくとも2つのノードを持つクラスターで実行することをおすすめします。 まだクラスターがない場合、minikubeを使って作成するか、 以下のいずれかのKubernetesプレイグラウンドも使用できます:

クラスターにNamespaceを作成するには、アクセス権が必要です。

クラスターの各ノードには、最低でも2GiBのメモリが必要です。

Namespaceの作成

この演習で作成したリソースがクラスターの他の部分から分離されるように、Namespaceを作成します。

kubectl create namespace default-mem-example

LimitRangeとPodの作成

以下は、LimitRangeのマニフェストの例です。 このマニフェストでは、デフォルトのメモリ要求とデフォルトのメモリ制限を指定しています。

apiVersion: v1
kind: LimitRange
metadata:
  name: mem-limit-range
spec:
  limits:
  - default:
      memory: 512Mi
    defaultRequest:
      memory: 256Mi
    type: Container

default-mem-example NamespaceにLimitRangeを作成します:

kubectl apply -f https://k8s.io/examples/admin/resource/memory-defaults.yaml --namespace=default-mem-example

default-mem-example NamespaceでPodを作成し、そのPod内のコンテナがメモリ要求とメモリ制限の値を独自に指定しない場合、コントロールプレーンはデフォルト値のメモリ要求256MiBとメモリ制限512MiBを適用します。

以下は、コンテナを1つ持つPodのマニフェストの例です。 コンテナは、メモリ要求とメモリ制限を指定していません。

apiVersion: v1
kind: Pod
metadata:
  name: default-mem-demo
spec:
  containers:
  - name: default-mem-demo-ctr
    image: nginx

Podを作成します:

kubectl apply -f https://k8s.io/examples/admin/resource/memory-defaults-pod.yaml --namespace=default-mem-example

Podの詳細情報を表示します:

kubectl get pod default-mem-demo --output=yaml --namespace=default-mem-example

この出力は、Podのコンテナのメモリ要求が256MiBで、メモリ制限が512MiBであることを示しています。 これらはLimitRangeで指定されたデフォルト値です。

containers:
- image: nginx
  imagePullPolicy: Always
  name: default-mem-demo-ctr
  resources:
    limits:
      memory: 512Mi
    requests:
      memory: 256Mi

Podを削除します:

kubectl delete pod default-mem-demo --namespace=default-mem-example

コンテナの制限を指定し、要求を指定しない場合

以下は1つのコンテナを持つPodのマニフェストです。 コンテナはメモリ制限を指定しますが、メモリ要求は指定しません。

apiVersion: v1
kind: Pod
metadata:
  name: default-mem-demo-2
spec:
  containers:
  - name: default-mem-demo-2-ctr
    image: nginx
    resources:
      limits:
        memory: "1Gi"

Podを作成します:

kubectl apply -f https://k8s.io/examples/admin/resource/memory-defaults-pod-2.yaml --namespace=default-mem-example

Podの詳細情報を表示します:

kubectl get pod default-mem-demo-2 --output=yaml --namespace=default-mem-example

この出力は、コンテナのメモリ要求がそのメモリ制限に一致するように設定されていることを示しています。 コンテナにはデフォルトのメモリ要求値である256Miが割り当てられていないことに注意してください。

resources:
  limits:
    memory: 1Gi
  requests:
    memory: 1Gi

コンテナの要求を指定し、制限を指定しない場合

1つのコンテナを持つPodのマニフェストです。 コンテナはメモリ要求を指定しますが、メモリ制限は指定しません。

apiVersion: v1
kind: Pod
metadata:
  name: default-mem-demo-3
spec:
  containers:
  - name: default-mem-demo-3-ctr
    image: nginx
    resources:
      requests:
        memory: "128Mi"

Podを作成します:

kubectl apply -f https://k8s.io/examples/admin/resource/memory-defaults-pod-3.yaml --namespace=default-mem-example

Podの詳細情報を表示します:

kubectl get pod default-mem-demo-3 --output=yaml --namespace=default-mem-example

この出力は、コンテナのメモリ要求が、コンテナのマニフェストで指定された値に設定されていることを示しています。 コンテナは512MiB以下のメモリを使用するように制限されていて、これはNamespaceのデフォルトのメモリ制限と一致します。

resources:
  limits:
    memory: 512Mi
  requests:
    memory: 128Mi

備考:

LimitRangeは、適用するデフォルト値の一貫性をチェックしません。 これは、LimitRangeによって設定された 制限 のデフォルト値が、クライアントがAPIサーバーに送信するspecでコンテナに指定された 要求 値よりも小さい可能性があることを意味します。 その場合、最終的なPodはスケジュール可能になりません。 詳細については、リソース制限と要求の制約を参照してください。

デフォルトのメモリ制限と要求を設定する動機

Namespaceにメモリリソースクォータが設定されている場合、メモリ制限のデフォルト値を設定しておくと便利です。 以下はリソースクォータがNamespaceに課す制限のうちの3つです。

  • Namespaceで実行されるすべてのPodについて、Podとその各コンテナにメモリ制限を設ける必要があります(Pod内のすべてのコンテナに対してメモリ制限を指定すると、Kubernetesはそのコンテナの制限を合計することでPodレベルのメモリ制限を推測することができます)。
  • メモリ制限は、当該Podがスケジュールされているノードのリソース予約を適用します。 Namespace内のすべてのPodに対して予約されるメモリの総量は、指定された制限を超えてはなりません。
  • また、Namespace内のすべてのPodが実際に使用するメモリの総量も、指定された制限を超えてはなりません。

LimitRangeの追加時:

コンテナを含む、そのNamespace内のいずれかのPodが独自のメモリ制限を指定していない場合、コントロールプレーンはそのコンテナにデフォルトのメモリ制限を適用し、メモリのResourceQuotaによって制限されているNamespace内でPodを実行できるようにします。

クリーンアップ

Namespaceを削除します:

kubectl delete namespace default-mem-example

次の項目

クラスター管理者向け

アプリケーション開発者向け