This adapter contains an implementation of external metrics API. It is therefore suitable for use with the autoscaling/v2 Horizontal Pod Autoscaler in Kubernetes 1.9+.
git clone git@github.com:apache/skywalking-swck.git
Edit file adapter/config/adapter/kustomization.yaml file to change your preferences. If you prefer to your private docker image, a quick path to override ADAPTER_IMG environment variable : export ADAPTER_IMG=<private registry>/metrics-adapter:<tag>
Use make to generate the final manifests and deploy:
make -C adapter deploy
The adapter takes the standard Kubernetes generic API server arguments (including those for authentication and authorization). By default, it will attempt to using Kubernetes in-cluster config to connect to the cluster.
It takes the following addition arguments specific to configuring how the adapter talks to SkyWalking OAP cluster:
--oap-addr The address of OAP cluster.--metric-filter-regex A regular expression to filter metrics retrieved from OAP cluster.--refresh-interval This is the interval at which to update the cache of available metrics from OAP cluster.--namespace A prefix to which metrics are appended. The format is ‘namespace|metric_name’, defaults to skywalking.apache.orgExternal metrics allow you to autoscale your cluster based on any metric available in OAP cluster. Just provide a metric block with a name and selector, and use the External metric type.
- type: External external: metric: name: <metric_name> selector: matchLabels: <label_key>: <label_value> ... target: ....
label_key is the entity name of skywalking metrics. if the label value contains special characters more than ., - and _, service.str.<number> represent the literal of label value, and service.byte.<number> could encode these special characters to hex bytes.Supposing the service name is v1|productpage|bookinfo|demo, the matchLabels should be like the below piece:
matchLabels: "service.str.0": "v1" "service.byte.1": "7c" // the hex byte of "|" "service.str.2": "productpage" "service.byte.3": "7c" "service.str.4": "bookinfo" "service.byte.5": "7c" "service.str.6": "demo"
Caveats:
bytelabel only accept a single character. That means||should be transformed toservice.byte.0:"7c"andservice.byte.1:"7c"instead ofservice.byte.0:"7c7c"
The options of label keys are:
service, service.str.<number> or service.byte.<number> The name of the service.instance, instance.str.<number> or instance.byte.<number> The name of the service instance.endpoint, endpoint.str.<number> or endpoint.byte.<number> The name of the endpoint.label, label.str.<number> or label.byte.<number> is optional, The labels you need to query, used for querying multi-labels metrics. Unlike swctl, this key only supports a single label due to the specification of the custom metrics API.For example, if your application name is front_gateway, you could add the following section to your HorizontalPodAutoscaler manifest to specify that you need less than 80ms of 90th latency.
- type: External external: metric: name: skywalking.apache.org|service_percentile selector: matchLabels: service: front_gateway # The index of [P50, P75, P90, P95, P99]. 2 is the index of P90(90%) label: "2" target: type: Value value: 80
If the service is v1|productpage|bookinfo|demo|-:
- type: External external: metric: name: skywalking.apache.org|service_cpm selector: matchLabels: "service.str.0": "v1" "service.byte.1": "7c" "service.str.2": "productpage" "service.byte.3": "7c" "service.str.4": "bookinfo" "service.byte.5": "7c" "service.str.6": "demo" "service.byte.7": "7c" "service.byte.8": "2d" target: type: Value value: 80