加入收藏 | 设为首页 | 会员中心 | 我要投稿 PHP编程网 - 黄冈站长网 (http://www.0713zz.com/)- 数据应用、建站、人体识别、智能机器人、语音技术!
当前位置: 首页 > 云计算 > 正文

一篇带给你K8s集群稳定性晋升手段

发布时间:2022-04-15 15:22:56 所属栏目:云计算 来源:互联网
导读:提升资源利用率 一、 资源浪费场景 1、资源预留普遍存在 50% 以上的浪费 Kubernetes 中的 Request(请求) 字段用于管理容器对 CPU 和内存资源预留的机制,保证容器至少可以达到的资源量,该部分资源不能被其他容器抢占,具体可查看(https://kubernetes.io/doc
  提升资源利用率
  一、 资源浪费场景
 
     1、资源预留普遍存在 50% 以上的浪费
  Kubernetes 中的 Request(请求) 字段用于管理容器对 CPU 和内存资源预留的机制,保证容器至少可以达到的资源量,该部分资源不能被其他容器抢占,具体可查看(https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/)。当 Request 设置过小,无法保证业务的资源量,当业务的负载变高时无力承载,因此用户通常习惯将 Request 设置得很高,以保证服务的可靠性。
 
  但实际上,业务在大多数时段时负载不会很高。以 CPU 为例,下图是某个实际业务场景下容器的资源预留(Request)和实际使用量(CPU_Usage)关系图:资源预留远大于实际使用量,两者之间差值所对应的资源不能被其他负载使用,因此 Request 设置过大势必会造成较大的资源浪费。
 
  如何解决这样的问题?现阶段需要用户自己根据实际的负载情况设置更合理的 Request、以及限制业务对资源的无限请求,防止资源被某些业务过度占用。这里可以参考后文中的 Request Quota 和 Limit Ranges 的设置。
 
  2、不同类型的业务,导致资源利用率有较大差异
  在线业务通常白天负载较高,对时延要求较高,必须优先调度和运行;而离线的计算型业务通常对运行时段和时延要求相对较低,理论上可以在在线业务波谷时运行。此外,有些业务属于计算密集型,对 CPU 资源消耗较多,而有些业务属于内存密集型,对内存消耗较多。
 
       通过在离线混部可以动态调度离线业务和在线业务,让不同类型业务在不同的时间段运行以提升资源利用率。对于计算密集型业务和内存密集型业务,可以使用亲和性调度,为业务分配更合适的节点,以及通过taints/tolerations 策略隔离某些node给特定的业务场景使用,有效提升资源利用率。
        
  二、 提升资源利用率的方法
  主要从两方面着手:一是利用原生的 Kubernetes 能力手动进行资源的划分和限制;二是结合业务特性的自动化方案。这里暂时介绍利用k8s原生能力进行资源的划分和限制。
 
  1、 如何资源划分和限制
  设想,你是个集群管理员,现在有4个业务部门使用同一个集群,你的责任是保证业务稳定性的前提下,让业务真正做到资源的按需使用。为了有效提升集群整体的资源利用率,这时就需要限制各业务使用资源的上限,以及通过一些默认值防止业务过量使用。
 
  理想情况下,业务应该根据实际情况,设置合理的 Request 和 Limit。(Request 用于对资源的占位,表示容器至少可以获得的资源;Limit 用于对资源的限制,表示容器至多可以获得的资源。)这样更利于容器的健康运行、资源的充分使用。但实际上用户经常忘记设置容器对资源的 Request 和 Limit。此外,对于共享使用一个集群的团队/项目来说,他们通常都将自己容器的 Request 和 Limit 设置得很高以保证自己服务的稳定性。
 
  为了更细粒度的划分和管理资源,可以设置命名空间级别的 Resource Quota 以及 Limit Ranges。
 
  2、 使用 Resource Quota 划分资源
  如果你管理的某个集群有4个业务,为了实现业务间的隔离和资源的限制,你可以使用命名空间和 Resource Quota。
 
  Resource Quota 用于设置命名空间资源的使用配额,命名空间是 Kubernetes 集群里面的一个隔离分区,一个集群里面通常包含多个命名空间,例如 Kubernetes 用户通常会将不同的业务放在不同的命名空间里,你可以为不同的命名空间设置不同的 Resource Quota,以限制一个命名空间对集群整体资源的使用量,达到预分配和限制的效果。Resource Quota 主要作用于如下方面,具体可查看(https://kubernetes.io/docs/concepts/policy/resource-quotas/)。
 
  计算资源:所有容器对 CPU 和 内存的 Request 以及 Limit 的总和。
  存储资源:所有 PVC 的存储资源请求总和。
  对象数量:PVC/Service/Configmap/Deployment等资源对象数量的总和。
  Resource Quota 使用场景
  给不同的项目/团队/业务分配不同的命名空间,通过设置每个命名空间资源的 Resource Quota 以达到资源分配的目的。
  设置一个命名空间的资源使用数量的上限以提高集群的稳定性,防止一个命名空间对资源的过度侵占和消耗。
  这里提供一个脚本,来为集群各命名空间设置初始的Resource Quota。
 
  「说明」:该脚本借助kubectl-view-allocations 插件获取集群各个命名空间当前所有pod所设置的request和limit总和,然后在此基础之上上浮30%用于设置命名空间的request和limit Resource Quota。

(编辑:PHP编程网 - 黄冈站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读