云原生架构与 GitOps 实战
王炜
前腾讯云 CODING 架构师
6217 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 44 讲
云原生架构与 GitOps 实战
15
15
1.0x
00:00/00:00
登录|注册

11|K8s 极简实战(六):如何保障业务资源需求和自动弹性扩容?

你好,我是王炜。
在上一节课,我们一起学习了如何对外暴露集群内的业务应用,主要包括 NodePort 和 Loadbalancer 两种暴露服务的方式。
当服务暴露在了外网,这意味着我们基本上已经将业务迁移到了 kubernetes 集群中,新的架构也正在接收生产流量了。此时,我们又要面临一些非常棘手的问题。如何保障业务对资源的需求?如何限制某些过于消耗资源的应用?如何弹性扩容?
在解释这些问题之前,我想先请你回顾一下第 3 讲的内容。在第三讲中,为了让你直观地了解 kubernetes 强大的能力,我们为应用配置了资源配额以及自动扩容(HPA),但我并没有对它们进行深入介绍。
这节课中,我将继续以示例应用为例,为你深入介绍 kubernetes 的资源配额管理和弹性扩容。有些 kubernetes 课程会把资源配额管理和弹性扩容看作两个独立部分,分开介绍。但实际上,这两者在真实的业务场景下有非常紧密的联系,我将尝试让你在一节课的时间里去理解它们。
在开始之前,你需要确保已经按照示例应用介绍的引导在本地 Kind 集群部署了示例应用。

kubernetes 的资源配额

