In order to use the ScheduledScaler you will need to install the CRD and deploy the Scaling Controller into your Kubernetes cluster.
- Kubernetes Version: 1.7+
- Kubernetes Cluster Settings:
- "Legacy authorization": "Enabled"
- Google Kubernetes Engine
- Kubernetes Version: 1.9.3-gke.0, 1.7.15
- Docker Version: 1.12.5
- Golang Version: 1.9.4
Clone this repo
mkdir -p $GOPATH/src/k8s.restdev.com && \
git clone https://github.com/k8s-restdev/scheduled-scaler.git $GOPATH/src/k8s.restdev.com/operators && \
cd $GOPATH/src/k8s.restdev.com/operators
Install using Helm Chart
helm install scheduled-scaler artifacts/kubes/scaling/chart
Note: This uses the image stored at https://hub.docker.com/r/k8srestdev/scaling by default.
See chart README for detailed configuration options
Installation without Helm (and compiling binary yourself):
- Install the CRD
kubectl create -f ./artifacts/kubes/scaling/crd.yml
- Once you have the repo installed on your local dev you can test, build, push and deploy using
make
Note: If you are just looking for a prebuilt image you can find the latest build here. Just add that image tag to the deployment yml in the artificats dir and apply to your
kube-system
namespace to get up and running without doing a fresh build :D
The Makefile
provides the following steps:
- test - Run go unit tests
- build - Build the go bin file and docker image locally
- push - Push the built docker image to gcr (or another repository of your choice)
- deploy - Deploy the updated image to your Kubernetes cluster
Each of these steps can be run in a single pass or can be used individually.
Examples
- Do all the things (kubectl)
# This example will test, build, push and deploy using kubectl's currently configured cluster
make OPERATOR=scaling PROJECT_ID=my_project_id
- Do all the things (kubernodes)
# This example will test, build, push and deploy using kubernodes
make OPERATOR=scaling PROJECT_ID=my_project_id DEPLOYBIN=kn KN_PROJECT_ID=my_kubernodes_project_id
Note: You only need to add
KN_PROJECT_ID
if it differs fromPROJECT_ID
- Just build the image
make build OPERATOR=scaling PROJECT_ID=my_project_id
- Just push any image
make push IMAGE=myrepo/myimage:mytag
- Just deploy any image (kubectl)
make deploy OPERATOR=scaling IMAGE=myrepo/myimage:mytag
- Just deploy any image (kubernodes)
make deploy OPERATOR=scaling IMAGE=myrepo/myimage:mytag DEPLOYBIN=kn KN_PROJECT_ID=my_kubernodes_project_id
Now that you have all the resources required in your cluster you can begin creating ScheduledScalers.
Note: This controller uses the following Cron Expression Format
apiVersion: "scaling.k8s.restdev.com/v1alpha1"
kind: ScheduledScaler
metadata:
name: my-scheduled-scaler-1
spec:
timeZone: America/Los_Angeles
target:
kind: HorizontalPodAutoscaler
name: my-hpa
apiVersion: autoscaling/v1
steps:
#run at 5:30am PST
- runat: '0 30 5 * * *'
mode: range
minReplicas: 1
maxReplicas: 5
apiVersion: "scaling.k8s.restdev.com/v1alpha1"
kind: ScheduledScaler
metadata:
name: my-scheduled-scaler-2
spec:
timeZone: America/Los_Angeles
target:
kind: InstanceGroup
name: my-instance-group-name
apiVersion: compute/v1
steps:
#run at 5:30am PST
- runat: '0 30 5 * * *'
mode: fixed
replicas: 3
As you'll see above, you can target either instance groups (if you are on GKE) or hpa, but all the other options are the same.
Option | Description | Required |
---|---|---|
spec.timeZone | Timezone to run crons in | False |
spec.target.kind | Type of target (InstanceGroup/HorizontalPodAutoscaler) | True |
spec.target.name | Name of the target resource | True |
spec.target.apiVersion | API Version of the target | True |
spec.steps | List of steps | True |
spec.steps[].runat | Cronjob time string (gocron) | True |
spec.steps[].mode | Type of scaling to run (fixed/range) | True |
spec.steps[].replicas | Defined if mode is 'fixed' | False |
spec.steps[].minReplicas | Defined if mode is 'range' | False |
spec.steps[].maxReplicas | Defined if mode is 'range' | False |
For more details on how this add-on can be used please follow the link below: Learn More...
Thanks goes to these wonderful people (emoji key):
Sheridan C Rawlins 🚧 |
vnandha 🐛 🚧 |
so0k 🚇 📖 |
Andreas Wunderlich 📖 |
This project follows the all-contributors specification. Contributions of any kind welcome!