共计 1105 个字符,预计需要花费 3 分钟才能阅读完成。
requests 和 limits
pod 能够配置每个 container 的 requests 以 标识资源申请额 ,配置 limits 以 限度资源应用下限。
kubernetes 依据 requests,调度 pod 运行在哪个节点上。
kubernetes 依据 limits,限度 pod 能够应用 cpu/memory 资源:
- 当容器应用的 cpu 达到 limits 时,过程不会调配到更多的 cpu;
- 当容器应用的 memory 达到 limits 时,容器会被 OOMKilled,尝试重启;
apiVersion: v1
Kind: Pod
metadata:
name: pod1
spec:
containers:
- image: nginx
name: main
resources:
requests:
cpu: 200m
memory: 10Mi
limits:
cpu: 500m
memory: 100Mi
为什么须要 pod Qos?
requests 与 limits 不同,单个节点上,所有 limits 的总和运行超过节点资源总量的 100%,也就是说,limits 能够超卖:
如果节点资源使用量超过 100%,一些容器会被杀掉,比方 podA 应用了节点内存的 90%,podB 忽然须要节点 20% 的内存,导致节点无奈提供更多的内存,此时该杀掉哪个 pod 以满足 podB 的内存申请?
kubernetes 通过 pod 的 Qos 级别,决定当资源有余时,优先杀掉哪些容器:
- BestEffort: 优先级最低(最先被 Kill)
- Burstable:
- Guaranteed: 优先级最高(最初被 Kill)
当遇到内存不足,BestEffort 的 Pod 有多个,如何确定该 kill 哪个:
- 依据过程的 OOM 分数来抉择,分数越高,优先被杀掉;
- OOM 分数:(理论内存使用量 / request.memory)的值越大,OOM 分数越高;
如何确定 pod Qos?
办法一:kubectl describe pod 查问
# kubectl describe pod -n monitoring prometheus-k8s-0
Name: prometheus-k8s-0
Namespace: monitoring
......
QoS Class: Burstable
......
办法二:按上面的规定(举荐)
BestEffort:
- 所有的容器都 没有调配 requests 和 limits;
Guaranteed:
- 所有的容器都 调配了 requests 和 limits;
Burstable:
- 其它不属于 BestEffort 和 Guaranteed 的 pod;
办法三:先判断 container 的 Qos,再判断 pod 的 qos
container 的 Qos 判断办法:
pod 的 Qos 判断办法:
参考:
- kubernetes in action
正文完
发表至: kubernetes
2021-10-11