介绍:
默认情况下,K8s集群上的容器对计算资源没有任何限制,可能会导致个别容器资源过大导致影响其他容器正常工作,这时可以使用LimitRange定义容器默认CPU和内存请求值或者最大上限。
LimitRange限制维度:
1.限制容器配置requests.cpu/memory,limits.cpu/memory的最小、最大值
2.限制容器配置requests.cpu/memory,limits.cpu/memory的默认值
3.限制PVC配置requests.storage的最小、最大值
资源限制和请求的约束
管理员在一个命名空间内创建一个 LimitRange 对象。
用户在此命名空间内创建(或尝试创建) Pod 和 PersistentVolumeClaim 等对象。
首先,LimitRanger 准入控制器对所有没有设置计算资源需求的所有 Pod(及其容器)设置默认请求值与限制值。
其次,LimitRange 跟踪其使用量以保证没有超出命名空间中存在的任意 LimitRange 所定义的最小、最大资源使用量以及使用量比值。
若尝试创建或更新的对象(Pod 和 PersistentVolumeClaim)违反了 LimitRange 的约束, 向 API 服务器的请求会失败,并返回 HTTP 状态码 403 Forbidden 以及描述哪一项约束被违反的消息。
若你在命名空间中添加 LimitRange 启用了对 cpu 和 memory 等计算相关资源的限制, 你必须指定这些值的请求使用量与限制使用量。否则,系统将会拒绝创建 Pod。
LimitRange 的验证仅在 Pod 准入阶段进行,不对正在运行的 Pod 进行验证。 如果你添加或修改 LimitRange,命名空间中已存在的 Pod 将继续不变。
如果命名空间中存在两个或更多 LimitRange 对象,应用哪个默认值是不确定的。
剔除策略
当集群资源不足时,K8S会根据Pod标记的QoS类别做剔除决策,腾出空闲资源
第一种标记为保证型,是在内存使用量超限时被kill掉;
第二种标记为突发流量型,当节点资源不足时,这类Pod可能会被kill掉;
第三种标记为最大努力型,只要当节点资源不够调度时,首先就会被kill掉。
应用设置 request 值等于 limit 值,此类 Pod 优先级较高,在节点故障时不易被驱逐导致线上业务受到影响
yaml示例
#计算资源最大、最小值限制
apiVersion: v1
kind: LimitRange
metadata:
name: cpu-memory-min-max
namespace: test
spec:
limits:
- max:#容器能设置limit的最大值
cpu: "800m"
memory: 1Gi
min: #容器能设置request的最小值
cpu: "200m"
memory: 200Mi
type: Container
---
#计算资源默认值限制,K8s默认不限制
apiVersion: v1
kind: LimitRange
metadata:
name: cpu-mem-limit-range
namespace: test
spec:
limits:
- default:
cpu: 500m
memory: 512Mi
defaultRequest:
cpu: 300m
memory: 256Mi
type: Container
---
#存储资源最大、最小限制:
apiVersion: v1
kind: LimitRange
metadata:
name: storagelimits
namespace: test
spec:
limits:
- type: PersistentVolumeClaim
max:
storage: 2Gi
min:
storage: 1Gi
查看
类型 资源 最小 最大 默认请求 默认限制
apiVersion: v1
kind: Pod
metadata:
name: web
spec:
containers:
- name: demo
image: nginx
resources:
requests:
cpu: 700m
memory: 1Gi
limits:
cpu: 700m
memory: 1Gi