広告

kubernetes – LimitRange

infrastructure as code

今回は、Namespace範囲でリソースの制限を行うためのリソースLimitRangeについて、ご紹介します。

リソース制限の概要

k8sでは、制限を掛けられる方法は以下2つです。

  • RequestsとLimits
    • Containerに対するリソース制限
    • リソースのmanifestで定義(spec.containers[].resources)
  • LimitRangeで定義(Namespaceごと)
    • type: Container
    • type: Pod
    • type: PresistentVolumeClaim

LimitRangeで定義

manifestのリソース指定:
kind: LimitRange
spec.limits[]

Within a namespace, a Pod or Container can consume as much CPU and memory as defined by the namespace’s resource quota. There is a concern that one Pod or Container could monopolize all available resources. A LimitRange is a policy to constrain resource allocations (to Pods or Containers) in a namespace.

※ResourceQuotaは今度で細かく説明します。

LimitRangeはNamespaceに対して、制限をかけるためのものです。
Namespaceごとに、LimitRangeの設定できます。
k8sでは、NamespaceごとにLimitRangeを設定することで、NodeのリソースがPodやContainerに使われすぎないようにできます。
※GKEでは、CPU 100mのLimitRangeがデフォルトで用意されています。

LimitRangeを設定可能なリソース及び設定可能項目は以下のようになります。
また、一個のLimitRangeに複数のTypeに対して定義できます。

  • type: Container
    • default:Limit値
    • defaultRequest:request値
    • max:この設定値以上の値でリソースを作成すると、エラーになる
    • min:この設定値以下の値でリソースを作成すると、エラーになる
    • maxLimitRequestRatio:limitとrequestの差を制限するための設定。limit/request の割り算の値
  • type: Pod
    • max:Pod内のコンテナの合計の上限値
    • min:Pod内のコンテナの合計の下限値
    • maxLimitRequestRatio:合計の比率
  • type: PresistentVolumeClaim
    • max:作成するストレージ容量の上限
    • min:作成するストレージ容量の下限

LimitRange 例

GKEのデフォルトLimitRange

apiVersion: v1
kind: LimitRange
metadata:
  name: limits  # LimitRange名
  namespace: default  # Namespace指定
spec:
  limits:
  - defaultRequest:  # request値
      cpu: 100m
    type: Container  # コンテナtype

3type含む例:

apiVersion: v1
kind: LimitRange
metadata:
  name: my-limits  # LimitRange名
  namespace: default  # Namespace指定
spec:
  limits:
  - type: Container  # コンテナの制限
    default:  # Limit
      memory: 512Mi
      cpu: 500m
    defaultRequest:  # Request
      memory: 256Mi
      cpu: 250m
    max:  # この設定値以上の場合、エラーが発生
      memory: 1024Mi
      cpu: 1000m
    min:  # この設定値以下の場合、エラーが発生
      memeory: 128Mi
      cpu: 125m
    maxLimitRequestRatio:  # Limit/Requestの最大値制限
      memory: 2
      cpu: 2
  - type: Pod  # Podの制限
    max:
      memory: 2048Mi
      cpu: 2000m
    min:
      memory: 128Mi
      cpu: 125m
    maxLimitRequestRatio:  # Limit/Requestの最大値制限
      memory: 1.5
      cpu: 1.5
  - type: PresistentVolumeClaim  # PresistentVolumeClaimの制限
    max:
      storage: 10Gi
    min:
      storage: 3Gi

QoS Class

Podでは、RequestsとLimits値の設定によって、Qos Classに自動で分類されます。

Qos Class

  • BestEffort(力を尽くす):requestとLimitどちらも未設定の場合
  • Guaranteed(保証される):request = limit の場合
    • メリット:周辺Podへの影響が少ない
    • デメリット:集約率が低くなる可能性がある(リソースを最大限に生かす)
  • Burstable(限界に超える):requestとlimitが違う場合。※一番よくつかわれる

最後に

今回はLimitRangeについて、ご紹介しました。

ここまで読んでいただいて、お疲れ様でした。

コメント

タイトルとURLをコピーしました