使用 kube-downscaler 降低Kubernetes集群成本
新钛云服已累计为您分享772篇技术干货
介绍
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 控制器是否正在运行:kubectl logs -f deployment/kube-downscaler
downTimePeriod
注释可用于指定不应扩展部署的停机时间段。minReplicas
注释可用于设置部署的最小副本数。 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
Kube-downscaler
如果满足以下所有条件,将缩减部署的副本:
current time不是“uptime”计划的一部分,也不是“downtime”计划的一部分。 如果为 true,则按以下顺序评估计划:
downscaler/downscale-period
或downscaler/downtime
工作负载定义的注释downscaler/upscale-period
或downscaler/uptime
工作负载定义的注释downscaler/downscale-period
或downscaler/downtime
工作负载命名空间上的注释downscaler/upscale-period
或downscaler/uptime
工作负载命名空间上的注释--upscale-period
或--default-uptime
CLI 参数--downscale-period
或--default-downtime
CLI 参数UPSCALE_PERIOD
或DEFAULT_UPTIME
环境变量DOWNSCALE_PERIOD
或DEFAULT_DOWNTIME
环境变量工作负载的命名空间不是排除列表的一部分:
如果提供排除列表,它将用于代替默认值(仅包括
kube-system
)。工作负载的标签与标签列表不匹配。
工作负载的名称不是排除列表的一部分
工作负载未标记为排除(注释
downscaler/exclude: "true"
或downscaler/exclude-until: "2024-04-05"
)没有活动 Pod 强制整个集群进入正常运行时间(注释
downscaler/force-uptime: "true"
)
downscaler/downtime-replicas
也可以通过 CLI 使用 --downtime-replicas
.downscaler/downtime-replicas: "1"
HorizontalPodAutoscalers
,该字段不能设置为零, 因此downscaler/downtime-replicas
至少 1
应设置为 。 关于 CronJobs
,它们的状态将按照我们的预期进行定义 suspend: true
。如果当前时间不在 ,它不会立即缩小 Mon-Fri 9-17 (Buenos Aires timezone)
,而是在 15 分钟后缩小。downscaler
最终会记录如下内容:
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) 与部署一起使用,请考虑以下事项:如果需要缩减到 0 个副本,则应在 上 Deployment
应用注释。这是一种特殊情况,因为minReplicas
不允许在 HPA 上为 0。将部署副本设置为 0 实质上会禁用 HPA。在这种情况下,HPA 将发出事件,例如failed to get memory utilization: unable to get metrics for resource memory: no metrics returned from resource metrics API
没有 Pod 可以从中检索指标。如果需要缩小大于 0,则应在 HPA 上应用注释。这允许在停机期间根据外部流量动态扩展 Pod,并在停机期间保持较低的 minReplicas
流量,如果没有低流量。如果对部署而不是 HPA 进行批注,则会导致争用条件,即缩减部署,kube-downscaler
HPA 在部署更高时minReplicas
将其升级。
--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'
DEFAULT_UPTIME
)接受以逗号分隔的规范列表,例如,以下配置将缩小非工作时间的所有部署:DEFAULT_UPTIME="Mon-Fri 07:30-20:30 Europe/Berlin"
DEFAULT_DOWNTIME="Sat-Sun 00:00-24:00 CET,Fri-Fri 20:00-24:00 CET'
重复规范格式 <WEEKDAY-FROM>-<WEEKDAY-TO-INCLUSIVE> <HH>:<MM>-<HH>:<MM> <TIMEZONE>
.时区值可以是任何时区,例如“US/Eastern”、“PST”或“UTC”。绝对规范格式, <TIME_FROM>-<TIME_TO>
其中每个<TIME>
格式都是ISO 8601日期和时间的格式<YYYY>-<MM>-<DD>T<HH>:<MM>:<SS>[+-]<TZHH>:<TZMM>
。
--default-downtime
,但不能同时使用 --downscale-period
两者。DOWNSCALE_PERIOD="Mon-Sun 19:00-20:00 Europe/Berlin"
--dry-run
仅运行模式:不更改任何内容,只需打印将要执行的操作 --debug
调试模式:打印更多信息 --once
仅运行一次循环并退出 --interval
循环间隔(默认:30 秒) --namespace
将downscaler限制为仅在单个命名空间(默认:所有命名空间)中工作。这主要适用于 kube-downscaler 的部署者只能访问给定命名空间(而不是集群访问权限)的部署场景。如果与 同时 --exclude-namespaces
使用 ,则不应用任何应用。--include-resources
将此类资源缩小为逗号分隔列表。 --grace-period
新部署在缩减部署之前的宽限期(以秒为单位)(默认值:15 分钟)。宽限期从创建部署时开始计算,即无论宽限期如何,更新的部署都将立即缩减。 --upscale-period
仅在给定时间段内纵向扩展的替代逻辑(默认:从不),也可以通过环境变量 UPSCALE_PERIOD
或通过每个部署downscaler/upscale-period
上的注释进行配置--downscale-period
仅在给定时间段内缩减的替代逻辑(默认:从不),也可以通过环境变量 DOWNSCALE_PERIOD
或通过每个部署downscaler/downscale-period
上的注释进行配置--default-uptime
要纵向扩展的默认时间范围(默认:始终),也可以通过环境变量 DEFAULT_UPTIME
或通过每个部署downscaler/uptime
上的注释进行配置--default-downtime
要缩减的默认时间范围(默认:从不),也可以通过环境变量 DEFAULT_DOWNTIME
或通过每个部署downscaler/downtime
上的注释进行配置--exclude-namespaces
从降级中排除命名空间(正则表达式模式列表,默认:kube-system),也可以通过环境变量 EXCLUDE_NAMESPACES
进行配置。如果与 同时--namespace
使用 ,则不应用任何应用。--exclude-deployments
从降级中排除特定部署/状态集/cronjobs(默认:kube-downscaler,downscaler),也可以通过环境变量 EXCLUDE_DEPLOYMENTS
进行配置。尽管名称如此,但此选项将与任何包含的资源类型(Deployment,StatefulSet,CronJob等)的名称匹配。--downtime-replicas
缩小到的副本的默认值,注释 downscaler/downtime-replicas
优先于此值。--deployment-time-annotation
可选:将使用的注释的名称,而不是资源的创建时间戳。如果您希望资源在部署后的宽限期 ( --grace-period
) 内保持纵向扩展,则应使用此选项。注释的时间戳值的格式必须与 Kubernetes 的格式完全相同:creationTimestamp
%Y-%m-%dT%H:%M:%SZ
。建议:通过部署工具自动设置此批注。--matching-labels
可选:kube-downscaleer 范围涵盖的工作负载标签列表。标签与列表中的任何工作负载都不匹配的所有工作负载都将被忽略。为了向后兼容,如果未指定此参数,kube-downscaler 将应用于所有资源。
DEFAULT_UPTIME
、 DEFAULT_DOWNTIME
和 FORCE_UPTIME
排除也可以使用命名空间注释进行配置。在配置的情况下,这些值将取代其他全局默认值。apiVersion: v1
kind: Namespace
metadata:
name: foo
labels:
name: foo
annotations:
Mon-Sun 07:30-18:00 CET :
downscaler/upscale-period
downscaler/downscale-period
downscaler/uptime
:为此命名空间中的所有资源设置“正常运行时间”downscaler/downtime
:为此命名空间中的所有资源设置“停机时间”downscaler/force-downtime
:强制缩减此命名空间中的所有资源 - 可以是true
/false
downscaler/force-uptime
:强制向上扩展此命名空间中的所有资源 - 可以是true
/false
downscaler/exclude
:设置为 以true
排除命名空间中的所有资源downscaler/exclude-until
:暂时排除命名空间中的所有资源,直到给定的时间戳downscaler/downtime-replicas
:覆盖默认目标副本以缩小到(默认值:零)
使用案例
建议
结论
推荐阅读
推荐视频
微信扫码关注该文公众号作者