Kubernetes通过Requests定义一个容器保留的最小资源,通过Limits定义为一个容器使用的最大资源,这意味着容器的消耗量永远不能超过所显示的内存或CPU。
Limits和Requests
resources:
limits:
memory: 300Mi
cpu: 500m
requests:
memory: 100Mi
cpu: 100m
- requests
当有Pod被调度时,kube-scheduler会检查Kubernetes的请求,以便将其分配给一个特定的节点:该节点至少要满足Pod中所有容器的request数量。如果请求的数量高于可用的资源,那么这个Pod将保持在Pending状态。
- limits
当把Pod分配给一个节点时,如果没有设置requests,默认情况下,Kubernetes将requests=limits。
在运行时,Kubernetes将检查Pod中的容器所消耗的资源量是否高于limits,一般内存达到limits值就会出现OOM。
Namespace ResourceQuata
如果某个命名空间中的特定资源设置了ResourceQuota,那么需要为该命名空间中的每个Pod指定相应的限制或请求。否则,Kubernetes将返回一个 "failed quota"的错误。
apiVersion: v1
kind: ResourceQuota
metadata:
name: mem-cpu-quota
namespace: demo-quota
spec:
hard:
requests.cpu: 2
requests.memory: 4Gi
limits.cpu: 4
limits.memory: 8Gi
- requests.cpu:这个命名空间中所有请求的最大CPU数量。
- requests.memory:这个命名空间中所有请求的最大内存总量。
- limits.cpu:这个命名空间中所有限制的最大CPU数量。
- limits.memory:这个命名空间中所有限制的最大内存总量。
Namespace LimitRange
LimitRanges是一种Kubernetes策略,它限制了命名空间中每个实体的资源设置。
apiVersion: v1
kind: LimitRange
metadata:
name: cpu-resource-limit
namespace: demo-quota
spec:
limits:
- default:
cpu: 500m
defaultRequest:
cpu: 500m
min:
cpu: 100m
max:
cpu: "1"
type: Container
- default: 如果没有指定,创建的容器将有这个值。
- min: 创建的容器不能有比这更小的限制或请求。
- max: 创建的容器不能有大于此值的限制或请求。