kubernetesのステップアップ--リソースの制限
k 8 s容器資源制限 Kubernetesはrequestとlimitの2つの制限タイプを使用してリソースを割り当てます. request(リソース要件):リソースの下限.すなわち、Podを実行するノードは、Podを実行するための最も基本的な要件を満たさなければならない. limit(リソース限度):つまり、Podを実行している間にメモリの使用量が増加する可能性があります.それは、最大どれだけのメモリが使用できるか、これがリソース限度です.
リソースタイプ: CPUの単位はコア数、メモリの単位はバイトです. コンテナで0.5個のCPUを申請すると、1個のCPUを申請する半分に相当し、接尾辞mを付けて千分の1の概念を表すこともできます.例えば100 mのCPU、100ミリのCPU、0.1個のCPUは同じです. メモリ単位: K、M、G、T、P、E#は通常1000を換算基準とする. Ki,Mi,Gi,Ti,Pi,Ei#は通常1024を換算基準とする.
このpodは明らかに起きられない.200 Mのメモリを消費するため、最大値は100 Mに設定されている.
起動に失敗しました.
スケジューリングに失敗するのは、申請するCPUリソースがクラスタノードが提供できるリソースを超えているためであるが、CPUの使用率が高すぎて殺すことはない.
該当するサイズを設定すれば実行できる.
定義しない場合は、ネーミングスペースのデフォルトの制限が使用されます.
LimitRangeが
リソース割当はcpuやmemのみでなくpod,secret,rs,pvc,cmなどを制限することもできる.
割当の役割:で作成されたResourceQuotaオブジェクトには、defaultネームスペースに次の制限が追加されます. 各コンテナは、メモリ要求(memory request)、メモリ限度額(memorylimit)、cpu要求(cpu request)、およびcpu限度額(cpu limit)を設定する必要があります. 全ての容器のメモリ要求総額は1 GiBを超えてはならない. 全ての容器のメモリ限度額総額は2 GiBを超えてはならない. 全ての容器のCPU要求総額は1 CPUを超えてはならない. 全ての容器のCPU限度額総額は2 CPUを超えてはならない.
起きられません.割当額は要求と制限を設定しなければならないので、私のリソースリストに制限がなく、デフォルトのネーミングスペースにデフォルトの制限がないと、実行できません.
podの数を制限するため、3番目のpodを実行する際に失敗し、拒否されました.
例:[root@server2 ~]# vim demo.yml
apiVersion: v1
kind: Pod
metadata:
name: memory-demo
spec:
containers:
- name: memory-demo
image: stress
args:
- --vm
- "1" / worker
- --vm-bytes
- 200M / 3200M
resources:
requests:
memory: 50Mi / 50Mi
limits:
memory: 100Mi / 100Mi
このpodは明らかに起きられない.200 Mのメモリを消費するため、最大値は100 Mに設定されている.
[root@server2 ~]# kubectl apply -f demo.yml
kubec getpod/memory-demo created
[root@server2 ~]# kubectl get pod -w
NAME READY STATUS RESTARTS AGE
memory-demo 0/1 OOMKilled 1 5s
memory-demo 0/1 CrashLoopBackOff 1 5s
memory-demo 0/1 OOMKilled 2 19s
memory-demo 0/1 CrashLoopBackOff 2 20s
起動に失敗しました.
[root@server2 ~]# kubectl delete pod memory-demo
pod "memory-demo" deleted
[root@server2 ~]# vim demo.yml
resources:
requests:
memory: 50Mi / 50Mi
limits:
memory: 300Mi / 300Mi
[root@server2 ~]# kubectl apply -f demo.yml
pod/memory-demo created
[root@server2 ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
memory-demo 1/1 Running 0 6s
cpu
[root@server2 ~]# vim demo.yml
apiVersion: v1
kind: Pod
metadata:
name: memory-demo
spec:
containers:
- name: memory-demo
image: stress
args:
- -c
- "2"
resources:
requests:
memory: 50Mi
cpu: 5
limits:
memory: 100Mi
cpu: 10
[root@server2 ~]# kubectl apply -f demo.yml
kpod/memory-demo created
[root@server2 ~]# kubectl get pod -w
NAME READY STATUS RESTARTS AGE
memory-demo 0/1 Pending 0 3s
[root@server2 ~]# kubectl describe pod memory-demo
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Warning FailedScheduling default-scheduler 0/3 nodes are available: 3 Insufficient cpu.
スケジューリングに失敗するのは、申請するCPUリソースがクラスタノードが提供できるリソースを超えているためであるが、CPUの使用率が高すぎて殺すことはない.
namespace :
もし私たちがリストを書くたびに制限をしなければならないならば、面倒で、私たちはネーミングスペースで制限をして、私たちの使用を便利にすることができます.[root@server2 ~]# vim limit.yml
apiVersion: v1
kind: LimitRange
metadata:
name: limitrange-memory
spec:
limits:
- default: /
cpu: 0.5
memory: 512Mi
defaultRequest: /
cpu: 0.1
memory: 256Mi
max: /
cpu: 1
memory: 1Gi
min: /
cpu: 0.1
memory: 100Mi
type: Container
[root@server2 ~]# kubectl apply -f limit.yml
limitrange/limitrange-memory created
[root@server2 ~]# kubectl describe limitranges limitrange-memory
Name: limitrange-memory
Namespace: default
Type Resource Min Max Default Request Default Limit Max Limit/Request Ratio
---- -------- --- --- --------------- ------------- -----------------------
Container cpu 100m 1 100m 500m -
Container memory 100Mi 1Gi 256Mi 512Mi -
[root@server2 ~]# vim demo.yml
apiVersion: v1
kind: Pod
metadata:
name: memory-demo
spec:
containers:
- name: memory-demo
image: myapp:v1
resources:
requests:
memory: 50Mi / min
cpu: 1
limits:
memory: 300Mi
cpu: 10 / max
[root@server2 ~]# kubectl apply -f demo.yml
Error from server (Forbidden): error when creating "demo.yml": pods "memory-demo" is forbidden: [minimum memory usage per Container is 100Mi, but request is 50Mi, maximum cpu usage per Container is 1, but limit is 10]
.
[root@server2 ~]# vim demo.yml
apiVersion: v1
kind: Pod
metadata:
name: memory-demo
spec:
containers:
- name: memory-demo
image: myapp:v1
resources:
requests:
memory: 100Mi
cpu: 0.1
limits:
memory: 300Mi
cpu: 1
[root@server2 ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
memory-demo 1/1 Running 0 14s
該当するサイズを設定すれば実行できる.
定義しない場合は、ネーミングスペースのデフォルトの制限が使用されます.
[root@server2 ~]# cat demo.yml
apiVersion: v1
kind: Pod
metadata:
name: memory-demo
spec:
containers:
- name: memory-demo
image: myapp:v1
# resources:
# requests:
# memory: 100Mi
# cpu: 0.1
# limits:
# memory: 300Mi
# cpu: 1
[root@server2 ~]# kubectl apply -f demo.yml
pod/memory-demo created
[root@server2 ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
memory-demo 1/1 Running 0 20s
[root@server2 ~]# kubectl describe pod memory-demo
Limits:
cpu: 500m
memory: 512Mi
Requests:
cpu: 100m
memory: 256Mi
.
LimitRangeが
namespace
に適用する最小および最大メモリ制限は、Podの作成および更新時にのみ適用されます.LimitRangeの変更は、以前に作成したPodには影響しません. namespace
リソース割当はcpuやmemのみでなくpod,secret,rs,pvc,cmなどを制限することもできる.
[root@server2 ~]# cat quota.yml
apiVersion: v1
kind: ResourceQuota
metadata:
name: mem-cpu-demo
spec:
hard:
requests.cpu: "1"
requests.memory: 1Gi
limits.cpu: "2"
limits.memory: 2Gi
[root@server2 ~]# kubectl apply -f quota.yml
resourcequota/mem-cpu-demo created
[root@server2 ~]# kubectl get resourcequotas
NAME AGE REQUEST LIMIT
mem-cpu-demo 7s requests.cpu: 100m/1, requests.memory: 256Mi/1Gi limits.cpu: 500m/2, limits.memory: 512Mi/2Gi
[root@server2 ~]# kubectl describe resourcequotas mem-cpu-demo
Name: mem-cpu-demo
Namespace: default
Resource Used Hard
-------- ---- ----
limits.cpu 500m 2
limits.memory 512Mi 2Gi
requests.cpu 100m 1
requests.memory 256Mi 1Gi
割当の役割:
kubec [root@server2 ~]# kubectl delete limitranges limitrange-memory /
limitrange "limitrange-memory" deleted
[root@server2 ~]# kubectl apply -f demo.yml
Error from server (Forbidden): error when creating "demo.yml": pods "memory-demo" is forbidden: failed quota: mem-cpu-demo: must specify limits.cpu,limits.memory,requests.cpu,requests.memory
起きられません.割当額は要求と制限を設定しなければならないので、私のリソースリストに制限がなく、デフォルトのネーミングスペースにデフォルトの制限がないと、実行できません.
root@server2 ~]# vim demo.yml
[root@server2 ~]# cat demo.yml
apiVersion: v1
kind: Pod
metadata:
name: memory-demo
spec:
containers:
- name: memory-demo
image: myapp:v1
resources:
requests:
memory: 100Mi
cpu: 0.1
limits:
memory: 300Mi
cpu: 1
[root@server2 ~]# kubectl apply -f demo.yml
pod/memory-demo created
[root@server2 ~]# kubectl describe resourcequotas
Name: mem-cpu-demo
Namespace: default
Resource Used Hard
-------- ---- ----
limits.cpu 1 2
limits.memory 300Mi 2Gi
requests.cpu 100m 1
requests.memory 100Mi 1Gi
Namespace Pod :
[root@server2 ~]# vim quota.yml
[root@server2 ~]# cat quota.yml
apiVersion: v1
kind: ResourceQuota
metadata:
name: mem-cpu-demo
spec:
hard:
requests.cpu: "1"
requests.memory: 1Gi
limits.cpu: "2"
limits.memory: 2Gi
pods: "2" / pod
[root@server2 ~]# kubectl apply -f quota.yml
resourcequota/mem-cpu-demo configured
[root@server2 ~]# kubectl describe resourcequotas
Name: mem-cpu-demo
Namespace: default
Resource Used Hard
-------- ---- ----
limits.cpu 1 2
limits.memory 300Mi 2Gi
pods 1 2
requests.cpu 100m 1
requests.memory 100Mi 1Gi
[root@server2 ~]# kubectl apply -f limit.yml
limitrange/limitrange-memory created
[root@server2 ~]# kubectl run demo --image=myapop:v1
pod/demo created
[root@server2 ~]# kubectl run demo-2 --image=myapop:v1
Error from server (Forbidden): pods "demo-2" is forbidden: exceeded quota: mem-cpu-demo, requested: pods=1, used: pods=2, limited: pods=2
podの数を制限するため、3番目のpodを実行する際に失敗し、拒否されました.