このページでは、Namespaceのデフォルトのメモリ要求と制限を設定する方法を説明します。
KubernetesクラスターはNamespaceに分割することができます。 デフォルトのメモリ制限を持つNamespaceがあり、独自のメモリ制限を指定しないコンテナでPodを作成しようとすると、コントロールプレーンはそのコンテナにデフォルトのメモリ制限を割り当てます。
Kubernetesは特定の条件下でデフォルトのメモリ要求を割り当てます。 その条件については、このトピックの後半で説明します。
Kubernetesクラスターが必要、かつそのクラスターと通信するためにkubectlコマンドラインツールが設定されている必要があります。 このチュートリアルは、コントロールプレーンのホストとして動作していない少なくとも2つのノードを持つクラスターで実行することをおすすめします。 まだクラスターがない場合、minikubeを使って作成するか、 以下のいずれかのKubernetesプレイグラウンドも使用できます:
クラスターにNamespaceを作成するには、アクセス権が必要です。
クラスターの各ノードには、最低でも2GiBのメモリが必要です。
この演習で作成したリソースがクラスターの他の部分から分離されるように、Namespaceを作成します。
kubectl create namespace default-mem-example
以下は、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つです。
LimitRangeの追加時:
コンテナを含む、そのNamespace内のいずれかのPodが独自のメモリ制限を指定していない場合、コントロールプレーンはそのコンテナにデフォルトのメモリ制限を適用し、メモリのResourceQuotaによって制限されているNamespace内でPodを実行できるようにします。
Namespaceを削除します:
kubectl delete namespace default-mem-example