资源限制k8s采用limit和request两种
limit资源限额,最多是多少。
request资源需求,满足最基本的才能运行。
内存限制
首先做一个测试,创建一个pod
apiVersion: v1
kind: Pod
metadata:
name: memory-demo
spec:
containers:
- name: memory-demo
image: stress ##专门做压力测试的镜像
args: ##镜像参数
- --vm
- "1"
- --vm-bytes
- 200M ##测试200M内存
resources:
requests:
memory: 50Mi ##最小50
limits:
memory: 100Mi ##不能超过100M
使用文件创建pod
[kubeadm@server1 limit]$ kubectl get pod
NAME READY STATUS RESTARTS AGE
memory-demo 0/1 OOMKilled 2 42s
在这里我们看到这个pod已经OOMKilled,这时因为内存超出了设定的值。
当我们将最后两行,最大值去掉后再运行这个pod,状态就会变成running,就可以使用200M的内存。
cpu限制
apiVersion: v1
kind: Pod
metadata:
name: cpu-demo
spec:
containers:
- name: cpu-demo
image: stress
args:
- -c
- "2"
resources:
requests:
cpu: "5"
limits:
memory: "10"
使用这个文件创建pod,pod也不会运行,因为最少需要5个cpu但是镜像只运行两个,达不到要求,所以状态会变成Pending。
[kubeadm@server1 limit]$ kubectl get pod
NAME READY STATUS RESTARTS AGE
cpu-demo 0/1 Pending 0 3s
为namespace设置资源限制
apiVersion: v1
kind: LimitRange ##资源限制
metadata:
name: limitrange-memory
spec:
limits: ##限制了两种内存和cpu
- max: ##最主要就是设置最小和最大
cpu: 1
memory: 1Gi
min:
cpu: 0.1
memory: 100Mi
default: ##当pod没有定义资源限制时用这个
memory: 512Mi
cpu: 0.5
defaultRequest:
memory: 256Mi
cpu: 0.1
type: Container
[kubeadm@server1 limit]$ kubectl describe limitranges
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 -
这样设置完成后创建一个pod,如果不定以资源限制,则会自动将使用Default中的信息进行限制。
为namespaces设置资源配额
apiVersion: v1
kind: ResourceQuota
metadata:
name: mem-cpu-demo
spec:
hard:
requests.cpu: "1"
requests.memory: 1Gi
limits.cpu: "2"
limits.memory: 2Gi
启用了这个资源配额,每个容器必须设置限额和请求cpu和内存都要设置。如果不设置会报错。
[kubeadm@server1 limit]$ kubectl describe resourcequotas
Name: mem-cpu-demo
Namespace: default
Resource Used Hard
-------- ---- ----
limits.cpu 0 2 ##现在使用是空,没有使用
limits.memory 0 2Gi
requests.cpu 0 1
requests.memory 0 1Gi
现在启动一个不指定cpu和内存的pod,创建以后会提示forbidden。只有设置完成或者提前设置了limitrange后才可以创建。
[kubeadm@server1 limit]$ kubectl describe resourcequotas
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
限制pod的数量
apiVersion: v1
kind: ResourceQuota
metadata:
name: pod-demo
spec:
hard:
pods: "2" ##限制pod数量
[kubeadm@server1 limit]$ kubectl describe resourcequotas
Name: pod-demo
Namespace: default
Resource Used Hard
-------- ---- ----
pods 1 2