你敢相信,部署的两个服务在做压力测试的时候,把k8s集群给‘打’挂掉了u1F602.pngu1F602.pngu1F602.png    

    在制作这两个pod的时候,是没有做任何资源限制的,也就是服务需要多少个cpu,需要多少内存,直接向宿主机申请,没有任何限制,直至将宿主机的资源全部耗尽。。。

    配置容器资源限制

对于一个pod来说,资源最基础的2个的指标就是:CPU和内存。

  • 当pod 内存超过limit时,会被oom。

  • 当cpu超过limit时,不会被kill,但是会限制不超过limit值。

    例如:

# cpu可不做限制	
# 内存最大限制2G, 最小1G	
# 对于一些java项目, 必须设置java虚拟机的参数, 而且这个参数不能大于容器设置的限定值, 否则容器会因为内存过大不停的重启	
resources:	
          limits:	
            memory: "2048Mi"	
          requests:	
            memory: "1024Mi"	

    requestslimits

    容器服务质量(QoS-Quality of Service

    Kubernetes 提供服务质量管理,根据容器的资源配置,将pod 分为Guaranteed, Burstable, BestEffort 3个级别。当资源紧张时根据分级决定调度和驱逐策略,这三个分级分别代表:

  • Guaranteed:pod中所有容器都设置了limit和request, 并且相等(设置limit后假如没有设置request会自动设置为limit值)

  • Burstable:pod中有容器未设置limit, 或者limit和request不相等。这种类型的pod在调度节点时, 可能出现节点超频的情况。

  • BestEffort:pod中没有任何容器设置request和limit。

    QoS使用建议

        如果资源充足,可将 QoS pods 类型均设置为Guaranteed。用计算资源换业务性能和稳定性,减少排查问题时间和成本。如果想更好的提高资源利用率,业务服务可以设置为Guaranteed,而其他服务根据重要程度可分别设置为Burstable或Best-Effort。

    pod 驱逐:

    当节点的内存和cpu资源不足,开始驱逐节点上的pod时。QoS同样会影响驱逐的优先级。顺序如下:

  1. kubelet 优先驱逐 BestEffort的pod 和 实际占用资源大于requests的Burstable pod。

  • 接下来驱逐实际占用资源小于request的Burstable pod。

  • QoS为Guaranteed的pod最后驱逐, kubelet 会保证Guaranteed的pod 不会因为其他pod的资源消耗而被驱逐。

  • 当QoS相同时,kubelet 根据 Priority 计算驱逐的优先级

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