Merge pull request #741 from piosz/metrics-server
Metrics server design proposal
This commit is contained in:
commit
4c567904b1
|
|
@ -0,0 +1,89 @@
|
|||
Metrics Server
|
||||
==============
|
||||
|
||||
Resource Metrics API is an effort to provide a first-class Kubernetes API
|
||||
(stable, versioned, discoverable, available through apiserver and with client support)
|
||||
that serves resource usage metrics for pods and nodes. The use cases were discussed
|
||||
and the API was proposed a while ago in
|
||||
[another proposal](https://github.com/kubernetes/community/blob/master/contributors/design-proposals/resource-metrics-api.md).
|
||||
This document describes the architecture and the design of the second part of this effort:
|
||||
making the mentioned API available in the same way as the other Kubernetes APIs.
|
||||
|
||||
### Scalability limitations ###
|
||||
We want to collect up to 10 metrics from each pod and node running in a cluster.
|
||||
Starting with Kubernetes 1.6 we support 5000 nodes clusters with 30 pods per node.
|
||||
Assuming we want to collect metrics with 1 minute granularity this means:
|
||||
```
|
||||
10 x 5000 x 30 / 60 = 25000 metrics per second by average
|
||||
```
|
||||
|
||||
Kubernetes apiserver persists all Kubernetes resources in its key-value store [etcd](https://coreos.com/etcd/).
|
||||
It’s not able to handle such load. On the other hand metrics tend to change frequently,
|
||||
are temporary and in case of loss of them we can collect them during the next housekeeping operation.
|
||||
We will store them in memory then. This means that we can’t reuse the main apiserver
|
||||
and instead we will introduce a new one - metrics server.
|
||||
|
||||
### Current status ###
|
||||
The API has been already implemented in Heapster, but users and Kubernetes components
|
||||
can only access it through master proxy mechanism and have to decode it on their own.
|
||||
Heapster serves the API using go http library which doesn’t offer a number of functionality
|
||||
that is offered by Kubernetes API server like authorization/authentication or client generation.
|
||||
There is also a prototype of Heapster using [generic apiserver](https://github.com/kubernetes/apiserver) library.
|
||||
|
||||
The API is in alpha and there is a plan to graduate it to beta (and later to GA),
|
||||
but it’s out of the scope of this document.
|
||||
|
||||
### Dependencies ###
|
||||
In order to make metrics server available for users in exactly the same way
|
||||
as the regular Kubernetes API we need a mechanism that redirects requests to `/apis/metrics`
|
||||
endpoint from the apiserver to metrics server. The solution for this problem is
|
||||
[kube-aggregator](https://github.com/kubernetes/kube-aggregator).
|
||||
The effort is on track to be completed for Kubernetes 1.7 release.
|
||||
Previously metrics server was blocked on this dependency.
|
||||
|
||||
### Design ###
|
||||
Metrics server will be implemented in line with
|
||||
[Kubernetes monitoring architecture](https://github.com/kubernetes/community/blob/master/contributors/design-proposals/monitoring_architecture.md)
|
||||
and inspired by [Heapster](https://github.com/kubernetes/heapster).
|
||||
It will be a cluster level component which periodically scrapes metrics from all Kubernetes nodes
|
||||
served by Kubelet through Summary API. Then metrics will be aggregated,
|
||||
stored in memory (see Scalability limitations) and served in
|
||||
[Metrics API](https://github.com/kubernetes/metrics/blob/master/pkg/apis/metrics/v1alpha1/types.go) format.
|
||||
|
||||
Metrics server will use apiserver library to implement http server functionality.
|
||||
The library offers common Kubernetes functionality like authorization/authentication,
|
||||
versioning, support for auto-generated client. To store data in memory we will replace
|
||||
the default storage layer (etcd) by introducing in-memory store which will implement
|
||||
[Storage interface](https://github.com/kubernetes/apiserver/blob/master/pkg/registry/rest/rest.go).
|
||||
|
||||
Only the most recent value of each metric will be remembered. If a user needs an access
|
||||
to historical data they should either use 3rd party monitoring solution or
|
||||
archive the metrics on their own (more details in the mentioned vision).
|
||||
|
||||
Since the metrics are stored in memory, once the component is restarted, all data are lost.
|
||||
This is an acceptable behavior because shortly after the restart the newest metrics will be collected,
|
||||
though we will try to minimize the priority of this (see also Deployment).
|
||||
|
||||
### Deployment ###
|
||||
Since metrics server is prerequisite for a number of Kubernetes components (HPA, scheduler, kubectl top)
|
||||
it will run by default in all Kubernetes clusters. Metrics server initiates connections to nodes,
|
||||
due to security reasons (our policy allows only connection in the opposite direction) so it has to run on user’s node.
|
||||
|
||||
There will be only one instance of metrics server running in each cluster. In order to handle
|
||||
high metrics volume, metrics server will be vertically autoscaled by
|
||||
[addon-resizer](https://github.com/kubernetes/contrib/tree/master/addon-resizer).
|
||||
We will measure its resource usage characteristic. Our experience from profiling Heapster shows
|
||||
that it scales vertically effectively. If we hit performance limits we will consider scaling it
|
||||
horizontally, though it’s rather complicated and is out of the scope of this doc.
|
||||
|
||||
Metrics server will be Kubernetes addon, create by kube-up script and managed by
|
||||
[addon-manager](https://github.com/kubernetes/kubernetes/tree/master/cluster/addons/addon-manager).
|
||||
Since there is a number of dependant components, it will be marked as a critical addon.
|
||||
In the future when the priority/preemption feature is introduced we will migrate to use this
|
||||
proper mechanism for marking it as a high-priority, system component.
|
||||
|
||||
### Users migration ###
|
||||
In order to make the API usable we will provide auto-generated set of clients.
|
||||
Currently the API is being used by a number of components and after we will introduce
|
||||
the metrics server we will migrate all of them to use the new path.
|
||||
|
||||
Loading…
Reference in New Issue