什么是K8S弹性伸缩
K8S可以自动化管理许多任务,包括自动监控、扩缩容任务,代替手动分配资源,我们可以自动化这些过程从而节省时间,响应相关业务需求,快速应对业务流量压力,以及在流量低峰的时候进行缩容节省资源。K8S自动扩缩容机制主要有两层:
- 基于POD的扩缩容---由HPA(Horizontal Pod Autoscalar)和VPA(Vertical Pod Autoscaler)进行支持,分别对应水平伸缩和垂直伸缩。
- 给予Node的扩缩容---由Cluster Autoscaler进行支持。
一般弹性伸缩主要是用来应对突发流量和节省资源,互联网产品遇到节假日、购物节、微博热点等情况会导致系统负载激增,服务原有的配置无法满足需求,需要进行横向扩展以应对流量洪峰,可以是手动增加机器也可以自动的去扩容。 节省资源,在不损失服务稳定的前提下,当流量洪峰过去后,尽可能的节省资源需要进行缩容。
K8S扩缩容map:
节点伸缩
集群自动扩缩器会更改集群节点的数量,而HPA 会扩缩正在运行的集群 pod 的数量。集群自动扩缩器寻找不可调度的Pod,并尝试整合当前仅部署在几个节点上的Pod。它不断地循环执行这两个任务。
不可调度的 pod 是由于内存或 CPU 资源不足,或者由于 pod 的 taint tolerations(阻止 pod 在特定节点上调度的规则)、关联性规则(鼓励 pod 在特定节点上调度的规则而导致无法匹配现有节点的结果)节点)或节点选择器标签。如果集群包含不可调度的 pod,则自动缩放器会检查托管节点池,以查看添加节点是否可以解除对 pod 的阻塞。如果是这样,并且可以扩大节点池,则将节点添加到池中。
自动缩放器还会扫描托管池的节点,以寻找可能重新安排其他可用集群节点上的 Pod。如果找到,它会驱逐这些并删除节点。移动 pod 时,自动缩放器会考虑 pod 优先级和 PodDisruptionBudgets。
缩减时,集群自动扩缩器允许在强制节点终止之前有 10 分钟的正常终止持续时间。这允许有时间将节点的 pod 重新调度到另一个节点。
限制 Cluster autoscaler 仅支持某些托管的 Kubernetes 平台——如果您的平台不受支持,请考虑自行安装。 集群自动缩放器不支持本地 PersistentVolume。 使用本地 SSD 时,您无法为需要临时存储的 pod 扩展大小为 0 的节点组。
最佳实践 以下是有效使用 Cluster Autoscaler 的两个最佳实践:
- 确保 Cluster Autoscaler pod 的资源可用性——您可以通过为向集群 autoscaler pod 发出的资源请求定义至少一个 CPU 来做到这一点。 确保运行集群自动扩缩器 pod 的节点有足够的资源至关重要。 否则,集群自动扩缩器可能会变得无响应。
- 确保所有 pod 都具有已定义的资源请求——要正常运行,集群自动扩缩器需要指定的资源请求。 这是因为集群自动扩缩器根据 pod 的状态和单个节点的利用率做出决策,如果计算关闭,则可能会被取消。
HPA(Horizontal Pod Autoscalar)
横向扩缩容,代表着节点或者服务缩量上的变更,当K8S POD对应应用使用负载变化比较大后,需要有种方式自动去增加和移除Pod副本,而HPA就是K8S提供的自动化扩缩容Pod的方法,一旦配置HPA,POD就会根据应用的负载情况自动的进行数量上的扩缩容。
HPA 对于无状态应用程序和有状态应用的工作负载都很有用,HPA被K8S Controller Manager所管理,以控制循环的方式运行,Controller manager 提供一个flag制定了HPA组建循环的周期,默认是15秒去同步一次。 每一次循环检测,Controller manager会去比较把真实的资源使用情况与每一个HPA配置的指标定义进行比较。 HPA 使用指标来确定 Auto Scaling,如下所示:
- 对于资源指标,您可以设置目标利用率值或固定目标。
- 对于自定义指标,仅支持原始值,您无法定义目标利用率。
- 对于对象度量和外部度量,缩放基于从对象获得的单个度量,将其与目标值进行比较以产生利用率。
限制 在评估 CPU 或内存指标时,避免在内存或 CPU上同时使用 HPA 和垂直 Pod 自动缩放 (VPA)。 此外在使用deployment对象时,不能在 ReplicaSet 或 Replication Controller 上配置 HPA,只能在 Deployment 本身上配置。
以下是高效使用 HPA 的两个关键最佳实践:
- 确保所有 Pod 都配置了资源请求——在做出扩展决策时,HPA 使用观察到的作为 Kubernetes 控制器一部分工作的 Pod 的 CPU 利用率值。 这是按单个 pod 发出的资源请求的百分比计算的。 为确保数据准确,您应该使用所有容器的所有资源请求值。
- 尽可能选择自定义指标而不是外部指标——外部指标 API 存在安全风险,因为它可以提供对大量指标的访问。 自定义指标 API 如果受到损害,风险会更小,因为它只保存您的特定指标。 将 HPA 与 Cluster Autoscaler 一起使用——这使您可以协调 pod 的可伸缩性与集群中节点的行为。 例如,当您需要扩展时,Cluster Autoscaler 可以添加符合条件的节点,而在缩减时,它可以关闭不需要的节点以节省资源。
垂直 Pod 自动缩放 (VPA)
垂直扩缩容,代表着节点或者服务资源配额的变更,Vertical Pod Autoscaler 使用实时数据来设置容器资源的限制。
大多数容器更接近于它们的初始请求,而不是上限限制的请求。因此,Kubernetes 的默认调度程序会过度使用节点的内存和 CPU 预留。为了解决这个问题,VPA 增加和减少 pod 容器发出的请求,以确保实际使用量与可用内存和 CPU 资源一致。
某些工作负载可能需要短时间的高利用率。默认情况下增加请求限制将导致浪费未使用的资源,并且会限制可以运行这些工作负载的节点。 HPA 在某些情况下可能会对此有所帮助,但在其他情况下,应用程序可能不容易支持跨多个实例的负载分布。
VPA 部署通过使用其推荐组件监控资源利用率来计算目标值。它的更新程序组件驱逐必须使用新资源限制更新的 pod。最后,VPA 准入控制器在创建 pod 资源请求时使用 mutating admission webhook 覆盖它们。
限制
- 更新正在运行的 Pod 在 VPA 中仍处于试验阶段,大型集群中的性能未经过测试。
- VPA 对大多数内存不足事件(但不是全部)做出反应,VPA 在更新 pod 资源时是会重新创建 pod,可能会导致服务闪断,并且服务可能在不同的节点上。
- VPA的扩容受到宿主机影响,为POD分配的资源无法超过宿主机的大小。
以下是有效使用 Vertical Pod Autoscaler 的两个最佳实践:
- 避免同时使用 HPA 和 VPA——HPA 和 VPA 不兼容。 不要将两者一起用于同一组 pod,除非您将 HPA 配置为使用自定义或外部指标。
- 将 VPA 与 Cluster Autoscaler 一起使用 - VPA 有时可能会推荐超出可用资源的资源请求值。 这可能会导致资源压力并导致 pod 进入挂起状态。 集群自动缩放器可以通过启动新节点以响应待处理的 pod 来缓解这种行为。
其他 Kubernetes 扩展机制 您可以使用其他方法来扩展 Kubernetes 中的工作负载。 这里有两种常用的方法:
DaemonSets——用于在选定集中的所有 Pod 中部署后台服务。 ReplicaSets——用于创建指定数量的相同 pod。
参考资料
blog.luojilab.com/2019/12/30/…
我正在参与掘金技术社区创作者签约计划招募活动,点击链接报名投稿。