通过crand与原生prometheus-adapter实现ehpa扩缩功能
What type of PR is this?
通过crond的metric采集ehpa指标,解耦metric-adapter,实现与原生prometheus-adapter的兼容
使用示例
APIservice调整
将external的apiservice调整为原生的prometheus-adapter
apiVersion: apiregistration.k8s.io/v1
kind: APIService
metadata:
name: v1beta1.external.metrics.k8s.io
spec:
group: external.metrics.k8s.io
groupPriorityMinimum: 100
insecureSkipTLSVerify: true
service:
name: prometheus-adapter
namespace: default
port: 443
version: v1beta1
versionPriority: 100
craned指标查询
# curl -sL 10.244.0.134:8080/metrics | grep ^crane | grep -E "cron|predi"| grep -v ^#
crane_cron_external{resourceIdentifier="cron",targetKind="Deployment",targetName="project-test",targetNamespace="test"} 7 1660202258972
crane_prediction_time_series_prediction_external{algorithm="dsp",resourceIdentifier="server_picker",targetKind="Deployment",targetName="project-test",targetNamespace="test",type="ExpressionQuery"} 124.85 1660202265000
crane_prediction_time_series_prediction_external_with_window{algorithm="dsp",resourceIdentifier="server_picker",targetKind="Deployment",targetName="project-test",targetNamespace="test",type="ExpressionQuery"} 140.5433349609375 1660202258972
crane_prediction_time_series_prediction_resource{algorithm="dsp",resource="cpu",resourceIdentifier="cpu",targetKind="Deployment",targetName="project-test",targetNamespace="test",type="ResourceQuery"} 3.79116 1660202265000
crane_prediction_time_series_prediction_resource_with_window{algorithm="dsp",resource="cpu",resourceIdentifier="cpu",targetKind="Deployment",targetName="project-test",targetNamespace="test",type="ResourceQuery"} 4.085559844970703 1660202258972
注:server_picker为原始external指标
- crane_cron_external定义cron类型定时扩容指标
- crane_prediction_time_series_prediction_resource_with_window定义resource类型预测指标
- crane_prediction_time_series_prediction_external_with_window定义external类型预测指标
prometheus-adapter配置示例
apiVersion: v1
data:
config.yaml: |
externalRules:
- seriesQuery: '{__name__="server_picker",pod_name!=""}'
metricsQuery: 'sum by(node, route)(rate(<<.Series>>{<<.LabelMatchers>>}[1m]))'
resources:
namespaced: false
- seriesQuery: '{__name__="crane_cron_external",pod_name!=""}'
metricsQuery: 'max(<<.Series>>{<<.LabelMatchers>>})'
resources:
namespaced: false
- seriesQuery: '{__name__="crane_prediction_time_series_prediction_resource_with_window",pod_name!=""}'
metricsQuery: 'max(<<.Series>>{<<.LabelMatchers>>})'
resources:
namespaced: false
- seriesQuery: '{__name__="crane_prediction_time_series_prediction_external_with_window",pod_name!=""}'
metricsQuery: 'max(<<.Series>>{<<.LabelMatchers>>})'
resources:
namespaced: false
EHPA配置示例
apiVersion: autoscaling.crane.io/v1alpha1
kind: EffectiveHorizontalPodAutoscaler
metadata:
name: project-test
namespace: test
annotations:
metric-query.autoscaling.crane.io/server_picker: |
sum by(node, route)(rate(server_picker{node="test",name="server_picker"}[1m]))
spec:
behavior:
scaleDown:
stabilizationWindowSeconds: 660
policies:
- type: Percent
value: 100
periodSeconds: 15
scaleUp:
stabilizationWindowSeconds: 0
policies:
- type: Percent
value: 100
periodSeconds: 15
- type: Pods
value: 10
periodSeconds: 15
selectPolicy: Max
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: project-test
minReplicas: 3
maxReplicas: 25
scaleStrategy: Preview
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 60
- type: External
external:
metric:
name: server_picker
selector:
matchLabels:
node: "test"
name: "server_picker"
target:
averageValue: 10
type: AverageValue
crons:
- name: "cron1"
description: "scale up"
start: "0 * * * *"
end: "5 * * * *"
targetReplicas: 4
prediction:
predictionWindowSeconds: 600
predictionAlgorithm:
algorithmType: dsp
dsp:
estimators:
fft:
- marginFraction: "0.1"
minNumOfSpectrumItems: 2
lowAmplitudeThreshold: "0.2"
highFrequencyThreshold: "6.0"
sampleInterval: "15s"
historyLength: "16d"
应用该yaml后,将自动生成以ehpa前缀的hpa以及tsp[ehpa-project-test] 注:annotations部分需与metric.External.Name相同,改部分作为tsp模型的数据源,需与prometheus-adapter中对应指标语句相同 此配置示例中开启了cron以及prediction,prediction部分metric配置将生成相应tsp指标
TSP查看
kubectl -n test get tsp ehpa-project-test -o yaml
apiVersion: prediction.crane.io/v1alpha1
kind: TimeSeriesPrediction
metadata:
spec:
predictionMetrics:
- algorithm:
resourceIdentifier: cpu
resourceQuery: cpu
type: ResourceQuery
- algorithm:
expressionQuery:
expression: |
sum by(node, route)(rate(erver_picker{node="test",name="server_picker"}[1m]))
resourceIdentifier: server_picker
type: ExpressionQuery
predictionWindowSeconds: 600
resourceIdentifier值为ehpa中相应metric.Name 注:该值将作为预测指标的matchLabel,实现预测指标匹配
查看hpa状态
# kubectl -n test describe hpa ehpa-project-test
Name: ehpa-project-test
Namespace: test
Labels: app.kubernetes.io/managed-by=effective-hpa-controller
autoscaling.crane.io/effective-hpa-uid=c3783ed1-0d0e-45f8-af52-94c0771f766c
Annotations: <none>
CreationTimestamp: Thu, 11 Aug 2022 15:07:23 +0800
Reference: Substitute/ehpa-project-test
Metrics: ( current / target )
"server_picker" (target average value): 5251m / 10
"crane_prediction_time_series_prediction_resource_with_window" (target average value): 162m / 300m
"crane_prediction_time_series_prediction_external_with_window" (target average value): 5715m / 10
"crane_cron_external" (target average value): 200m / 1
resource cpu on pods (as a percentage of request): 29% (147m) / 60%
Min replicas: 3
Max replicas: 25
此时可以看到hpa共有五个指标
- "server_picker" #基础外部指标
- "crane_prediction_time_series_prediction_resource_with_window" #resource类型预测指标
- "crane_prediction_time_series_prediction_external_with_window" #external类型预测指标
- "crane_cron_external" #cron计划任务指标
- resource cpu on pods #基础cpu指标
查看hpa配置
# kubectl get HorizontalPodAutoscaler.v2beta2.autoscaling -ntest ehpa-project-test -o yaml
相应指标如下,通过prometheus-adapter获取
- external:
metric:
name: crane_prediction_time_series_prediction_resource_with_window
selector:
matchLabels:
resourceIdentifier: cpu
targetKind: Deployment
targetName: project-test
targetNamespace: test
target:
averageValue: 300m
type: AverageValue
type: External
- external:
metric:
name: crane_prediction_time_series_prediction_external_with_window
selector:
matchLabels:
resourceIdentifier: server_picker
targetKind: Deployment
targetName: project-test
targetNamespace: test
target:
averageValue: "10"
type: AverageValue
type: External
- external:
metric:
name: crane_cron_external
selector:
matchLabels:
resourceIdentifier: cron
targetKind: Deployment
targetName: project-test
targetNamespace: test
target:
averageValue: "1"
type: AverageValue
type: External
结束
🎉 Successfully Build Images. Now Support ARM Platforms. Comment Post Time: 2022-08-16 15:56 Git Version: 55b0802
Docker Registry
Overview: https://hub.docker.com/u/gocrane
| Image | Pull Command |
|---|---|
| crane-agent:pr-469-55b0802 | docker pull gocrane/crane-agent:pr-469-55b0802 |
| dashboard:pr-469-55b0802 | docker pull gocrane/dashboard:pr-469-55b0802 |
| metric-adapter:pr-469-55b0802 | docker pull gocrane/metric-adapter:pr-469-55b0802 |
| craned:pr-469-55b0802 | docker pull gocrane/craned:pr-469-55b0802 |
Quick Deploy - Helm
helm repo add crane https://finops-helm.pkg.coding.net/gocrane/gocrane
helm install crane -n crane-system --create-namespace \
--set craned.image.repository=gocrane/craned \
--set craned.image.tag=pr-469-55b0802 \
--set metricAdapter.image.repository=gocrane/metric-adapter \
--set metricAdapter.image.tag=pr-469-55b0802 \
--set craneAgent.image.repository=gocrane/crane-agent \
--set craneAgent.image.tag=pr-469-55b0802 \
--set cranedDashboard.image.repository=gocrane/dashboard \
--set cranedDashboard.image.tag=pr-469-55b0802 crane/crane
Coding Registry
Overview: https://finops.coding.net/public-artifacts/gocrane/crane/packages
| Image | Pull Command |
|---|---|
| crane-agent:pr-469-55b0802 | docker pull finops-docker.pkg.coding.net/gocrane/crane/crane-agent:pr-469-55b0802 |
| dashboard:pr-469-55b0802 | docker pull finops-docker.pkg.coding.net/gocrane/crane/dashboard:pr-469-55b0802 |
| metric-adapter:pr-469-55b0802 | docker pull finops-docker.pkg.coding.net/gocrane/crane/metric-adapter:pr-469-55b0802 |
| craned:pr-469-55b0802 | docker pull finops-docker.pkg.coding.net/gocrane/crane/craned:pr-469-55b0802 |
Quick Deploy - Helm
helm repo add crane https://finops-helm.pkg.coding.net/gocrane/gocrane
helm install crane -n crane-system --create-namespace \
--set craned.image.repository=finops-docker.pkg.coding.net/gocrane/crane/craned \
--set craned.image.tag=pr-469-55b0802 \
--set metricAdapter.image.repository=finops-docker.pkg.coding.net/gocrane/crane/metric-adapter \
--set metricAdapter.image.tag=pr-469-55b0802 \
--set craneAgent.image.repository=finops-docker.pkg.coding.net/gocrane/crane/crane-agent \
--set craneAgent.image.tag=pr-469-55b0802 \
--set cranedDashboard.image.repository=finops-docker.pkg.coding.net/gocrane/crane/dashboard \
--set cranedDashboard.image.tag=pr-469-55b0802 crane/crane
Ghcr Registry
Overview: https://github.com/orgs/gocrane/packages?repo_name=crane
| Image | Pull Command |
|---|---|
| crane-agent:pr-469-55b0802 | docker pull ghcr.io/gocrane/crane/crane-agent:pr-469-55b0802 |
| dashboard:pr-469-55b0802 | docker pull ghcr.io/gocrane/crane/dashboard:pr-469-55b0802 |
| metric-adapter:pr-469-55b0802 | docker pull ghcr.io/gocrane/crane/metric-adapter:pr-469-55b0802 |
| craned:pr-469-55b0802 | docker pull ghcr.io/gocrane/crane/craned:pr-469-55b0802 |
Quick Deploy - Helm
helm repo add crane https://finops-helm.pkg.coding.net/gocrane/gocrane
helm install crane -n crane-system --create-namespace \
--set craned.image.repository=ghcr.io/gocrane/crane/craned \
--set craned.image.tag=pr-469-55b0802 \
--set metricAdapter.image.repository=ghcr.io/gocrane/crane/metric-adapter \
--set metricAdapter.image.tag=pr-469-55b0802 \
--set craneAgent.image.repository=ghcr.io/gocrane/crane/crane-agent \
--set craneAgent.image.tag=pr-469-55b0802 \
--set cranedDashboard.image.repository=ghcr.io/gocrane/crane/dashboard \
--set cranedDashboard.image.tag=pr-469-55b0802 crane/crane
#issue_id:https://github.com/gocrane/crane/issues/474