当前版本(1.3)的Kubernetes为在生产环境中平滑运行容器化应用提供了大量开箱即用的特性。不过一些特性依然不够完善,比如Pod水平扩展器( Horizontal pod autoscaler, HPA )。现在你只能根据CPU和内存使用水平进行扩容调度,自定义指标的调度目前仅在 Alpha 版本中支持。
我们其中一个应用是一个Websocket服务器,用来处理来自客户端的长连接。然而性能测试显示我们的应用最大可以承载大约25000个Websocket活跃连接,更多的连接数会导致服务器不稳定甚至崩溃,然而这时通常不会引起CPU负载的升高和内存开销的增长。所以让Kubernetes根据Websocket连接数进行扩展调度的需求应运而生。本文介绍了我们创建自定义水平扩展器(HPA)的一些实践。
Kubernetes原生HPA如何工作
参考Kubernates的源码我们发现,原生扩展器的实现其实非常简单(参见 computeReplicasForCPUUtilization() ):
- 计算所有Pod的CPU使用率;
- 根据
targetUtilization
计算Pod的需求量; - 按照计算出的Pod数量进行扩容。
所以我们打算做一个更强大的扩展器。按照需求,自定义扩展器应当满足下面的目标:
- 当前负载下不崩溃,即使达到了当前负载能力;
- 快速扩容,必要时超限扩容;
- 应当为新扩容的容器实例预留启动时间;
- 逐渐缩容,防止缩容低于系统的承载能力。
确保应用不崩溃
为了防止应用崩溃,我们实现了 ReadinessProbe ,当Pod达到连接数上限时,将其标记为 NotReady
,这样Kubernetes的负载均衡器将不会为其发送新的流量。一旦连接数低于连接数上限时,将其重新标记为 Ready
,Kubernates负载均衡器将继续为其发送流量。这个过程应当和容器扩容一起进行,否则新流量到达负载均衡器时,如果池中Pod不足将导致流量无法正确地被处理。
快速扩容
扩容时我们应当确保扩容容量能够处理新增的连接,因此扩容应当快速进行,必要时应该超限扩容。由于应用需要启动时间,所以我们必须预先判断扩容完成后可以承载的负载量。我们需要获取 websocketConnectionCount
的历史值。
开始我们设计了一个根据最近5个 websocketConnectionCount
值进行线性拟合预判的模型,不过在连接数以指数型增长或减少时这不是最优的。后来我们使用了 regression 库进行 二度多项式回归 来寻找一个反映 connectionCount
变化规律的方程,并找到预判值。
点线是预测负载
逐渐缩容
缩容时我们并不按照预测值,因为预测可能会导致缩减到当前负载下仍需要的Pod。由于断开连接后Websocket会重连,所以对于缩容我们宽松留有余量。我们发现多项式回归预测值比少,因此我们按照 websocketConnectionCount
减少5%的比例作为预测值。这样缩容过程会非常长,以备重连使用。
点线是5%缩减,因为预测值会比当前所需负载低
如果长时间没有连接重连,我们会缓慢缩容。
执行Kuberetes扩容操作
由于我们自定义的HPA运行在同一Kubernetes集群中,所以在Master上可以直接从 /var/run/secrets/kubernetes.io/serviceaccount/token
获取服务Token来访问API。使用这个Token我们可以访问API来改变Pod副本的数量,来实现扩容。
完全迁移到RxJS
我们使用 RxJS 的Stream来实现函数式组件处理事件。这让代码的可读性非常高:
这样我们可以优雅地使用 map() switch() 来持续调节部署、记录错误日志直到成功,或者下一次扩容请求开始。
后记
自定义HPA是一件非常有意思的事情。使用Kubernetes API是一次很棒的经历,也为如何设计API做出了很好的示范。刚开始我以为开发自己的HPA会有很大的工作量,不过最后能把各个部分组织到一起协同工作还是很开心。使用RxJS来定义工作流可以避免在状态管理上踩坑。总的来说,我们的预测扩容管理在生产环境中应用非常成功。
原文链接: Building your own horizontal pod autoscaler for Kubernetes (翻译:刘思贤)
======================
http://lcbk.net/3758.html
https://github.com/kubernetes/kubernetes/blob/release-1.3/docs/proposals/custom-metrics.md
相关推荐
自定义Pod自动缩放器的设计类似于Kubernetes水平Pod自动缩放器。 Custom Pod Autoscaler框架允许更轻松,更快地开发Kubernetes自动缩放器。 通过使用该项目,可以扩展提供的Docker基本映像并插入自己的逻辑,从而...
自定义Pod自动缩放器运算符 这是用于管理(CPA)的操作员。 这允许您将自己的CPA添加到群集中以管理自动扩展部署,这是在添加自己的CPA之前的一项要求。 安装 请参阅以了解更多详细的安装选项,例如特定于名称空间的...
【k8s-prom-hpa:Prometheus自定义指标的Kubernetes水平Pod自动缩放器】 在Kubernetes(k8s)环境中,水平Pod自动缩放器(Horizontal Pod Autoscaler, HPA)是一种强大的功能,它允许系统根据工作负载动态调整Pod的...
总之,Kubekit为Kubernetes开发者提供了一套强大的工具,用于构建和管理自定义资源控制器。通过它,用户可以轻松地扩展Kubernetes的功能,实现更加灵活和个性化的集群管理。无论是新手还是经验丰富的Kubernetes用户...
Project Antrea是一个开源的容器网络插件(CNI),它为Kubernetes中的Pod提供连接性、网络策略实施以及ClusterIP分布式负载均衡。Antrea使用Open vSwitch来实现这些功能,旨在提升性能,增强网络策略能力,并且易于...
穿山甲用于Kubernetes的增强型水平Pod自动缩放器。穿山甲使用多种高度可配置的控制策略,根据Prometheus指标扩展部署。为什么? Kubernetes HPA仅支持不适用于所有用例的单一扩展策略。 Kubernetes HPA具有有限的...
第九章至第十一章涉及Kubernetes的自定义资源和扩展,包括CRDs(Custom Resource Definitions)和Operator模式,它们允许开发者为特定应用定义自己的资源类型和控制器,增强了Kubernetes的灵活性。 最后,本书还会...
- **自动扩展**: 使用自动扩展器(例如 Horizontal Pod Autoscaler)动态调整 Pod 数量。 - **高级网络**: 包括 Ingress 控制器的配置和使用,以实现更复杂的网络策略。 - **状态保存**: 学习如何使用 StatefulSet ...
在本Linux运维-Kubernetes教程中,我们将深入探讨资源控制器这...理解并熟练运用各种资源控制器,对于提升Linux环境下的Kubernetes运维水平至关重要。通过不断学习和实践,我们可以更好地驾驭这个强大的容器编排平台。
本文将深入探讨Kubernetes的几种主要扩展机制,包括API扩展、认证授权、准入控制、Scheduler扩展、网络插件、运行时插件、存储插件、Ingress控制器、云提供者扩展、设备插件等。 1. API扩展: - API聚合:通过API...
这提供了HTTP请求速率统计信息,其格式可以为Horizontal Pod Autoscaler用于扩展部署。 它使用入口控制器提供的Prometheus指标终结点。 即使您没有使用普罗米修斯,也是如此。设定为Prometheus启用自定义VTS...
2. **custom-resources.yaml**: 在Kubernetes中,自定义资源定义(Custom Resources Definition, CRD)允许用户扩展API服务器,创建自己的资源类型。这个文件可能包含了定义Calico网络策略或者其他特定于集群的...
Watermark Pod Autoscaler(WPA)控制器是自定义控制器,用于扩展Horizontal Pod Autoscaler(HPA)。 特点 设置上限和下限以防止发生自动缩放事件。 指定缩放速度。 指定时间窗口以限制放大或缩小事件。 ...
Operator是一种方法,用于扩展Kubernetes的功能,使其能够管理特定类型的应用程序或服务,通过自定义控制器实现更复杂的业务逻辑。 **32. Kubernetes集群如何实现高可用性(HA)?** 通过在不同的机器上运行控制...
Kubernetes是由Google开源的一种容器管理系统,它为应用提供了部署、扩展和管理的平台,使得开发者和运维人员能够更高效地管理微服务架构下的应用。Kubernetes的核心设计理念是将应用程序的运行状态作为中心,通过...
在IT行业中,Kubernetes(简称K8s)已经成为容器编排领域的主流平台,它使得部署、扩展和管理容器化应用程序变得更加高效。而Let's Encrypt是一个免费、自动化且开放的证书颁发机构,它提供了简单的方式来获取和更新...
此外,读者还将接触到Kubernetes的扩展机制,如Custom Resource Definitions(CRDs)和Operator模式,这使得开发人员能够为Kubernetes添加自定义功能,以满足特定的业务需求。 监控和日志也是运维中的重要部分。书...
水平Pod自动缩放(HPA)允许根据Pod的CPU利用率或其他自定义指标动态调整Pod的数量。ReplicationController(RC)和ReplicaSet(RS)负责保持指定数量的Pod副本,而Deployment是更高级的抽象,它可以管理RS并支持...
8. **Kubernetes扩展**:了解Operator模式,它是如何允许开发自定义控制器以管理和操作复杂的应用。 9. **社区生态**:关注Kubernetes生态系统中的其他重要项目,如Istio(服务网格)、Knative(Serverless)等,...
Antrea是一个开源的容器网络插件(CNI),专为Kubernetes集群设计,提供Pod之间的连接性、NetworkPolicy的实施以及ClusterIP的分布式负载均衡。它利用Open vSwitch(OVS)的优势,实现了性能优化、兼容性增强以及...