LoginSignup
2
4

More than 3 years have passed since last update.

Kubernetes基礎(8):Namespace, ResourceQuota, LimitRange

Last updated at Posted at 2020-07-03

スクリーンショット 2020-07-03 10.20.01.png
[Cluster構成]
上の図のようにClusterの中には一般的なメモリやCPUなどのリソースがある。
Clusterの中にはNamespace及びNamespaceの中に複数のPodを作ることもできる。
各Podは必要なリソースをクラスタのリソースを共有して使う。

[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

How to use Namespace for Kubernetes.jpg
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の中だけで使えるが、PersistentVolumeNodeは、すべてのNamespaceで供用で使えるObjectである。
Namespaceを削除すると、その中のすべてのリソースも削除されるので気をつかないといけない。

2. ResourceQuota

How to use ResourceQuota for Kubernetes.jpg
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

How to use LimitRange1 for Kubernetes.jpg
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/

2
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
4