<返回更多

使用 kube-downscaler 降低 Kubernetes 集群成本

2023-10-27  新钛云服  
加入收藏

使用 kube-downscaler 降低 Kubernetes 集群成本

介绍

Kube-downscaler 是一款开源工具,允许用户定义 Kube.NETes 中 pod 资源自动缩减的时间。这有助于通过减少非高峰时段的资源使用量来降低基础设施成本。

在本文中,我们将详细介绍 kube-downscaler 的功能、安装和配置,以及它的用例和未来前景。

kube-downscaler的特点

Kube-downscaler 是一款基于调度的强大工具,用于在 Kubernetes 集群中对应用程序进行升级或降级。在本节中,我们将探讨该工具的一些关键功能:

与Kubernetes功能或工具的兼容性

Kube-downscaler 还支持水平 Pod 自动缩放 (HPA),并可以与 HPA 结合使用,以确保为应用程序维护所需的副本数量。这使得 kube-downscaler 能够为 Kubernetes 中的应用程序扩展提供额外的灵活性和细粒度的控制。

Karpenter 和 kube-downscaler 是两个可以结合使用的工具,可以为 Kubernetes 集群提供完整且强大的资源管理解决方案。通过结合使用 Karpenter 和 kube-downscaler,Kubernetes 集群可以从水平和垂直扩展中受益。 Downscaler 允许减少 Pod 数量,而 Karpenter 通过将 Pod 整合到更少或不同类型的机器上来优化节点利用率。

根据定义的时间段自动扩展部署副本

Kube-downscaler 可以根据预定义的时间段自动扩展部署副本。这意味着我们可以设置一个计划,在一天、一周或一个月的特定时间增加或减少副本数量。

比如,如果我们知道应用程序在一天中的某些时段遇到高流量,则可以将 kube-downscaler 配置为在这些时段自动扩展副本,然后在流量减少时缩小副本。 

这可以允许在预期峰值负载的情况下进行扩展,而不是等待峰值负载发生并由 HPA 处理。这可以帮助优化资源使用并确保您的应用程序始终可用且响应迅速。

但是 Kube-downscaler 主要用于缩小副本并优化集群的成本,我们通常使用 HPA 来管理扩展。

kube-downscaler的安装和配置

kubernetes集群上kube-downscaler安装说明

Github 克隆 kube-downscaler 存储库:

git clone <https://codeberg.org/hjacobs/kube-downscaler.git>

进入 kube-downscaler 目录:

cd kube-downscaler

编辑 deploy/kube-downscaler.yaml 文件以根据您的具体需求自定义配置。例如,可以调整时区、计划和缩放规则。

将配置应用到您的 Kubernetes 集群:

kubectl Apply -f deploy/

此命令将部署 kube-downscaler 控制器并创建 kube-downscaler 部署。

可以通过检查 kube-downscaler 部署的日志来验证 kube-downscaler 控制器是否正在运行:

kubectl logs -f deployment/kube-downscaler

安装完成后,需要进行一下配置。

根据具体用户需求配置kube-downscaler

Kube-downscaler 通过在 Kubernetes 部署对象上使用注释来提供扩展计划的定制。 

部署对象中的 downTimePeriod注释可用于指定不应扩展部署的停机时间段。

minReplicas 注释可用于设置部署的最小副本数。 

这些字段与 kube-downscaler 注释结合使用,允许您根据特定的业务需求和资源利用模式创建自定义的扩展计划。 

通过调整这些字段,可以配置 kube-downscaler 以优化应用程序可用性和成本效率的方式扩展部署。

以下是使用 kube-downscaler 进行部署的简单配置。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: random-deployment
    annotations:
        # Kube-downscaler
        downscaler/downtimePeriod: "Mon-Fri 00:00-07:00 Europe/Berlin"
        downscaler/minReplicas: 1
spec:
  replicas: 2
  selector:
    matchLabels:
      app: random
  template:
    metadata:
      labels:
        app: random
    spec:
      contAIners:
      - name: random-container
        image: random-image

通过此配置,从周一到周五午夜到早上 7 点(在欧洲/柏林时间线上),副本数量将减少到 1 个。 

kube-downscaler 将根据定义的计划自动开始缩减 pod。 

目前我们已经在 Kubernetes 集群上安装并运行了 kube-downscaler。

算法

Kube-downscaler 如果满足以下所有条件,将缩减部署的副本:

Minimum replicas最小副本数

默认情况下,部署将缩减为零副本。这可以通过部署或其命名空间的注释进行配置, downscaler/downtime-replicas 也可以通过 CLI 使用 --downtime-replicas 。

Ex: downscaler/downtime-replicas: "1"。

Specific workload特定工作负载

在正常的情况下 HorizontalPodAutoscalers ,该字段不能设置为零, 因此downscaler/downtime-replicas 至少 1 应设置为 。 关于 CronJobs ,它们的状态将按照我们的预期进行定义 suspend: true 。

