Scheduling an Application Using Metrics¶
Goal: Explore the metrics mechanisms and schedule an application based on cluster metrics.
Note
Refer to the Introduction to Scheduling mechanisms for useful commands to observe the migration mechanism.
Introduction¶
Metrics in the Krake sense have two meanings. The first one is an actual value for some
parameter, which can be measured or computed in the real world. For instance the current
space available on a data center, its latency, the amount of green energy used by the
data center could all be metrics. This value may be dynamic and change over time.
A GlobalMetric is also a resource in Krake. It represents an actual metric,
is stored in the database, and defines a few elements, such as the minimum and
maximum values (Krake only considers numbers for the metrics).
The Krake scheduler can use these metrics to compute the score of a Krake Kubernetes
Cluster. Each cluster is associated with a list of metrics and their respective
weights for this cluster. This list is defined by the user who added the Cluster
resource into Krake. A higher weight means that the metric has a higher influence in the
score: a metrics with a low value, but a high weight may have more impact on the score
than a metric with medium value but low weight. The Cluster metrics and
the computed score is then used in the Application scheduling process.
For Krake to fetch the current value of a metric, a user needs to define where and how
it can be requested. GlobalMetricsProvider resources can be created for this
purpose. They have different types, to support different technologies. There is for
example a support for Prometheus. The GlobalMetricsProvider resource will define
the URL of the Prometheus instance and some other metadata, and afterwards, Krake’s
scheduler can automatically fetch the current value of the metrics for the score’s
computation.
The static providers are simple metric providers usually only set during tests. They allow a Krake resource to be associated with simple metrics, for which the value can be fetched easily, without having to set up a whole infrastructure.
The static providers thus give values for GlobalMetric resources. This value is
only defined in the resource (stored in the database). Updating the
GlobalMetricsProvider resource definition thus implies updating the value of
the metrics.
An example of a static GlobalMetricsProvider resource is given in the following.
It is used in the next steps of this guide. As explained, the value of the metrics
it provides are directly set inside its definition:
api: core
kind: GlobalMetricsProvider
metadata:
created: '2020-01-21T10:50:11.500376'
deleted: null
finalizers: []
labels: {}
modified: '2020-01-21T10:50:11.500376'
name: static_provider
namespace: null
owners: []
uid: 26ef45e8-e5c8-44fe-8a7f-a3f40944c925
spec:
static:
metrics:
electricity_cost_1: 0.9 # Set the value that will be provided for this metric
green_energy_ratio_1: 0.1 # Set the value that will be provided for this metric
type: static
To get additional information about the metrics and metrics providers, please read the documentation about them, see Metrics and Metrics Providers.
Preparation¶
- Add the
static_providermetrics provider using the bootstrap script (from the root of the Krake repository):
cd <path_to_krake_root>
krake_bootstrap_db support/static_metrics.yaml
- Check that the
GlobalMetricsProviderandGlobalMetricsobjects have been successfully added:
rok core globalmetricsprovider get static_provider
+-----------+---------------------------+
| name | static_provider |
| namespace | None |
| labels | None |
| created | 2000-01-01 08:00:00 |
| modified | 2000-01-01 08:00:00 |
| deleted | None |
| type | static |
| metrics | electricity_cost_1: 0.9 |
| | green_energy_ratio_1: 0.1 |
+-----------+---------------------------+
rok core globalmetric get electricity_cost_1
+-----------+---------------------+
| name | electricity_cost_1 |
| namespace | None |
| labels | None |
| created | 2000-01-01 08:00:00 |
| modified | 2000-01-01 08:00:00 |
| deleted | None |
| provider | static_provider |
| min | 0 |
| max | 1 |
+-----------+---------------------+
rok core globalmetric get green_energy_ratio_1
+-----------+----------------------+
| name | green_energy_ratio_1 |
| namespace | None |
| labels | None |
| created | 2000-01-01 08:00:00 |
| modified | 2000-01-01 08:00:00 |
| deleted | None |
| provider | static_provider |
| min | 0 |
| max | 1 |
+-----------+----------------------+
- Register
minikube-cluster-1andminikube-cluster-2clusters, and associate theelectricity_cost_1andgreen_energy_ratio_1metrics to them using different weights to get different ranking scores:
rok kube cluster register -k clusters/config/minikube-cluster-1 --global-metric electricity_cost_1 10 --global-metric green_energy_ratio_1 1
rok kube cluster register -k clusters/config/minikube-cluster-2 --global-metric electricity_cost_1 1 --global-metric green_energy_ratio_1 10
The clusters
minikube-cluster-1/-2have been defined with the following weights for the two static metrics:minikube-cluster-1minikube-cluster-2Value electricity_cost_1Weight: 10 Weight: 1 0.9 green_energy_ratio_1Weight: 1 Weight: 10 0.1 Score 9.1 1.9 As the score of
minikube-cluster-1is higher, it will been chosen, and the Application will be deployed on it. The score is computed like the following:\[10 \cdot 0.9 + 1 \cdot 0.1 = 9.1\]
Scheduling of an application¶
- Create the
echo-demoapplication and check it is actually deployed on the first cluster:
rok kube app create -f git/krake/rak/functionals/echo-demo.yaml echo-demo
rok kube app get echo-demo # See "running_on": the Application is running on "minikube-cluster-1"
Note
You can observe the scheduler logs in DEBUG mode to gather additional understanding of the scheduling mechanism.
Observe a migration¶
The Scheduler regularly performs a check, to ensure the current cluster on which an Application is running is the best, depending on its score. This check is done by default every minute (see the configuration of the Scheduler). If an available cluster with a better score than the one of the current cluster is found, the Application is migrated from the current to the better cluster.
As the score is computed using the metrics, we can trigger the migration by updating the exported value of the metrics in the
static_providerGlobalMetricsProviderresource. The following command updates the value of the static metrics:electricity_cost_1: to have a value of 0.1;green_energy_ratio_1: to have a value of 0.9;
minikube-cluster-1minikube-cluster-2New value electricity_cost_1Weight: 10 Weight: 1 0.1 green_energy_ratio_1Weight: 1 Weight: 10 0.9 Score 1.9 9.1
Note
This is not the actual score but a simplification, as stickiness is also part of the computation, see Scheduling of Applications
- Update the value of the metrics, by updating the
static_providerGlobalMetricsProvider:
rok core globalmetricsprovider update static_provider --metric electricity_cost_1 0.1 --metric green_energy_ratio_1 0.9
+-----------+---------------------------+
| name | static_provider |
| namespace | None |
| labels | None |
| created | 2021-04-08 08:04:23 |
| modified | 2021-04-08 08:10:34 |
| deleted | None |
| type | static |
| metrics | electricity_cost_1: 0.1 |
| | green_energy_ratio_1: 0.9 |
+-----------+---------------------------+
- Now, by waiting a bit (maximum 60 seconds if you kept the default configuration), the
Scheduler should have checked the new values of the metrics, and have requested a
migration of the Application onto
minikube-cluster-2, which has now the better score:
rok kube app get echo-demo # See "running_on": the Application is running on "minikube-cluster-2"
Cleanup¶
- Delete the
echo-demoKubernetesApplicationand both KubernetesClusters.
$ rok kube app delete echo-demo
$ rok kube cluster delete minikube-cluster-1
$ rok kube cluster delete minikube-cluster-2