问题
Problem setting. Suppose I have 2 pods, A and B. I want to be able to dynamically scale pod A based on some arbitrary number from some arbitrary source. Suppose that pod B is such a source: for example, it can have an HTTP server with an endpoint which responds with the number of desired replicas of pod A at the moment of request. Or maybe it is an ES server or a SQL DB (does not matter).
Question. What kubernetes objects do I need to define to achieve this (apart from HPA)? What configuration should HPA have to know that it needs to look up B for current metric? How should API of B look like (or is there any constraints?)?
Research I have made. Unfortunately, the official documentation does not say much about it, apart from declaring that there is such a possibility. There are also two repositories, one with some go boilerplate code that I have trouble building and another one that has no usage instructions whatsoever (though allegedly does fulfil the "external metrics over HTTP" requirement).
By having a look at the .yaml
configs in those repositories, I have reached a conclusion that apart from Deployment
and Service
one needs to define an APIService
object that registers the external or custom metric in the kubernetes API and links it with a normal service (where you would have your pod) and a handful of ClusterRole
and ClusterRoleBinding
objects. But there is no explanation about it. Also I could not even list existing APIServices with kubectl in my local cluster (of 1.15 version) like other objects.
回答1:
The easiest way will be to feed metrics into Prometheus (which is a commonly solved problem), and then setup a Prometheus-based HPA (also a commonly solved problem).
1. Feed own metrics to Prometheus
- Start with Prometheus-Operator to get the cluster itself monitored, and get access to
ServiceMonitor
objects. ServiceMonitors are pointers to services in the cluster. They let your pod's/metrics
endpoint be discovered and scraped by a prometheus server. - Write a pod that reads metrics from your 3rd party API and shows them in own
/metrics
endpoint. This will be the adapter between your API and Prometheus format. There are clients of course: https://github.com/prometheus/client_python#exporting - Write a
Service
of typeClusterIP
that represents your pod. - Write a
ServiceMonitor
that points to a service. - Query your custom metrics thru Prometheus dashboard to ensure this stage is done.
2. Setup Prometheus-based HPA
- Setup Prometheus-Adapter and follow the HPA walkthrough.
- Or follow the guide https://github.com/stefanprodan/k8s-prom-hpa
This looks like a huge pile of work to get the HPA. However, only the adapter pod is a custom part here. Everything else is a standard stack setup in most of the clusters, and you will get many other use cases for it anyways.
来源:https://stackoverflow.com/questions/63709968/how-to-supply-external-metrics-into-hpa