使用 kube-downscaler 降低 Kubernetes 集群成本
介紹
Kube-downscaler 是一款開源工具,允許用戶定義 Kubernetes 中 pod 資源自動縮減的時間。這有助于通過減少非高峰時段的資源使用量來降低基礎(chǔ)設(shè)施成本。
在本文中,我們將詳細介紹 kube-downscaler 的功能、安裝和配置,以及它的用例和未來前景。
kube-downscaler的特點
Kube-downscaler 是一款基于調(diào)度的強大工具,用于在 Kubernetes 集群中對應(yīng)用程序進行升級或降級。在本節(jié)中,我們將探討該工具的一些關(guān)鍵功能:
與Kubernetes功能或工具的兼容性
Kube-downscaler 還支持水平 Pod 自動縮放 (HPA),并可以與 HPA 結(jié)合使用,以確保為應(yīng)用程序維護所需的副本數(shù)量。這使得 kube-downscaler 能夠為 Kubernetes 中的應(yīng)用程序擴展提供額外的靈活性和細粒度的控制。
Karpenter 和 kube-downscaler 是兩個可以結(jié)合使用的工具,可以為 Kubernetes 集群提供完整且強大的資源管理解決方案。通過結(jié)合使用 Karpenter 和 kube-downscaler,Kubernetes 集群可以從水平和垂直擴展中受益。 Downscaler 允許減少 Pod 數(shù)量,而 Karpenter 通過將 Pod 整合到更少或不同類型的機器上來優(yōu)化節(jié)點利用率。
根據(jù)定義的時間段自動擴展部署副本
Kube-downscaler 可以根據(jù)預(yù)定義的時間段自動擴展部署副本。這意味著我們可以設(shè)置一個計劃,在一天、一周或一個月的特定時間增加或減少副本數(shù)量。
比如,如果我們知道應(yīng)用程序在一天中的某些時段遇到高流量,則可以將 kube-downscaler 配置為在這些時段自動擴展副本,然后在流量減少時縮小副本。
這可以允許在預(yù)期峰值負載的情況下進行擴展,而不是等待峰值負載發(fā)生并由 HPA 處理。這可以幫助優(yōu)化資源使用并確保您的應(yīng)用程序始終可用且響應(yīng)迅速。
但是 Kube-downscaler 主要用于縮小副本并優(yōu)化集群的成本,我們通常使用 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 文件以根據(jù)您的具體需求自定義配置。例如,可以調(diào)整時區(qū)、計劃和縮放規(guī)則。
將配置應(yīng)用到您的 Kubernetes 集群:
kubectl apply -f deploy/
此命令將部署 kube-downscaler 控制器并創(chuàng)建 kube-downscaler 部署。
可以通過檢查 kube-downscaler 部署的日志來驗證 kube-downscaler 控制器是否正在運行:
kubectl logs -f deployment/kube-downscaler
安裝完成后,需要進行一下配置。
根據(jù)具體用戶需求配置kube-downscaler
Kube-downscaler 通過在 Kubernetes 部署對象上使用注釋來提供擴展計劃的定制。
部署對象中的 downTimePeriod注釋可用于指定不應(yīng)擴展部署的停機時間段。
minReplicas 注釋可用于設(shè)置部署的最小副本數(shù)。
這些字段與 kube-downscaler 注釋結(jié)合使用,允許您根據(jù)特定的業(yè)務(wù)需求和資源利用模式創(chuàng)建自定義的擴展計劃。
通過調(diào)整這些字段,可以配置 kube-downscaler 以優(yōu)化應(yīng)用程序可用性和成本效率的方式擴展部署。
以下是使用 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 點(在歐洲/柏林時間線上),副本數(shù)量將減少到 1 個。
kube-downscaler 將根據(jù)定義的計劃自動開始縮減 pod。
目前我們已經(jīng)在 Kubernetes 集群上安裝并運行了 kube-downscaler。
算法
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 參數(shù)。
- --downscale-period 或 --default-downtime CLI 參數(shù)。
- UPSCALE_PERIOD 或 DEFAULT_UPTIME 環(huán)境變量。
- DOWNSCALE_PERIOD 或 DEFAULT_DOWNTIME 環(huán)境變量。
- 工作負載的命名空間不是排除列表的一部分:
- 如果提供排除列表,它將用于代替默認值(僅包括kube-system )。
- 工作負載的標(biāo)簽與標(biāo)簽列表不匹配。
- 工作負載的名稱不是排除列表的一部分。
- 工作負載未標(biāo)記為排除(注釋 downscaler/exclude: "true" 或 downscaler/exclude-until: "2024-04-05")。
- 沒有活動 Pod 強制整個集群進入正常運行時間(注釋 downscaler/force-uptime: "true" )。
Minimum replicas最小副本數(shù)
默認情況下,部署將縮減為零副本。這可以通過部署或其命名空間的注釋進行配置, downscaler/downtime-replicas 也可以通過 CLI 使用 --downtime-replicas 。
Ex: downscaler/downtime-replicas: "1"。
Specific workload特定工作負載
在正常的情況下 HorizontalPodAutoscalers ,該字段不能設(shè)置為零, 因此downscaler/downtime-replicas 至少 1 應(yīng)設(shè)置為 。 關(guān)于 CronJobs ,它們的狀態(tài)將按照我們的預(yù)期進行定義 suspend: true 。
注意點
請注意,默認的寬限期為 15 分鐘適用于新的 nginx 部署,即
- 如果當(dāng)前時間不在 ,它不會立即縮小 Mon-Fri 9-17 (Buenos Aires timezone) ,而是在 15 分鐘后縮小。downscaler最終會記錄如下內(nèi)容:
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 個副本,則應(yīng)在 上 Deployment 應(yīng)用注釋。這是一種特殊情況,因為 minReplicas 不允許在 HPA 上為 0。將部署副本設(shè)置為 0 實質(zhì)上會禁用 HPA。在這種情況下,HPA 將發(fā)出事件,例如 failed to get memory utilization: unable to get metrics for resource memory: no metrics returned from resource metrics API 沒有 Pod 可以從中檢索指標(biāo)。
- 如果需要縮小大于 0,則應(yīng)在 HPA 上應(yīng)用注釋。這允許在停機期間根據(jù)外部流量動態(tài)擴展 Pod,并在停機期間保持較低的 minReplicas 流量,如果沒有低流量。如果對部署而不是 HPA 進行批注,則會導(dǎo)致爭用條件,即縮減部署, kube-downscaler HPA 在部署更高時 minReplicas 將其升級。
若要使用 在 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通過命令行參數(shù)、環(huán)境變量或 Kubernetes 注釋進行配置。
時間定義(例如 DEFAULT_UPTIME )接受以逗號分隔的規(guī)范列表,例如,以下配置將縮小非工作時間的所有部署:
DEFAULT_UPTIME="Mon-Fri 07:30-20:30 Europe/Berlin"
僅在周末和周五 20:00 后縮?。?/span>
DEFAULT_DOWNTIME="Sat-Sun 00:00-24:00 CET,Fri-Fri 20:00-24:00 CET'
每個時間規(guī)范可以采用以下兩種格式之一:
- 重復(fù)規(guī)范格式 <WEEKDAY-FROM>-<WEEKDAY-TO-INCLUSIVE> <HH>:<MM>-<HH>:<MM> <TIMEZONE> .時區(qū)值可以是任何時區(qū),例如“US/Eastern”、“PST”或“UTC”。
- 絕對規(guī)范格式, <TIME_FROM>-<TIME_TO> 其中每個 <TIME> 格式都是ISO 8601日期和時間的格式 <YYYY>-<MM>-<DD>T<HH>:<MM>:<SS>[+-]<TZHH>:<TZMM> 。
基于periods的替代邏輯
您可以選擇升級或縮減的時間段,而不是嚴格的正常運行時間或停機時間。時間定義是相同的。在這種情況下,放大或縮小只發(fā)生在時間段,其余時間將被忽略。
如果配置了升級或縮減周期,將忽略正常運行時間和停機時間。這意味著某些選項是互斥的,例如,您可以使用或 --default-downtime ,但不能同時使用 --downscale-period 兩者。
此定義將在 19:00 到 20:00 之間縮減群集。如果手動升級集群,則在第二天 19:00-20:00 之前不會縮減集群。
DOWNSCALE_PERIOD="Mon-Sun 19:00-20:00 Europe/Berlin"
命令行選項
可用的命令行選項:
- --dry-run僅運行模式:不更改任何內(nèi)容,只需打印將要執(zhí)行的操作
- --debug調(diào)試模式:打印更多信息
- --once僅運行一次循環(huán)并退出
- --interval循環(huán)間隔(默認:30 秒)
- --namespace將downscaler限制為僅在單個命名空間(默認:所有命名空間)中工作。這主要適用于 kube-downscaler 的部署者只能訪問給定命名空間(而不是集群訪問權(quán)限)的部署場景。如果與 同時 --exclude-namespaces使用 ,則不應(yīng)用任何應(yīng)用。
- --include-resources將此類資源縮小為逗號分隔列表。
- --grace-period新部署在縮減部署之前的寬限期(以秒為單位)(默認值:15 分鐘)。寬限期從創(chuàng)建部署時開始計算,即無論寬限期如何,更新的部署都將立即縮減。
- --upscale-period僅在給定時間段內(nèi)縱向擴展的替代邏輯(默認:從不),也可以通過環(huán)境變量 UPSCALE_PERIOD 或通過每個部署 downscaler/upscale-period 上的注釋進行配置
- --downscale-period僅在給定時間段內(nèi)縮減的替代邏輯(默認:從不),也可以通過環(huán)境變量 DOWNSCALE_PERIOD 或通過每個部署 downscaler/downscale-period 上的注釋進行配置
- --default-uptime要縱向擴展的默認時間范圍(默認:始終),也可以通過環(huán)境變量 DEFAULT_UPTIME 或通過每個部署 downscaler/uptime 上的注釋進行配置
- --default-downtime要縮減的默認時間范圍(默認:從不),也可以通過環(huán)境變量 DEFAULT_DOWNTIME 或通過每個部署 downscaler/downtime 上的注釋進行配置
- --exclude-namespaces從降級中排除命名空間(正則表達式模式列表,默認:kube-system),也可以通過環(huán)境變量 EXCLUDE_NAMESPACES 進行配置。如果與 同時 --namespace 使用 ,則不應(yīng)用任何應(yīng)用。
- --exclude-deployments從降級中排除特定部署/狀態(tài)集/cronjobs(默認:kube-downscaler,downscaler),也可以通過環(huán)境變量 EXCLUDE_DEPLOYMENTS 進行配置。盡管名稱如此,但此選項將與任何包含的資源類型(Deployment,StatefulSet,CronJob等)的名稱匹配。
- --downtime-replicas縮小到的副本的默認值,注釋 downscaler/downtime-replicas 優(yōu)先于此值。
- --deployment-time-annotation可選:將使用的注釋的名稱,而不是資源的創(chuàng)建時間戳。如果您希望資源在部署后的寬限期 ( --grace-period ) 內(nèi)保持縱向擴展,則應(yīng)使用此選項。注釋的時間戳值的格式必須與 Kubernetes 的格式完全相同: creationTimestamp %Y-%m-%dT%H:%M:%SZ 。建議:通過部署工具自動設(shè)置此批注。
- --matching-labels可選:kube-downscaleer 范圍涵蓋的工作負載標(biāo)簽列表。標(biāo)簽與列表中的任何工作負載都不匹配的所有工作負載都將被忽略。為了向后兼容,如果未指定此參數(shù),kube-downscaler 將應(yīng)用于所有資源。
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
命名空間級別支持以下批注:
- downscaler/upscale-period。
- downscaler/downscale-period。
- downscaler/uptime :為此命名空間中的所有資源設(shè)置“正常運行時間”。
- downscaler/downtime :為此命名空間中的所有資源設(shè)置“停機時間”。
- downscaler/force-downtime :強制縮減此命名空間中的所有資源 - 可以是 true / false。
- downscaler/force-uptime :強制向上擴展此命名空間中的所有資源 - 可以是 true / false。
- downscaler/exclude :設(shè)置為 以 true 排除命名空間中的所有資源。
- downscaler/exclude-until :暫時排除命名空間中的所有資源,直到給定的時間戳。
- downscaler/downtime-replicas :覆蓋默認目標(biāo)副本以縮小到(默認值:零)。
使用案例
該工具的主要用例是通過優(yōu)化 Kubernetes 集群資源的利用率來降低成本。不過,它也可以用來預(yù)熱集群,避免過度依賴 HPA。
雖然這不是其主要目的,但這種組合提供了一種替代解決方案,可確保應(yīng)用程序的高可用性,同時最大限度地降低基礎(chǔ)設(shè)施成本。
降低成本
kube-downscaler 的另一個用例是防止高峰使用期間的服務(wù)中斷。通過定義在高需求期間擴展資源的計劃,kube-downscaler 可以幫助預(yù)先擴展部署并避免 HPA 延遲,以確保應(yīng)用程序即使在高峰使用期間也保持可用和響應(yīng)。
服務(wù)中斷預(yù)防
kube-downscaler 的另一個用例是防止高峰使用期間的服務(wù)中斷。通過定義在高需求期間擴展資源的計劃,kube-downscaler 可以幫助預(yù)先擴展部署并避免 HPA 延遲,以確保應(yīng)用程序即使在高峰使用期間也保持可用和響應(yīng)。
建議
基于預(yù)定義計劃的擴展,這可能并不適合所有用例。此外,它不支持自動縮放,這意味著用戶必須手動調(diào)整縮放計劃以滿足不斷變化的需求。
另一種可供考慮的解決方案是 Keda。 Keda是一個開源項目,為Kubernetes應(yīng)用程序提供動態(tài)自動伸縮功能。使用 Keda,用戶可以根據(jù)各種指標(biāo)(例如隊列長度、CPU 使用率或自定義指標(biāo))設(shè)置自定義擴展規(guī)則。
這允許對資源使用進行更精細的控制,并確保應(yīng)用程序始終能夠正確擴展以滿足需求。
此外,Keda 兼容廣泛的 Kubernetes 應(yīng)用程序,包括有狀態(tài)和無狀態(tài)應(yīng)用程序,并支持多種事件源,例如 Azure Event Hubs、Kafka 和 RabbitMQ。
結(jié)論
Kube-downscaler 是管理 Kubernetes 集群中資源使用情況的強大工具。通過定義擴展計劃,用戶可以優(yōu)化集群中的資源使用并降低成本,同時確保應(yīng)用程序即使在高峰使用期間也保持可用和響應(yīng)。
雖然 kube-downscaler 是管理 Kubernetes 集群中資源使用情況的一個有價值的工具,但它可能有一些限制。如果需要對資源擴展進行更精細的控制或需要自動擴展功能,那么可能值得考慮像 Keda 這樣的替代解決方案。