k8sクラスタのcpuやmemoryなどが使われすぎないように、制限を掛ける必要があります。
今回からはリソースの制限方法について、説明していきたいと思います。
リソース制限の概要
k8sでは、制限を掛けられる方法は以下2つです。
- RequestsとLimits
- Containerに対するリソース制限
- リソースのmanifestで定義(spec.containers[].resources)
- LimitRangeで定義(Namespaceごと)
- type: Container
- type: Pod
- type: PresistentVolumeClaim
RequestsとLimits
Containerの設定項目に、リソース制限するための項目として。RequestsとLimitsがあります。
spec.containers[].resources.requests
:使用するリソースの下限を指定する- 省略した場合、Requestの値はLimitの値と同じようになる
spec.containers[].resources.limits
:使用するリソースの上限を指定する
リソース作成する時に、Nodeの残りのリソース量がRequestsより小さい場合、そのNodeには作成されません。
Limitsは違って、リソースが足りなくても、作成されてしまいます。
そのため、RequestsとLimitsの差が大きくなると、Nodeにリソースが足りないのに、Podが作成されてしまい、
結果として、パフォーマンスが悪くなる可能性があります。
k8sでは、RequestsとLimitsの差をできれば小さくするのが推奨しています。
リソースの単位
数値で制限値を定義する場合、制限の単位を知る必要があります。
k8sではmemoryはG(GB)、M(MB)やGi(GiB)、Mi(MiB)など一般的な単位を使っています。
CPUは1vCPUを1/1000にする単位mが用意されています。
リソースの種類 | 単位 |
---|---|
CPU | 1 = 1000m |
Memory | 1G = 1000M |
Memory | 1Gi = 1024Mi |
リソースのmanifestで定義
manifestのコンテナの設定内容の部分で、コンテナそれぞれのリソース制限を掛けることができます。
RequestsとLimitsのmanifest例:
apiVersion: v1
kind: Pod
metadata:
name: frontend
spec:
containers: # コンテナの設定
- name: db # 1個目のコンテナ
image: mysql
env:
- name: MYSQL_ROOT_PASSWORD
value: "password"
resources: # 制限の設定
requests: # 最小リソース
memory: "64Mi" # 注意:設定値は文字列
cpu: "250m"
limits: # 最大リソース
memory: "128Mi"
cpu: "500m"
- name: wp # 2個目のコンテナ
image: wordpress
resources:
requests:
memory: "64Mi"
cpu: "250m"
limits:
memory: "128Mi"
cpu: "500m"
※GCPの場合GPUも指定できます。
コメント