要完全掌握 Kubernetes,您需要了解扩展集群资源的不同方法:
文章
为什么考虑扩展很重要
但是,您还应该考虑以下问题:
- 如何扩展模块和应用程序?
- 如何保持容器的运行和高效?
- 如何应对用户不断变化的代码和工作负载?
配置 Kubernetes 集群以平衡资源和性能可能具有挑战性,并且需要了解 Kubernetes 内部工作原理的专业知识。 应用程序或服务的工作负载可能会在一天甚至一个小时内波动,因此最好将平衡视为一个持续的过程。
Kubernetes 自动缩放级别
有效的自动缩放需要两个级别之间的协调:
- Pod 级别,包括水平(Horizontal Pod Autoscaler,HPA)和垂直自动缩放器(Vertical Pod Autoscaler,VPA)。 这会扩展容器的可用资源。
- 集群级别,由集群自动缩放器 (CA) 管理,可增加或减少集群内的节点数量。
水平自动缩放器 (HPA) 模块
顾名思义,HPA 可扩展 pod 副本的数量。 大多数 DevOps 使用 CPU 和内存负载作为更改副本数量的触发器。 但是,可以根据以下情况扩展系统:
高级HPA操作图:
- HPA 以默认的 30 秒间隔持续检查安装过程中指定的指标值。
- 如果达到指定阈值,HPA 会尝试增加模块数量。
- HPA 更新部署/复制控制器内的副本数量。
- 然后部署/复制控制器部署任何必要的附加模块。
当达到指标阈值时,HPA 启动模块部署过程
使用 HPA 时,请考虑以下事项:
- 默认HPA检查间隔为30秒。 它是由标志设置的 水平 Pod 自动缩放器同步周期 在控制器管理器中。
- 默认相对误差为 10%。
- 在上次增加模块数量后,HPA 预计指标将在三分钟内稳定下来。 该间隔由标志设置 水平 Pod 自动缩放器放大延迟.
- 最后一次减少模块数量后,HPA 等待五分钟稳定下来。 该间隔由标志设置 水平 Pod 自动缩放器缩减延迟.
- HPA 最适合部署对象而不是复制控制器。 水平自动缩放与滚动更新不兼容,滚动更新直接操作复制控制器。 对于部署,副本的数量直接取决于部署对象。
Pod 的垂直自动缩放
垂直自动扩展 (VPA) 为现有 Pod 分配更多(或更少)CPU 时间或内存。 适用于有状态或无状态 Pod,但主要用于有状态服务。 但是,如果需要自动调整初始分配的资源量,您也可以将 VPA 用于无状态模块。
VPA 还响应 OOM(内存不足)事件。 更改 CPU 时间和内存需要重新启动 Pod。 重新启动时,VPA 会考虑分配预算(
您可以设置每个模块的最小和最大资源。 因此,您可以将分配的最大内存量限制为 8 GB。 如果当前节点绝对无法为每个容器分配超过 8 GB 的内存,则这非常有用。 详细规格和操作机制描述于
另外,VPA还有一个有趣的推荐功能(VPA Recommender)。 它监视所有模块的资源使用情况和 OOM 事件,根据历史指标的智能算法建议新的内存和 CPU 时间值。 还有一个 API,它采用 pod 句柄并返回建议的资源值。
值得注意的是,VPA Recommender 不跟踪资源“限制”。 这可能会导致模块独占节点内的资源。 最好在命名空间级别设置限制,以避免大量内存或 CPU 消耗。
高阶VPA运行方案:
- VPA 以 10 秒的默认间隔连续检查安装过程中指定的指标值。
- 如果达到指定的阈值,VPA 会尝试更改分配的资源量。
- VPA 更新部署/复制控制器内的资源数量。
- 当模块重新启动时,所有新资源都会应用于创建的实例。
VPA 添加所需的资源量
使用VPA时请记住以下几点:
- 扩展需要强制重启 pod。 这是为了避免更改后运行不稳定所必需的。 为了可靠性,模块根据新分配的资源重新启动并分布在节点上。
- VPA 和 HPA 尚不兼容,无法在同一 Pod 上运行。 如果您在同一集群中使用两种扩展机制,请确保您的设置防止它们在同一对象上激活。
- VPA 仅根据过去和当前的使用情况调整容器对资源的请求。 它不设置资源使用限制。 应用程序可能会出现无法正常工作并开始占用越来越多资源的问题,这将导致 Kubernetes 关闭此 pod。
- VPA 仍处于开发的早期阶段。 请做好准备,系统可能在不久的将来发生一些变化。 您可以阅读有关
已知的限制 и发展计划 。 因此,计划实现VPA和HPA的联合运营,以及模块的部署以及针对它们的垂直自动扩展策略(例如,特殊标签“需要VPA”)。
自动缩放 Kubernetes 集群
Cluster Autoscaler (CA) 根据等待 Pod 的数量更改节点数量。 系统定期检查挂起的模块 - 如果需要更多资源并且集群不超过既定限制,则增加集群大小。 CA 与云服务提供商通信,向云服务提供商请求额外的节点,或释放空闲的节点。 CA 的第一个通用版本是在 Kubernetes 1.8 中引入的。
SA操作的高层方案:
- CA 以 10 秒的默认间隔检查挂起的模块。
- 如果一个或多个 Pod 由于集群没有足够的可用资源来分配而处于备用状态,它会尝试配置一个或多个附加节点。
- 当云服务提供商分配所需的节点时,它就会加入集群并准备好为 Pod 提供服务。
- Kubernetes 调度程序将挂起的 pod 分发到新节点。 如果此后某些模块仍处于等待状态,则重复该过程并将新节点添加到集群中。
在云端自动配置集群节点
使用 CA 时请考虑以下事项:
- CA 确保集群中的所有 Pod 都有运行空间,无论 CPU 负载如何。 它还尝试确保集群中没有不必要的节点。
- CA 在大约 30 秒后注册需要扩展。
- 一旦不再需要某个节点,CA 默认等待 10 分钟后再进行系统扩展。
- 自动缩放系统具有扩展器的概念。 这些是选择将添加新节点的一组节点的不同策略。
- 负责任地使用该选项 cluster-autoscaler.kubernetes.io/safe-to-evict (true)。 如果您安装了很多 Pod,或者其中许多 Pod 分散在所有节点上,那么您将在很大程度上丧失扩展集群的能力。
- 使用
Pod 中断预算 以防止 Pod 被删除,这可能会导致应用程序的某些部分完全损坏。
Kubernetes 自动缩放器如何相互交互
为了完美协调,应在 Pod 级别 (HPA/VPA) 和集群级别应用自动缩放。 它们之间的交互相对简单:
- HPA 或 VPA 更新 Pod 副本或分配给现有 Pod 的资源。
- 如果没有足够的节点用于计划的扩展,CA 会注意到存在处于等待状态的 Pod。
- CA分配新节点。
- 模块被分发到新节点。
协作 Kubernetes 横向扩展系统
Kubernetes 自动缩放中的常见错误
DevOps 在尝试实现自动缩放时会遇到几个常见问题。
HPA 和 VPA 取决于指标和一些历史数据。 如果分配的资源不足,模块将被最小化并且无法生成指标。 在这种情况下,自动缩放将永远不会发生。
缩放操作本身对时间敏感。 我们希望模块和集群能够在用户注意到任何问题或故障之前快速扩展。 因此,应考虑 Pod 和集群的平均扩展时间。
理想场景 - 4 分钟:
- 30秒。 更新目标指标:30−60 秒。
- 30秒。 HPA 检查指标值:30 秒。
- 不到2秒。 Pod 已创建并进入等待状态:1 秒。
- 不到2秒。 CA 发现等待模块并向供应节点发送调用:1 秒。
- 3分钟。 云提供商分配节点。 K8s 等待直到准备好:最多 10 分钟(取决于几个因素)。
最坏的情况(更现实) - 12 分钟:
- 30秒。 更新目标指标。
- 30秒。 HPA 检查指标值。
- 不到2秒。 Pod 创建完成并进入 Standby 状态。
- 不到2秒。 CA 看到等待的模块并发出调用来配置节点。
- 10分钟。 云提供商分配节点。 K8s 等待直到它们准备好。 等待时间取决于多种因素,例如供应商延迟、操作系统延迟和支持工具。
不要将云提供商的扩展机制与我们的 CA 混淆。 后者在 Kubernetes 集群内部运行,而云提供商引擎则在节点分布的基础上运行。 它不知道您的 Pod 或应用程序发生了什么。 这些系统并行运行。
如何管理 Kubernetes 中的扩展
- Kubernetes 是一种资源管理和编排工具。 管理 Pod 和集群资源的操作是掌握 Kubernetes 的一个关键里程碑。
- 了解 Pod 可扩展性的逻辑,同时考虑 HPA 和 VPA。
- 仅当您充分了解 Pod 和容器的需求时才应使用 CA。
- 为了以最佳方式配置集群,您需要了解不同的扩展系统如何协同工作。
- 在估计扩展时间时,请记住最坏情况和最好情况。
来源: habr.com