[ResourceQuotaを使う理由]
ResourceQuotaを設定してない状況で上の図の右側のPodのように1つのNamespace中のPodがCluster内の残りの全てのリソースを使ってしまうと、他のPodは使えるリソースがなくなってリソースが必要なときに問題が発生する。
このような問題を解決するのがResourceQuotaです。
ResourceQuotaを設定するとNamespaceが使える最大のリソース制限を設定することができる。
1つのPodでリソースが不足して問題になっても他のPodには影響を及ぼさない。
[LimitRangeを使う理由]
1つのPodがNamespaceで使える最大のリソースを使っている場合、他のPodをそのNamespace中に設定することができなくなる。このような問題を管理するためにLimitRangeを使えばNamespaceに入ってくるPodのサイズを制限することができる。
簡単に予約すると
ResourceQuotaはNamespaceに対してリソース制限をかける。
LimitRangeはPodに対してリソース制限をかける。
※ResourceQuota、LimitRangeはClusterにも設定ができ、全体のリソースの制限をかけることもできる。
###1. Namespace
1-1) Namespace
Namespaceを作成するときは名前以外に特に指定する項目はない
apiVersion: v1
kind: Namespace
metadata:
name: nm-1
1-2) Pod
apiVersion: v1
kind: Pod
metadata:
name: pod-1
namespace: nm-1
labels:
app: pod
spec:
containers:
- name: container
image: <image file name>
ports:
- containerPort: 8080
1-3) Service
apiVersion: v1
kind: Service
metadata:
name: svc-1
namespace: nm-1
spec:
selector:
app: pod
ports:
- port: 9000
targetPort: 8080
PodやServiceを作成するときにnamespaceキーに指定することで簡単に設定ができる
上記の図の×の1-2PodのようにNamespace中には同じタイプのオブジェクトは作成できない。
(例:Podの名前が同じPodは作れない)
ObjectごとにUUIDが存在するがNamespaceの中では同じタイプのオブジェクトであれば名前もUUIDのようにキーになる。
Namespaceの特徴はNamespaceのリソースは他のNamespaceのリソースとは完全に分離して管理されていることだ。
上記の図のようにNamespace1のServiceでselectorにNamespace2のPod1のlabelを設定してもNamespaceが違うので繋げることができない。
殆どのリソースは、Namespaceの中だけで使えるが、PersistentVolumeとNodeは、すべてのNamespaceで供用で使えるObjectである。
Namespaceを削除すると、その中のすべてのリソースも削除されるので気をつかないといけない。
###2. ResourceQuota
2-1) Namespace
apiVersion: v1
kind: Namespace
metadata:
name: nm-3
2-2) ResourceQuota
apiVersion: v1
kind: ResourceQuota
metadata:
name: rq-1
namespace: nm-3
spec:
hard:
requests.memory: 1Gi
limits.memory: 1Gi
nm-3名前のNamespaceのResourceQuota詳細照会
ResourceQuota Check Command:kubectl describe resourcequotas --namespace=nm-3
2-3) Pod
apiVersion: v1
kind: Pod
metadata:
name: pod-2
spec:
containers:
- name: container
image: <image file name>
2-4) Pod
apiVersion: v1
kind: Pod
metadata:
name: pod-3
spec:
containers:
- name: container
image: <image file name>
resources:
requests:
memory: 0.5Gi
limits:
memory: 0.5Gi
Namespaceのリソース制限を設定するObjectである。
上の図の2-2はNamespaceに設定するPodの全requestのメモリを最大1Gに設定してlimitは1Gに設定している。
ResourceQuotaが設定されているNamespaceでPodを作成する場合はSpec(requests、limits)を指定しなければならない。(図2-3)
Specがない場合はNamespaceが作れない。
例えばrequestのメモリリソースを3Gに設定した場合は1つのPodがメモリリソースを2G使っていて、他のPodが同じく2Gを設定することはできない。(図 2-4, 2-4')
メモリだけでなく、cpu、storageも制限することができる。
Objectの数も制限できますが、すべてのオブジェクトを制限できるということではない。
###3. LimitRange
3-1) Namespace
apiVersion: v1
kind: Namespace
metadata:
name: nm-5
3-2) LimitRange
apiVersion: v1
kind: LimitRange
metadata:
name: lr-1
spec:
limits:
- type: Container
min:
memory: 0.1Gi
max:
memory: 0.4Gi
maxLimitRequestRatio:
memory: 3
defaultRequest:
memory: 0.1Gi
default:
memory: 0.2Gi
nm-5名前のNamespaceのLimitRange詳細照会
LimitRange Check Command:kubectl describe limitranges --namespace=nm-5
3-3) Pod
apiVersion: v1
kind: Pod
metadata:
name: pod-1
spec:
containers:
- name: container
image: <image file name>
resources:
requests:
memory: 0.1Gi
limits:
memory: 0.5Gi
PodをNamespaceに設定できるかリソースのチェックを行う。
図3-2のチェック項目を説明すると
・min:memory: 0.1Gi(Podに設定するメモリのlimit値が0.1Gが以上)
・max:memory: 0.4Gi(0.4G以下)
・maxLimitRequestRatio:memory: 3(requestsとlimitsの値の比率が最大3倍以下)
※defaultRequestはrequestの値でdefaultは、limitの値に設定されている
3-3の場合は、requestとlimitの割合が3倍を超えているのでNamespaceに設定できない。
3-2のようにdefaultRequestとdefaultが設定されていれば3-3'のPodのように何も設定しなくてもNamespaceに設定ができる。
#Referenece
Share a Cluster with Namespaces : https://kubernetes.io/docs/tasks/administer-cluster/namespaces/
Resource Quotas : https://kubernetes.io/docs/concepts/policy/resource-quotas/
Limit Ranges : https://kubernetes.io/docs/concepts/policy/limit-range/