mirror of
https://github.com/kubernetes-sigs/prometheus-adapter.git
synced 2026-04-05 17:27:51 +00:00
84 lines
3.2 KiB
Markdown
84 lines
3.2 KiB
Markdown
External Metrics
|
|
===========
|
|
|
|
It's possible to configure [Autoscaling on metrics not related to Kubernetes objects](https://kubernetes.io/docs/tasks/run-application/horizontal-pod-autoscale-walkthrough/#autoscaling-on-metrics-not-related-to-kubernetes-objects) in Kubernetes. This is done with a special `External Metrics` system. Using external metrics in Kubernetes with the adapter requires you to configure special `external` rules in the configuration.
|
|
|
|
The configuration for `external` metrics rules is almost identical to the normal `rules`:
|
|
|
|
```yaml
|
|
externalRules:
|
|
- seriesQuery: '{__name__="queue_consumer_lag",name!=""}'
|
|
metricsQuery: sum(<<.Series>>{<<.LabelMatchers>>}) by (name)
|
|
resources:
|
|
overrides: { namespace: {resource: "namespace"} }
|
|
```
|
|
|
|
Namespacing
|
|
-----------
|
|
|
|
All Kubernetes Horizontal Pod Autoscaler (HPA) resources are namespaced. And when you create an HPA that
|
|
references an external metric the adapter will automatically add a `namespace` label to the `seriesQuery` you have configured.
|
|
|
|
This is done because the External Merics API Specification *requires* a namespace component in the URL:
|
|
|
|
```shell
|
|
kubectl get --raw "/apis/external.metrics.k8s.io/v1beta1/namespaces/default/queue_consumer_lag"
|
|
```
|
|
|
|
Cross-Namespace or No Namespace Queries
|
|
---------------------------------------
|
|
|
|
A semi-common scenario is to have a `workload` in one namespace that needs to scale based on a metric from a different namespace. This is normally not
|
|
possible with `external` rules because the `namespace` label is set to match that of the source `workload`.
|
|
|
|
However, you can explicitly disable the automatic add of the HPA namepace to the query, and instead opt to not set a namespace at all, or to target a different namespace.
|
|
|
|
This is done by setting `namespaced: false` in the `resources` section of the `external` rule:
|
|
|
|
```yaml
|
|
# rules: ...
|
|
|
|
externalRules:
|
|
- seriesQuery: '{__name__="queue_depth",name!=""}'
|
|
metricsQuery: sum(<<.Series>>{<<.LabelMatchers>>}) by (name)
|
|
resources:
|
|
namespaced: false
|
|
```
|
|
|
|
Given the `external` rules defined above any `External` metric query for `queue_depth` will simply ignore the source `namespace` of the HPA. This allows you to explicilty not put a namespace into an external query, or to set the namespace to one that might be different from that of the HPA.
|
|
|
|
```yaml
|
|
apiVersion: autoscaling/v1
|
|
kind: HorizontalPodAutoscaler
|
|
metadata:
|
|
name: external-queue-scaler
|
|
# the HPA and scaleTargetRef must exist in a namespace
|
|
namespace: default
|
|
annotations:
|
|
# The "External" metric below targets a metricName that has namespaced=false
|
|
# and this allows the metric to explicitly query a different
|
|
# namespace than that of the HPA and scaleTargetRef
|
|
autoscaling.alpha.kubernetes.io/metrics: |
|
|
[
|
|
{
|
|
"type": "External",
|
|
"external": {
|
|
"metricName": "queue_depth",
|
|
"metricSelector": {
|
|
"matchLabels": {
|
|
"namespace": "queue",
|
|
"name": "my-sample-queue"
|
|
}
|
|
},
|
|
"targetAverageValue": "50"
|
|
}
|
|
}
|
|
]
|
|
spec:
|
|
maxReplicas: 5
|
|
minReplicas: 1
|
|
scaleTargetRef:
|
|
apiVersion: apps/v1
|
|
kind: Deployment
|
|
name: my-app
|
|
```
|