基于 Kubernetes 的自动扩展(auto scaling)引

Kubernetes (略记为 k8s)作为开源的容器编排系统,近年来快速流行,正在成为云原生分布式系统架构中的事实标准。可扩展性(scalability)是分布式系统设计的一项重要主题,而 Kubernetes 提供了丰富的自动可扩展性支持。本文以 Kubernetes 内建特性为基础,结合 Azure Kubernetes Service (AKS)的部分专有特性,介绍 Kubernetes 为实现自动扩展提供的一些基本方法。面对不同系统更为复杂的实际生产环境,仍有必要评估是否需要更加复杂的架构来满足具体的可扩展性需求。本文不涉及扩展方案的具体设计细节。

考虑到 Kubernetes 依然是相对较新的系统,很多术语的中文翻译尚未被广泛接受,且考虑到易读性,本文会根据情况使用中文翻译或保留英文原文。建议将本文作为能了解概况的介绍,在快速阅读后搜索相关文档获取更详细的信息。

衡量标准(Metrics)

在设计自动扩展时,首要问题便是,何时扩展。为了回答这一问题,首先需要确定需要被监控的衡量标准,来判断是否需要扩展系统。

对于 Kubernetes,常见的衡量标准包括 CPU 和内存等 pod 自身的资源利用情况,也可以是 Kubernests 之外的某些队列的长度等其他外部指标。

扩展形式

根据水平(horizontal)还是垂直(vertical),基于 pod 还是基于 node,Kubernetes 的扩展大致可以分为四种类型。水平扩展指增加或减少资源,如改变 pod 或 node 的数量。垂直扩展指提高或降低资源的属性,如改变 pod 请求的和最大允许的资源上限,或改变 node 的性能。

在这四种扩展形式的组合中,node 的垂直扩展不常见。下面将简述剩余三种,以及两种 AKS 支持的额外方案。

水平 Pod 自动扩展

根据需要增减 pod 副本(replica)是应对负载变动的常用手段。Kubernetes 提供了水平 Pod 自动扩展器(Horizontal Pod Autoscaler,HPA)来自动管理 pod 的扩展。

HPA 适用于无状态应用,但也支持有状态应用(stateful set)。HPA 可以与集群自动扩展器(cluster autoscaler)结合,在满足扩展需求的同时节省开销。

HPA 控制器通过监控内部和外部衡量标准,来判断 pod 是否需要扩展。衡量标准支持以下三类:

  • pod 自身属性,如 CPU 利用率
  • 自定义衡量标准,如网络流量或其他与 pod 相关的数值
  • 外部衡量标准,与 pod 无关。如外部队列中等待处理的任务数量

HPA 控制器默认作为标准的 kube-controller-manager 运行,因此仅能监控由副本控制器创建的 pod,如 deployment、replica set,或 statful set。HPA 还需要一个衡量标准源,如 metrics-server 来监控 pod 的 CPU 使用,或者是实现了 custom.metrics.k8s.is 或 external.metrics.k8s.io 的服务来分别监控自定义或外部衡量标准。

集群自动扩展器

集群自动扩展器(Cluster Autoscaler,CA)能够根据集群使用率增减 node 的数量,帮助优化成本。

CA 持续运行两种任务来监视未被安排的 pod,并计算是否能在满足当前负载的前提下减少 node 数量。

pod 未被安排可能有以下原因:

  • CPU 或内存资源不足
  • 没有匹配 pod 的亲和性(affinity)规则,或污点(taint)和容忍度(toleration)的 node

如发现未被安排的 pod,CA 将检查 node 池,并增加新 node 来解决该问题。如果条件允许,CA 也会移动 pod 至其他 node 来优化使用。CA 在增加 node 时也会试图保持不同区域(zone)之间的平衡,但在减少 node 时则不会有额外处理。

CA 仅受如 AKS 等云端 Kubernetes 支持。这些 Kubernetes 服务往往也会处理好 CA 带来的安全问题。

水平 Pod 自动扩展器

水平 Pod 自动扩展器(Vertical Pod Autoscaler,VPA)能够改变 pod 容器所需的 CPU 和内存资源请求,来更好地分配集群资源。VPA 根据实际使用情况而非最初指定的资源请求上限预估来请求资源,因此更接近现实环境。

如果负载激增而又无法分散至不同 node,VPA 也能临时增加 pod 的资源来应对突发情况。

Kubernetes 不支持动态更改正在运行的 pod 的资源,因此,VPA 通过以下方式来实现扩展:

  • 一个用于监控使用情况并计算相应数值的 recommender,recommender 仅能用于获取负载状态而不实际创建新的 pod
  • 一个用于追回(evict)pod 使之可以按新的资源请求重建的 updater
  • 一个用于在新建 pod 时使用新的资源请求的 admission controller

VPA 也依赖 metrics-server。

一般情况下,如果衡量标准是 CPU 或内存利用率,VPA 不能与 HPA 同时使用。VPA 的性能也没有在大规模集群中经过验证,还有一些其他限制条件

借助 Azure Container Instance 快速扩展 AKS

Azure Container Instance(ACI)可与 AKS 集成实现快速扩展,来应对突发流量激增。ACI 实例是一种安全的隔离的逻辑计算资源,并以低延迟实现扩展。

Kubernetes Event-driven Autoscaling

Kubernetes Event-driven Autoscaling(KEDA)是由 Microsoft 和 Red Hat 开发的开源组件,它允许 Kubernetes 以事件驱动的架构模型来处理负载问题。KEDA 是 CNCF 官方项目,目前处于沙盒阶段。

KEDA 可以水平扩展 deployment 或 job。它构筑于 Kubernetes 的 HPA 之上,并提供了接口以便用户利用外部衡量标准来决定是否扩展。Kafka topic lag、Azure Queue 的长度、Prometheus 查询语句的返回结果等都能被 KEDA 用作衡量标准。

KEDA 有助于减少开发成本,更方便地使用外部衡量标准。不过,如果要同时使用 CA,仍需具体设计扩展方案,以免 KEDA 和 CA 行为发生冲突。

_

以上是 Kubernetes 自动扩展的一些基本形式和概念,可以根据关键字或相关链接进一步了解详情。关于 AKS 的扩展选择可以阅读官方文档