今回は、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について、ご紹介しました。
ここまで読んでいただいて、お疲れ様でした。
コメント