/pangolin

An enhanced Horizontal Pod Autoscaler for Kubernetes.

Primary LanguageRustApache License 2.0Apache-2.0

Pangolin

An enhanced Horizontal Pod Autoscaler for Kubernetes. Pangolin scales deployments based on their Prometheus metrics, using a variety of highly configurable control strategies.

Why?

  • Kubernetes HPA only supports a single scaling strategy that is not applicable to all use-cases.
  • Kubernetes HPA has a limited set of configuration options, which can make it difficult to tune.
  • Kubernetes HPA has limited support for scaling on custom metrics.
  • Existing third party Kubernetes autoscaling tools are limited and generally tailored toward niche usecases.
  • None of the existing third party Kubernetes autoscaling tools have good test coverage or are battle tested.
  • None of the existing third party Kubernetes autoscaling tools appear to based on a solid control theory foundations.

There's a few major sources of potential risk when it comes to autoscaling. Many of these sources of risk fall within the scope of the application providing control authority. The hypothesis behind Pangolin is that more robust control authority will lead to a significant reduction in autoscaling risk. Eg. loop stability, resilient monitoring, measurement latency, outlier detection etc.

Why Rust?

Because it's a fantastic systems programming language and we need to see more of it in the container space.

Requirements

  • Kubernetes v1.17.0 cluster with RBAC enabled.
  • The target Deployment / Pods have Prometheus metrics available on port 9090.

Installation

The latest stable release of Pangolin can be installed from GitHub:

foo@bar:~$ kubectl apply -f https://raw.githubusercontent.com/dpeckett/pangolin/master/manifest.yaml

Usage

Simply create an AutoScaler object in the same namespace as the deployment you wish to be autoscaled:

apiVersion: "pangolinscaler.com/v1alpha1"
kind: AutoScaler
metadata:
  name: my-new-autoscaler
spec:
  # Autoscaling strategy / control algorithm.
  strategy: BangBang
  # Kubernetes resource kind of the autoscaling target.
  kind: Deployment
  # Selector for the autoscaling target.
  selector:
    matchLabels:
      app: my-application
  metric:
    # Prometheus metric for autoscaling decisions.
    name: response_latency_ms
    # How often to pull metrics (seconds).
    interval: 10
  # How often to evaluate the autoscaling strategy (seconds).
  interval: 60
  # Any autoscaling limits, eg the number of replicas.
  limits:
    replicas:
      min: 1
      max: 5
  # Bang-bang controller configuration.
  bangBang:
    # Bang-bang controller lower threshold.
    lower: 100.0
    # Bang-bang controller upper threshold.
    upper: 250.0

For more details about the AutoScaler resource look at manifest.yaml and src/resource.rs in this repository.

Building

Locally

You will need the latest Rust stable toolchain installed on your machine. Refer to rustup for more details.

foo@bar:~$ cargo build --release

Docker

To build an Alpine based Docker image from source:

foo@bar:~$ docker build -t pangolinscaler/pangolin:v0.1.0 .

Control Strategies

Currently Pangolin only supports bang-bang control, however additional strategies are under development.

  • Bang-bang control.
  • PID control.