最初由Mohamed Ahmed在Medium上发表
Kubernetes的核心是资源管理和编排工具。可以将第1天操作作为重点来探索和体验它的酷特性来部署、监控和控制你的豆荚。但是,你还需要考虑第2天的操作。你需要关注以下问题:
我将如何扩展豆荚(Pod)和应用程序? 如何保持容器处于健康状态并有效地运行? 随着代码和用户工作负载的不断变化,如何才能跟上这些变化? 我在这篇文章中提供了Kubernetes内部不同可伸缩性机制的高级概述,以及满足你需求的最佳方法。记住,要真正掌握Kubernetes,你需要掌握不同的方法来管理集群资源的规模,这是Kubernetes承诺的核心。
配置Kubernetes集群来平衡资源和性能是很有挑战性的,并且需要Kubernetes内部工作的专家知识。仅仅因为你的应用程序或服务的工作负载不是恒定的,它在一天中,如果不是一小时的话,是波动的。把它想象成一个旅程和持续的过程。
Kubernetes自动伸缩构建基块
有效的kubernetes自动伸缩需要两层可扩展性之间的协调:(1)豆荚(Pod)层自动伸缩器,这包括水平豆荚自动伸缩器(Horizontal Pod Autoscaler,HPA)和垂直豆荚自动伸缩器(Vertical Pod Autoscaler,VPA);(2)集群级可伸缩性,由集群自动伸缩器(Cluster Autoscaler,CA)管理;它可以增加或减少集群内的节点数量。
水平豆荚自动伸缩器(HPA)
顾名思义,HPA可以调节豆荚的数量。大多数DevOps使用CPU和内存作为触发器来扩展更多或更少的豆荚副本。但是,你可以将其配置为基于自定义指标、多个指标甚至外部指标来扩展你的豆荚。
高层HPAworkflow
HPA以默认的30秒间隔连续检查设置期间配置的度量值 如果达到了指定的阈值,HPA将尝试增加豆荚的数量 HPA主要更新部署或复制控制器中的副本数量 然后部署/复制控制器将推出任何额外需要的豆荚 在推出HPA时考虑以下几点:
默认的HPA检查间隔是30秒。这可以通过控制器管理器的--horizontal-pod-autoscaler-sync-period标志来配置 默认的HPA相对度量公差是10% HPA在最后一次扩展事件之后等待3分钟,以使指标稳定下来。这也可以通过--horizontal-pod-autoscaler-upscale-delay标志来配置 HPA从最后一个按比例缩小的事件等待5分钟,以避免自动扫描抖动。可通过--horizontal-pod-autoscaler-downscale-delay标志来配置 与复制控制器相比,HPA最适合用于部署对象。无法使用直接操作复制控制器的滚动更新。在进行部署时,管理底层副本集的大小取决于部署对象 垂直豆荚自动伸缩器(VPA)
垂直豆荚自动伸缩器(VPA)将更多(或更少)的cpu或内存分配给现有豆荚。它可以为有状态和无状态的豆荚工作,但是它主要是为有状态的服务构建的。但是,如果希望实现对最初分配给豆荚的资源的自动更正,也可以将其用于无状态的豆荚。VPA还可以响应OOM(内存不足)事件。VPA目前需要重新启动豆荚来更改分配的cpu和内存。当VPA重新启动豆荚时,它尊重豆荚分配预算(pods distribution budget,PDB),以确保豆荚的数量总是最小。你可以设置VPA可以分配给你的任何豆荚的最小和最大资源。例如,你可以将最大内存限制为不超过8gb。当你知道当前节点不能为每个容器分配超过8gb时,这尤其有用。阅读VPA的官方wiki页面了解详细的规范和设计。
https://github.com/kubernetes/community/blob/master/contributors/design-proposals/autoscaling/vertical-pod-autoscaler.md
VPA还有一个有趣的特性叫做VPA推荐器(Recommender)。它监视所有豆荚的历史资源使用情况和OOM事件,以建议“请求”资源规范的新值。推荐器通常使用一些智能算法根据历史指标计算内存和cpu值。它还提供了API,接受豆荚描述符并提供建议的资源请求。
值得一提的是,VPA推荐器并没有设置资源的“限制”。这可能导致豆荚独占节点内的资源。我建议你在命名空间级别设置一个“limit”值,以避免疯狂地消耗内存或CPU。
高层VPAworkflow
VPA以默认的10秒间隔连续检查设置期间配置的度量值 如果达到阈值,VPA将尝试更改分配的内存和/或CPU VPA主要更新部署或复制控制器规范中的资源 当豆荚重新启动时,所有新资源都应用于创建的实例。 推出VPA时需要考虑以下几点:
如果不重新启动豆荚,资源的更改是不可能的。到目前为止的主要理由是,这样的变化可能会导致很多不稳定。因此,考虑重新启动豆荚,并根据新分配的资源对其进行调度。 VPA和HPA还不兼容,不能在同一个豆荚上工作。如果在同一个集群中使用它们,请确保在设置中分离它们的作用域。 VPA仅根据过去和当前观察到的资源使用情况调整容器的资源请求。它不设置资源限制。这对于行为不端的应用程序是有问题的,因为它们开始使用越来越多的资源,导致豆荚被Kubernetes杀死。 VPA还处于早期阶段。它将在接下来的几个月里发展,做好准备:)关于已知限制的细节可以在这里找到,关于未来的工作也可以在这里找到。
https://github.com/kubernetes/autoscaler/tree/master/vertical-pod-autoscaler#known-limitations-of-the-alpha-version
https://github.com/kubernetes/community/blob/master/contributors/design-proposals/autoscaling/vertical-pod-autoscaler.md#future-work 集群自动伸缩器(CA)
集群自动伸缩器(CA)基于待处理的豆荚扩展集群节点。它会定期检查是否有任何待处理的豆荚,如果需要更多的资源,并且扩展的集群仍然在用户提供的约束范围内,则会增加集群的大小。CA与云供应商接口,请求更多节点或释放空闲节点。它与GCP、AWS和Azure兼容。版本1.0(GA)与Kubernetes 1.8一起发布。
高层CAworkflow
CA检查处于待处理状态的豆荚,默认间隔为10秒。 如果集群中有一个或多个豆荚处于待处理状态,因为集群中没有足够的可用资源来分配它们,那么它将尝试提供一个或多个附加节点。 当节点被云供应商授予时,节点就加入到集群中,并准备好提供豆荚。 Kubernetes调度程序将待处理的豆荚分配给新节点。如果某些豆荚仍然处于待处理状态,则重复该过程,并向集群添加更多节点。 在推出CA时考虑这些问题:
集群自动伸缩器确保集群中的所有豆荚都有一个可以运行的地方,不管是否有CPU负载。此外,它还试图确保集群中没有不需要的节点。 CA在大约30秒内实现了可伸缩性需求。 在一个节点变得不需要时,CA默认等待10分钟,然后再将其缩小。 CA有扩展器的概念。扩展器提供不同的策略来选择要向其添加新节点的节点组。 负责地使用“cluster-autoscaler.kubernetes.io/safe-to-evict”: “true”。如果你在所有的节点上都设置了很多的豆荚或者足够多的豆荚,你就会失去很多灵活性去缩小。 使用PodDisruptionBudgets来防止豆荚被删除,并使你的应用程序完全失去功能。 Kubernetes自动伸缩器如何相互作用
如果你想在自动缩放你的Kubernetes集群达到涅槃境界,你将需要豆荚层自动缩放与CA一起使用。它们的工作方式是相对简单的,如下图所示。
HPA或VPA更新豆荚副本或分配给现有豆荚的资源。 如果没有足够的节点来运行豆荚,则会出现可伸缩性事件,CA会发现部分或所有伸缩的豆荚处于待处理状态。 CA分配新节点 豆荚被调度到所提供的节点上。 常见的错误
我在不同的论坛上看到过,例如Kubernetes slack和StackOverflow,这些都是由于许多DevOps在使用自动伸缩器时忽略了一些事实而导致。
HPA和VPA依赖于度量和一些历史数据。如果你没有分配足够的资源,你的豆荚将会被OOM杀死,并且没有机会生成指标。在这种情况下,你的伸缩可能永远不会发生。
按比例放大是一个时间敏感的操作。你希望在用户体验应用程序中的任何中断或崩溃之前,你的豆荚和集群能够快速扩展。你应该考虑你的豆荚和集群可以扩大的平均时间。
最好的情况 - 4分钟
30秒 - 目标度量值更新:30 - 60秒 30秒 - HPA检查度量值:30秒 < 2秒 - 豆荚被创建并进入待处理状态 - 1秒 < 2秒 - CA看到待处理的豆荚并发出对供应节点的调用 - 1秒 3分钟 - 云供应商提供节点,K8s等待节点直到它们准备好:最多10分钟(取决于多个因素) (合理)最坏的情况 - 12分钟
60秒 - 目标度量值更新 30秒 - HPA检查度量值 < 2秒 - 豆荚被创建并进入待处理状态 < 2秒 - CA看到待处理的豆荚并发出对供应节点的调用 10分钟 - 云供应商提供节点,K8s等待节点,直到它们准备好(取决于多个因素,如供应商延迟、OS延迟、引导打包工具等)。 不要将云供应商可伸缩性机制与CA混淆。CA在你的集群中工作,而云供应商的可伸缩性机制(如AWS中的ASG)则基于节点分配工作。它不知道豆荚或应用程序发生了什么。将它们一起使用将使你的集群变得不稳定并且难以预测行为。
总结
Kubernetes是一个资源管理和编制工具。第2天管理你的豆荚和集群资源的操作是你掌握Kubernetes的关键里程碑。 在头脑中有正确的心智模型,关注使用HPA和VPA的豆荚可伸缩性。 如果你对豆荚和容器的需求有很好的了解,那么推荐使用CA。 理解不同的autoscalers如何协同工作将帮助你配置集群。 当它涉及到你的豆荚和集群需要多长时间来扩大或缩小,确保你计划了最坏的情况和最好的情况。