注意点

请注意,默认的宽限期为 15 分钟适用于新的 Nginx 部署,即

INFO: Scaling down Deployment default/nginx from 1 to 0 replicas (uptime: Mon-Fri 09:00-17:00 America/Buenos_Aires, downtime: never)

请注意,如果 HorizontalPodAutoscaler (HPA) 与部署一起使用,请考虑以下事项:

若要使用 在 HPA 上 --downtime-replicas=1 启用downscaler,请确保将以下注释添加到部署和 HPA。

$ kubectl annotate deploy nginx 'downscaler/exclude=true'
$ kubectl annotate hpa nginx 'downscaler/downtime-replicas=1'
$ kubectl annotate hpa nginx 'downscaler/uptime=Mon-Fri 09:00-17:00 America/Buenos_Aires'

详细配置

Uptime/downtime spec

downscaler通过命令行参数、环境变量或 Kubernetes 注释进行配置。

时间定义(例如 DEFAULT_UPTIME )接受以逗号分隔的规范列表,例如,以下配置将缩小非工作时间的所有部署:

DEFAULT_UPTIME="Mon-Fri 07:30-20:30 Europe/Berlin"

仅在周末和周五 20:00 后缩小:

DEFAULT_DOWNTIME="Sat-Sun 00:00-24:00 CET,Fri-Fri 20:00-24:00 CET'

每个时间规范可以采用以下两种格式之一:

基于periods的替代逻辑

您可以选择升级或缩减的时间段,而不是严格的正常运行时间或停机时间。时间定义是相同的。在这种情况下,放大或缩小只发生在时间段,其余时间将被忽略。

如果配置了升级或缩减周期,将忽略正常运行时间和停机时间。这意味着某些选项是互斥的,例如,您可以使用或 --default-downtime ,但不能同时使用 --downscale-period 两者。

此定义将在 19:00 到 20:00 之间缩减群集。如果手动升级集群,则在第二天 19:00-20:00 之前不会缩减集群。

DOWNSCALE_PERIOD="Mon-Sun 19:00-20:00 Europe/Berlin"

命令行选项

可用的命令行选项:

Namespace Defaults命名空间默认值

DEFAULT_UPTIME 、 DEFAULT_DOWNTIME 和 FORCE_UPTIME 排除也可以使用命名空间注释进行配置。在配置的情况下,这些值将取代其他全局默认值。

apiVersion: v1
kind: Namespace
metadata:
    name: foo
    labels:
        name: foo
    annotations:
        downscaler/uptime: Mon-Sun 07:30-18:00 CET

命名空间级别支持以下批注:

使用案例

该工具的主要用例是通过优化 Kubernetes 集群资源的利用率来降低成本。不过,它也可以用来预热集群,避免过度依赖 HPA。 

虽然这不是其主要目的,但这种组合提供了一种替代解决方案,可确保应用程序的高可用性,同时最大限度地降低基础设施成本。

降低成本

kube-downscaler 的另一个用例是防止高峰使用期间的服务中断。通过定义在高需求期间扩展资源的计划,kube-downscaler 可以帮助预先扩展部署并避免 HPA 延迟,以确保应用程序即使在高峰使用期间也保持可用和响应。

服务中断预防

kube-downscaler 的另一个用例是防止高峰使用期间的服务中断。通过定义在高需求期间扩展资源的计划,kube-downscaler 可以帮助预先扩展部署并避免 HPA 延迟,以确保应用程序即使在高峰使用期间也保持可用和响应。

建议

基于预定义计划的扩展,这可能并不适合所有用例。此外,它不支持自动缩放,这意味着用户必须手动调整缩放计划以满足不断变化的需求。

另一种可供考虑的解决方案是 Keda。 Keda是一个开源项目,为Kubernetes应用程序提供动态自动伸缩功能。使用 Keda,用户可以根据各种指标(例如队列长度、CPU 使用率或自定义指标)设置自定义扩展规则。

这允许对资源使用进行更精细的控制,并确保应用程序始终能够正确扩展以满足需求。

此外,Keda 兼容广泛的 Kubernetes 应用程序,包括有状态和无状态应用程序,并支持多种事件源,例如 Azure Event Hubs、Kafka 和 RabbitMQ。

结论

Kube-downscaler 是管理 Kubernetes 集群中资源使用情况的强大工具。通过定义扩展计划,用户可以优化集群中的资源使用并降低成本,同时确保应用程序即使在高峰使用期间也保持可用和响应。

虽然 kube-downscaler 是管理 Kubernetes 集群中资源使用情况的一个有价值的工具,但它可能有一些限制。如果需要对资源扩展进行更精细的控制或需要自动扩展功能,那么可能值得考虑像 Keda 这样的替代解决方案。

关键词:Kubernetes      点击(15)
声明:本站部分内容来自互联网,如有版权侵犯或其他问题请与我们联系,我们将立即删除或处理。
▍相关推荐
更多Kubernetes相关>>>