||2 years ago|
|deploy||3 years ago|
|helm-chart||3 years ago|
|kube_downscaler||2 years ago|
|tests||2 years ago|
|.gitignore||3 years ago|
|.travis.yml||2 years ago|
|Dockerfile||2 years ago|
|LICENSE||4 years ago|
|Makefile||2 years ago|
|Pipfile||2 years ago|
|Pipfile.lock||2 years ago|
|README.rst||3 years ago|
|pipenv-install.py||2 years ago|
|setup.py||4 years ago|
|tox.ini||2 years ago|
Scale down Kubernetes deployments and/or statefulsets during non-work hours.
Deployments are interchangeable by statefulset for this whole guide.
It will scale the deployment's replicas to zero if all of the following conditions are met:
- current time is not part of the "uptime" schedule (annotation
downscaler/uptime) or current time is part of the "downtime" schedule (
- the deployment's namespace is not part of the exclusion list (
kube-systemis excluded by default)
- the deployment's name is not part of the exclusion list
- the deployment is not marked for exclusion (annotation
- there are no active pods that force the whole cluster into uptime (annotation
Example use cases:
- Deploy the downscaler to a test (non-prod) cluster with a default uptime or downtime time range to scale down all deployments during the night and weekend.
- Deploy the downscaler to a production cluster without any default uptime/downtime setting and scale down specific deployments by setting the
downscaler/downtime) annotation. This might be useful for internal tooling frontends which are only needed during work time.
You need to combine the downscaler with an elastic cluster autoscaler to actually save cloud costs. The official cluster autoscaler and the kube-aws-autoscaler were tested to work fine with the downscaler.
Deploy the downscaler into your cluster via (also works with Minikube):
The example configuration uses the
--dry-run as a safety flag to prevent downscaling --- remove it to enable the downscaler, e.g. by editing the deployment:
The downscaler is configured via command line args, environment variables and/or Kubernetes annotations.
Time definitions (e.g.
DEFAULT_UPTIME) accept a comma separated list of specifications, e.g. the following configuration would downscale all deployments for non-work hours:
To only downscale during the weekend and already Friday after 20:00:
Each time specification must have the format
<WEEKDAY-FROM>-<WEEKDAY-TO-INCLUSIVE> <HH>:<MM>-<HH>:<MM> <TIMEZONE>. The timezone value can be any Olson timezone, e.g. "US/Eastern", "PST" or "UTC".
Available command line options:
Dry run mode: do not change anything, just print what would be done
Debug mode: print more information
Run loop only once and exit
Loop interval (default: 30s)
Namespace (default: all namespaces)
Downscale resources of this kind (default: deployment)
Default time range to scale up for (default: always), can also be configured via environment variable
DEFAULT_UPTIMEor via the annotation
downscaler/uptimeon each deployment
Default time range to scale down for (default: never), can also be configured via environment variable
DEFAULT_DOWNTIMEor via the annotation
downscaler/downtimeon each deployment
Exclude namespaces from downscaling (default: kube-system), can also be configured via environment variable
Exclude specific deployments from downscaling (default: kube-downscaler, downscaler), can also be configured via environment variable
Exclude specific statefulsets from statefulsets, can also be configured via environment variable
Easiest way to contribute is to provide feedback! We would love to hear what you like and what you think is missing. Create an issue or ping try_except_ on Twitter.
PRs are welcome. Please also have a look at issues labeled with "help wanted".
This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/.