要完全掌握Kubernetes,您需要了解扩展集群资源的各种方法:根据
系统开发人员的说法,这是Kubernetes的主要任务之一。 我们已经对水平和垂直自动缩放和群集大小调整的机制进行了高级审查,并提供了有关如何有效使用它们的建议。
Kubernetes Autoscaling 101撰写的文章
:集群自动缩放器,水平自动 缩放器 和垂直Pod自动 缩放器由一个团队翻译,该团队在
Mail.ru中的
Kubernetes aaS中实现了
自动缩放 。
为什么考虑扩展很重要
Kubernetes是一种资源管理和编排工具。 当然,很高兴修改凉爽的部署,监视和Pod管理功能(pod模块是响应请求而启动的一组容器)。
但是,您应该考虑以下问题:
- 如何扩展模块和应用程序?
- 如何保持集装箱的运转和效率?
- 如何应对用户不断变化的代码和工作负载?
配置Kubernetes集群以平衡资源和性能可能是一个挑战;这需要Kubernetes内部的专业知识。 您的应用程序或服务上的工作负载可能会在一整天甚至一小时内波动,因此最好将平衡表示为一个连续的过程。
Kubernetes自动缩放级别
有效的自动缩放需要两个级别之间的协调:
- Pod级别,包括水平(Horizontal Pod Autoscaler,HPA)和垂直自动缩放(Vertical Pod Autoscaler,VPA)。 这正在扩展容器的可用资源。
- 群集级别由群集自动缩放器(CA)控制,可以增加或减少群集中的节点数。
水平自动缩放模块(HPA)
顾名思义,HPA可扩展Pod副本的数量。 作为更改副本数量的触发器,大多数开发人员都使用CPU和内存负载。 但是,您可以基于
自定义指标 ,
指标的
组合甚至是
外部指标来扩展系统。
高级HPA工作流程:
- HPA以30秒的默认间隔连续检查安装期间指定的度量标准值。
- 如果达到指定的阈值,则HPA尝试增加模块数量。
- HPA更新部署/复制控制器中的副本数。
- 然后,部署/复制控制器将部署所有必需的附加模块。
达到指标阈值时,HPA启动模块部署过程使用HPA时,请考虑以下事项:
- 默认的HPA验证间隔为30秒。 通过控制器管理器中的horizontal-pod-autoscaler-sync-period标志进行设置。
- 默认相对误差为10%。
- 在模块数量最后增加之后,HPA希望指标在三分钟内稳定下来。 该间隔由horizontal-pod-autoscaler-upscale-delay标志设置。
- 在最后一次减少模块数量之后,HPA有望稳定五分钟。 该间隔由horizontal-pod-autoscaler-downscale-delay标志设置。
- HPA与部署对象(而不是复制控制器)一起使用时效果最佳。 水平自动缩放与直接操作复制控制器的滚动更新不兼容。 部署时,副本数直接取决于部署对象。
吊舱垂直自动缩放
垂直自动缩放(VPA)将更多(或更少)的处理器或内存时间分配给现有的Pod。 它适用于具有或不具有状态无状态的Pod,但主要用于状态服务。 但是,如果需要自动调整最初分配的资源量,则可以将VPA应用于无状态模块。
VPA还响应OOM事件(内存不足,内存不足)。 要更改处理器时间和内存大小,需要重新启动Pod。 重新启动时,VPA会遵循
Pod分配预算(PDB ),以确保最少的模块数量。
您可以为每个模块设置最小和最大资源量。 因此,您可以将最大分配内存限制为8 GB。 如果当前节点不能为每个容器分配超过8 GB的内存,这将很有用。 详细的规格和操作机制在
VPA官方Wiki中进行了描述。
另外,VPA具有有趣的推荐功能(VPA推荐器)。 它基于基于历史指标的智能算法,跟踪所有模块的资源利用率和OOM事件,以提供新的内存和处理器时间值。 还有一个API,它使用pod描述符并返回建议的资源值。
值得注意的是,VPA Recommender不会监视资源的“限制”。 这可能导致模块垄断节点内的资源。 最好在名称空间级别设置一个限制值,以避免浪费大量的内存或处理器时间。
VPA的高级方案:
- VPA以默认间隔10秒连续检查安装期间指定的度量标准值。
- 如果达到指定的阈值,则VPA尝试更改分配的资源量。
- VPA更新部署/复制控制器中的资源量。
- 重新启动模块时,所有新资源都将应用于创建的实例。
VPA添加了所需的资源量使用VPA时请考虑以下几点:
- 缩放需要强制重启Pod。 为避免进行更改后的不稳定操作,这是必要的。 为了可靠性,模块将根据新分配的资源重新启动并在节点之间分配。
- VPA和HPA尚不兼容,不能在同一吊舱上工作。 如果在同一群集中同时使用两种缩放机制,请确保设置不允许在同一对象上激活它们。
- VPA仅根据过去和当前的使用情况来配置容器对资源的请求。 它没有对资源使用设置限制。 应用程序的不正确操作可能会出现问题,这些问题将开始占用越来越多的资源,这将导致Kubernetes关闭此pod。
- VPA仍处于发展初期。 准备在不久的将来系统可能会发生一些变化。 您可以阅读有关已知限制和开发计划的信息 。 因此,计划是实施VPA和HPA的联合工作,以及模块的部署以及针对它们的垂直自动扩展策略(例如,特殊标签“ require VPA”)。
Kubernetes集群自动扩展
群集自动缩放器(CA)根据等待的Pod数更改节点数。 系统会定期检查挂起的模块-如果需要更多资源并且集群未超过既定限制,则增加集群大小。 CA与云服务提供商进行交互,向其请求其他节点或释放空闲节点。 CA的第一个公开版本是在Kubernetes 1.8中引入的。
高级操作方案CA:
- CA以默认间隔10秒检查处于待机状态的模块。
- 如果由于群集中可用的资源不足而无法分配一个或几个模块,则它会尝试准备一个或几个其他节点。
- 当云服务提供商分配所需的节点时,它会加入集群并准备为Pod模块提供服务。
- Kubernetes Scheduler将待处理的模块分发到新主机。 如果在此之后某些模块仍保持待机状态,则重复该过程并将新节点添加到群集中。
在云中自动分配群集节点使用CA时,请考虑以下事项:
- CA确保无论处理器负载如何,群集中的所有模块都可以运行。 此外,他尝试确保集群中没有不必要的节点。
- CA会在约30秒后记录对扩展的需求。
- 在节点不再需要之后,CA默认会等待10分钟,然后再扩展系统。
- 在自动缩放系统中,存在扩展器的概念。 这些是选择要添加新节点的节点组的不同策略。
- 负责任地使用选项cluster-autoscaler.kubernetes.io/safe-to-evict(true) 。 如果安装许多Pod,或者其中许多Pod分散在所有节点上,则将大大失去缩减集群大小的能力。
- 使用PodDisruptionBudgets防止删除Pod,因为应用程序的哪一部分可能完全失败。
Kubernetes自动缩放系统如何相互作用
为了实现完美的和谐,应在Pod级别(HPA / VPA)和群集级别同时应用自动缩放。 它们相对简单地彼此交互:
- HPA或VPA更新分配给现有Pod的Pod副本或资源。
- 如果没有足够的节点用于计划的扩展,则CA会注意到空闲状态下的Pod的存在。
- CA分配新节点。
- 模块被分发到新节点。
Kubernetes协作扩展系统常见的Kubernetes自动缩放错误
开发人员在尝试应用自动缩放时会遇到一些典型问题。
HPA和VPA取决于指标和一些历史数据。 如果分配的资源不足,则模块将被折叠并且将无法生成指标。 在这种情况下,自动缩放将永远不会发生。
缩放操作本身是时间敏感的。 我们希望模块和集群能够快速扩展-在用户注意到任何问题或故障之前。 因此,应考虑吊舱和群集的平均扩展时间。
理想情况-4分钟:
- 30秒 目标指标更新:30-60秒。
- 30秒 HPA检查指标值:30秒。
- 少于2秒。 Pod模块已创建并进入待机状态:1秒。
- 少于2秒。 CA查看待处理的模块并发送呼叫以准备节点:1秒。
- 3分钟 云提供商分配节点。 K8等待直到准备就绪:最多10分钟(取决于多个因素)。
最糟糕(更现实)的场景-12分钟:
- 30秒 目标指标更新。
- 30秒 HPA验证指标值。
- 少于2秒。 Pod模块已创建并进入待机状态。
- 少于2秒。 CA会看到挂起的模块,并发送呼叫以准备节点。
- 10分钟 云提供商分配节点。 K8等待直到准备就绪。 等待时间取决于几个因素,例如供应商的延迟,OS的延迟,辅助工具的工作。
不要将云提供商的扩展机制与我们的CA混淆。 后者在Kubernetes集群内部工作,而云提供程序机制在节点分配的基础上工作。 他不知道您的Pod或应用程序正在发生什么。 这些系统并行工作。
如何在Kubernetes中管理扩展
- Kubernetes是一种资源管理和编排工具。 集群Pod和资源管理操作是Kubernetes开发的关键里程碑。
- 了解适用于HPA和VPA的Pod可扩展性逻辑。
- 仅当您充分了解吊舱和容器的需求时,才应使用CA。
- 为了获得最佳的群集配置,您需要了解各种扩展系统如何协同工作。
- 在评估扩展时间时,请记住最坏的情况和最好的情况。