在传统微服务应用架构下,业务一般是运行在虚拟机之中的。业务所需的计算资源例如 CPU 和内存由虚拟机直接提供,当业务需要更多的计算资源时,我们可以对虚拟机进行扩容。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文深入介绍了在 Kubernetes 环境下如何有效管理资源,保障业务需求,并实现自动弹性扩容的方法。首先,作者详细讨论了 Kubernetes 的资源配额管理,包括资源请求(Request)和资源限制(Limit)的重要性和实际应用。其次,文章介绍了服务质量(QOS)的概念,以及未配置资源配额、Request 小于 Limit、Request 等于 Limit 三种情况对应的服务质量,为读者提供了实际的配置建议。最后,文章详细介绍了水平扩容(HPA)的原理和配置方法,以及基于 CPU 的扩容策略的实现。通过本文,读者可以快速了解在 Kubernetes 环境下如何保障业务对资源的需求,实现自动弹性扩容,对于在实际生产环境中应用 Kubernetes 的读者具有实际指导意义。文章还提供了基于内存的扩容策略的配置示例,并强调了为业务应用配置水平扩容策略的重要性。同时,通过思考题的设置,鼓励读者进行实验和思考,加深对资源配额和服务质量的理解。整体而言,本文内容丰富,涵盖了 Kubernetes 资源管理的多个方面,对于希望深入了解和应用 Kubernetes 的读者具有实际指导意义。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《云原生架构与 GitOps 实战》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(11)

  • 最新
  • 精选
  • Amosヾ
    老师,我有个疑问:metrics server显示的内存一般是含有cache的,linux内核会定时回收这部分资源,所以HPA更想通过no cache内存或working set内存进行,这里又较好的方案吗?

    作者回复: Metrics 对资源的计算确实有延迟。在生产实践上,你可以借助 KEDA 来实现自己的 HPA 策略,比如从 Prometheus 读取 Metrics 来进行伸缩,或者其他事件来驱动 HPA,这也是一个不错的技术选型。

    2023-01-02归属地:广东
    4
  • PeiHongbing
    问题1: a. Pod的状态为Pending,kubectl describe的Events信息如下: Warning FailedScheduling 30s default-scheduler 0/1 nodes are available: 1 Insufficient cpu, 1 Insufficient memory. preemption: 0/1 nodes are available: 1 No preemption victims found for incoming pod. b. Pod状态为Running,kubectl describe的Events信息如下: Normal Scheduled 51s default-scheduler Successfully assigned test/backend-645d55c844-lfhzl to kind-control-plane Normal Pulling 51s kubelet Pulling image "lyzhang1999/backend:latest" Normal Pulled 49s kubelet Successfully pulled image "lyzhang1999/backend:latest" in 1.875569425s Normal Created 49s kubelet Created container flask-backend Normal Started 49s kubelet Started container flask-backend 问题2:node节点出现故障或者资源少于操作系统(组件)运行所需资源时,Guaranteed 优先级的 Pod 仍然会被驱逐。

    作者回复: 非常正确!

    2023-01-03归属地:广东
    3
  • 大圈
    老师,对HPA这块一直有一个问题挺困惑的,我看网上关于HPA讨论的都是基于原有node节点数量不变然后扩容pod数量的。 基于这种情况,然后我疑惑的是: A. 假如一个节点只运行一个java服务只起1个pod,再将pod的资源配额limit配置为节点CPU、内存的80~90%。 B. 假如一个节点只运行一个java服务只起1个pod,再将pod的资源配额limit配置为节点CPU、内存的40~45%。 那当业务高峰来临时,1、A的pod数量不变,B的pod数量+1,但是处理请求的能力,这两种情况好像并没有什么较大的区别。 问题来了,我理解的是这种所谓的HPA好像并不能解决什么实际问题? 但如果是自动扩缩容node节点的话,在新增的node节点上扩容pod,或高峰过去后再减去之前新增的node节点,这样我认为是有实际意义的。 老师怎么看待或理解HPA这块的实际场景中的功能的呢?

    作者回复: 这个思考很棒。 如果单纯从资源上看,确实AB方案似乎没什么区别。但在实际场景,多实例的稳定性远远比单实例要好。主要两个方面。一是单点故障,二是多实例在高并发场景不容易因为请求堆积导致雪崩。 另外一个方面是 HPA 还可以在流量波谷的时候减小副本数,提高资源利用率。

    2023-03-17归属地:北京
    1
  • zangchao
    老师,想请教下,K8s有什么方法控制I/O这块,目前我们的集群节点Load过高后,会导致整个节点的服务请求503,这方面有推荐的实践方法么?

    作者回复: Load 过高是 CPU 内存吗?还是磁盘 I/O?如果是 CPU 和内存,增加节点就好。如果是 I/O 跟不上,把节点的磁盘换成 SSD 高性能磁盘。

    2023-01-29归属地:天津
    1
  • 李多
    老师好,我有一个问题。K8s默认在Pod运行中不能改变资源配额,而使用VPA触发资源配额修改时,会kill掉Pod然后重启新的Pod。 所以我想请教下您,有没有什么方式能够实现在Pod运行中动态的修改request和limits资源配额,同时又不会导致Pod重建,避免影响业务呢。

    作者回复: 这个增强社区呼声很高,据我所知目前还无法实现,你可以关注这个提案:https://github.com/kubernetes/enhancements/tree/master/keps/sig-node/1287-in-place-update-pod-resources。 好消息是,这个提案目前已经有 PR 了,但还没有被合并:https://github.com/kubernetes/kubernetes/pull/102884,相信不久后会合并并发布。 最后,部分云厂商的托管 K8s 提供原地资源配额修改的能力,比如腾讯云:https://cloud.tencent.com/document/product/457/79697。

    2023-01-08归属地:广东
    2
    1
  • 凡达
    老师,压力减少后,缩容是怎么处理的?

    作者回复: K8s 会自动缩容。

    2023-01-31归属地:北京
  • GAC·DU
    老师,averageUtilization值没算明白,以内存为例,这个平均利用率是通过每个Pod的使用内存除以limit值吗?

    作者回复: Pod 的总平均使用率,也就是所有 Pod 的实际使用量与请求 request 资源比例的平均值。

    2023-01-04归属地:广东
  • êwěn
    或者大家都是Guaranteed ,那就按照优先级驱逐吗?

    作者回复: K8s 在驱逐 Pod 的时候会先给 Pod 排序,不同场景下排序的算法有差异。 比如在节点内存资源不足的场景下,是会参考优先级来驱逐 Pod 的。

    2023-01-02归属地:广东
  • êwěn
    request超过宿主机pod直接pending 起不来了。event可以看到资源不足信息。 node offline ,Guaranteed pod也结束了

    作者回复: 是的,在 Node 节点宕机的情况下,节点所有 Pod 都会被驱逐并在新的节点重建。

    2023-01-02归属地:广东
  • 橙汁
    qos那部分,真是够透彻的 一看就能懂 不需要死记硬背,以前看还想着背下来 啥都没记住,这么一讲直接理解记住。hpa部分两个必要条件metric一般会有,但必须设置资源request还是第一次知道,学到了。关于最后的题目 用阿里云碰到过这种问题 你的资源请求request是不能超过宿主机总共的资源,不知道会不会有这方面的影响,一看32核cpu 64g内存怪吓人的

    作者回复: 哈哈,谢谢,继续加油~

    2023-01-02归属地:广东
收起评论
显示
设置
留言
11
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部