介紹
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 如果滿足以下所有條件,將縮減部署的副本:
- 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" )。
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 部署,即
- 如果當前時間不在 ,它不會立即縮小 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 將其升級。
若要使用 在 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'
每個時間規范可以采用以下兩種格式之一:
- 重復規范格式 <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> 。
基于periods的替代邏輯
您可以選擇升級或縮減的時間段,而不是嚴格的正常運行時間或停機時間。時間定義是相同的。在這種情況下,放大或縮小只發生在時間段,其余時間將被忽略。
如果配置了升級或縮減周期,將忽略正常運行時間和停機時間。這意味著某些選項是互斥的,例如,您可以使用或 --default-downtime ,但不能同時使用 --downscale-period 兩者。
此定義將在 19:00 到 20:00 之間縮減群集。如果手動升級集群,則在第二天 19:00-20:00 之前不會縮減集群。
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 將應用于所有資源。
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 :為此命名空間中的所有資源設置“正常運行時間”。
- downscaler/downtime :為此命名空間中的所有資源設置“停機時間”。
- downscaler/force-downtime :強制縮減此命名空間中的所有資源 - 可以是 true / false。
- downscaler/force-uptime :強制向上擴展此命名空間中的所有資源 - 可以是 true / false。
- downscaler/exclude :設置為 以 true 排除命名空間中的所有資源。
- downscaler/exclude-until :暫時排除命名空間中的所有資源,直到給定的時間戳。
- downscaler/downtime-replicas :覆蓋默認目標副本以縮小到(默認值:零)。
使用案例
該工具的主要用例是通過優化 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 這樣的替代解決方案。