autoscaler

package
v0.7.0 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Jun 25, 2019 License: Apache-2.0 Imports: 37 Imported by: 0

README

Scaling documentation has moved to the docs folder.

Documentation

Overview

Package autoscaler calculates the number of pods necessary for the desired level of concurrency per pod (stableConcurrencyPerPod). It operates in two modes, stable mode and panic mode.

Stable mode calculates the average concurrency observed over the last 60 seconds and adjusts the observed pod count to achieve the target value. Current observed pod count is the number of unique pod names which show up in the last 60 seconds.

Panic mode calculates the average concurrency observed over the last 6 seconds and adjusts the observed pod count to achieve the stable target value. Panic mode is engaged when the observed 6 second average concurrency reaches 2x the target stable concurrency. Panic mode will last at least 60 seconds--longer if the 2x threshold is repeatedly breached. During panic mode the number of pods is never decreased in order to prevent flapping.

Package autoscaler supports both single-tenant (one autoscaler per revision) and multitenant (one autoscaler for all revisions) autoscalers; config/controller.yaml determines which kind of autoscaler is used.

Index

Constants

View Source
const (

	// BucketSize is the size of the buckets of stats we create.
	BucketSize = 2 * time.Second
)
View Source
const (
	// ConfigName is the name of the config map of the autoscaler.
	ConfigName = "config-autoscaler"
)

Variables

View Source
var (
	// ErrNoData denotes that the collector could not calculate data.
	ErrNoData = errors.New("no data available")
)

Functions

func NewMetricKey

func NewMetricKey(namespace string, name string) string

NewMetricKey identifies a UniScaler in the multiscaler. Stats send in are identified and routed via this key.

Types

type Autoscaler

type Autoscaler struct {
	// contains filtered or unexported fields
}

Autoscaler stores current state of an instance of an autoscaler

func New

func New(
	namespace string,
	revision string,
	metricClient MetricClient,
	podCounter resources.ReadyPodCounter,
	deciderSpec DeciderSpec,
	reporter StatsReporter) (*Autoscaler, error)

New creates a new instance of autoscaler

func (*Autoscaler) Scale

func (a *Autoscaler) Scale(ctx context.Context, now time.Time) (desiredPodCount int32, validScale bool)

Scale calculates the desired scale based on current statistics given the current time. desiredPodCount is the calculated pod count the autoscaler would like to set. validScale signifies whether the desiredPodCount should be applied or not.

func (*Autoscaler) Update

func (a *Autoscaler) Update(deciderSpec DeciderSpec) error

Update reconfigures the UniScaler according to the DeciderSpec.

type Config

type Config struct {
	// Feature flags.
	EnableScaleToZero bool

	// Target concurrency knobs for different container concurrency configurations.
	ContainerConcurrencyTargetFraction float64
	ContainerConcurrencyTargetDefault  float64

	// General autoscaler algorithm configuration.
	MaxScaleUpRate           float64
	StableWindow             time.Duration
	PanicWindowPercentage    float64
	PanicThresholdPercentage float64
	// Deprecated in favor of PanicWindowPercentage.
	PanicWindow  time.Duration
	TickInterval time.Duration

	ScaleToZeroGracePeriod time.Duration
}

Config defines the tunable autoscaler parameters +k8s:deepcopy-gen=true

func NewConfigFromConfigMap

func NewConfigFromConfigMap(configMap *corev1.ConfigMap) (*Config, error)

NewConfigFromConfigMap creates a Config from the supplied ConfigMap

func NewConfigFromMap

func NewConfigFromMap(data map[string]string) (*Config, error)

NewConfigFromMap creates a Config from the supplied map

func (*Config) DeepCopy

func (in *Config) DeepCopy() *Config

DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Config.

func (*Config) DeepCopyInto

func (in *Config) DeepCopyInto(out *Config)

DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.

type Decider

type Decider struct {
	metav1.ObjectMeta
	Spec   DeciderSpec
	Status DeciderStatus
}

Decider is a resource which observes the request load of a Revision and recommends a number of replicas to run. +k8s:deepcopy-gen=true

func (*Decider) DeepCopy

func (in *Decider) DeepCopy() *Decider

DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Decider.

func (*Decider) DeepCopyInto

func (in *Decider) DeepCopyInto(out *Decider)

DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.

type DeciderSpec

type DeciderSpec struct {
	TickInterval      time.Duration
	MaxScaleUpRate    float64
	TargetConcurrency float64
	PanicThreshold    float64
	// StableWindow is needed to determine when to exit panicmode.
	StableWindow time.Duration
	// The name of the k8s service for pod information.
	ServiceName string
}

DeciderSpec is the parameters in which the Revision should scaled.

type DeciderStatus

type DeciderStatus struct {
	DesiredScale int32
}

DeciderStatus is the current scale recommendation.

type Metric

type Metric struct {
	metav1.ObjectMeta
	Spec   MetricSpec
	Status MetricStatus
}

Metric represents a resource to configure the metric collector with. +k8s:deepcopy-gen=true

func (*Metric) DeepCopy

func (in *Metric) DeepCopy() *Metric

DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Metric.

func (*Metric) DeepCopyInto

func (in *Metric) DeepCopyInto(out *Metric)

DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.

type MetricClient

type MetricClient interface {
	// StableAndPanicConcurrency returns both the stable and the panic concurrency.
	StableAndPanicConcurrency(key string) (float64, float64, error)
}

MetricClient surfaces the metrics that can be obtained via the collector.

type MetricCollector

type MetricCollector struct {
	// contains filtered or unexported fields
}

MetricCollector manages collection of metrics for many entities.

func NewMetricCollector

func NewMetricCollector(statsScraperFactory StatsScraperFactory, logger *zap.SugaredLogger) *MetricCollector

NewMetricCollector creates a new metric collector.

func (*MetricCollector) Create

func (c *MetricCollector) Create(ctx context.Context, metric *Metric) (*Metric, error)

Create creates a new metric and thus starts collection for that entity. Returns a copy of the Metric object. Mutations won't be seen by the collector.

func (*MetricCollector) Delete

func (c *MetricCollector) Delete(ctx context.Context, namespace, name string) error

Delete deletes a Metric and halts collection.

func (*MetricCollector) Get

func (c *MetricCollector) Get(ctx context.Context, namespace, name string) (*Metric, error)

Get gets a Metric's state from the collector. Returns a copy of the Metric object. Mutations won't be seen by the collector.

func (*MetricCollector) Record

func (c *MetricCollector) Record(key string, stat Stat)

Record records a stat that's been generated outside of the metric collector.

func (*MetricCollector) StableAndPanicConcurrency

func (c *MetricCollector) StableAndPanicConcurrency(key string) (float64, float64, error)

StableAndPanicConcurrency returns both the stable and the panic concurrency.

func (*MetricCollector) Update

func (c *MetricCollector) Update(ctx context.Context, metric *Metric) (*Metric, error)

Update updates the Metric. Returns a copy of the Metric object. Mutations won't be seen by the collector.

type MetricProvider

type MetricProvider struct {
	// contains filtered or unexported fields
}

MetricProvider is a provider to back a custom-metrics API implementation.

func NewMetricProvider

func NewMetricProvider(metricClient MetricClient) *MetricProvider

NewMetricProvider creates a new MetricProvider.

func (*MetricProvider) GetMetricByName

GetMetricByName implements the interface.

func (*MetricProvider) GetMetricBySelector

func (p *MetricProvider) GetMetricBySelector(namespace string, selector labels.Selector, info provider.CustomMetricInfo) (*cmetrics.MetricValueList, error)

GetMetricBySelector implements the interface.

func (*MetricProvider) ListAllMetrics

func (p *MetricProvider) ListAllMetrics() []provider.CustomMetricInfo

ListAllMetrics implements the interface.

type MetricSpec

type MetricSpec struct {
	StableWindow time.Duration
	PanicWindow  time.Duration

	// ScrapeTarget is the K8s service that is publishes the metric
	// endpoint.
	ScrapeTarget string
}

MetricSpec contains all values the metric collector needs to operate.

type MetricStatus

type MetricStatus struct{}

MetricStatus reflects the status of metric collection for this specific entity.

type MultiScaler

type MultiScaler struct {
	// contains filtered or unexported fields
}

MultiScaler maintains a collection of Uniscalers.

func NewMultiScaler

func NewMultiScaler(
	stopCh <-chan struct{},
	uniScalerFactory UniScalerFactory,
	logger *zap.SugaredLogger) *MultiScaler

NewMultiScaler constructs a MultiScaler.

func (*MultiScaler) Create

func (m *MultiScaler) Create(ctx context.Context, decider *Decider) (*Decider, error)

Create instantiates the desired Decider.

func (*MultiScaler) Delete

func (m *MultiScaler) Delete(ctx context.Context, namespace, name string) error

Delete stops and removes a Decider.

func (*MultiScaler) Get

func (m *MultiScaler) Get(ctx context.Context, namespace, name string) (*Decider, error)

Get return the current Decider.

func (*MultiScaler) Inform

func (m *MultiScaler) Inform(event string) bool

Inform sends an update to the registered watcher function, if it is set.

func (*MultiScaler) Poke

func (m *MultiScaler) Poke(key string, stat Stat)

Poke checks if the autoscaler needs to be run immediately.

func (*MultiScaler) Update

func (m *MultiScaler) Update(ctx context.Context, decider *Decider) (*Decider, error)

Update applied the desired DeciderSpec to a currently running Decider.

func (*MultiScaler) Watch

func (m *MultiScaler) Watch(fn func(string))

Watch registers a singleton function to call when DeciderStatus is updated.

type Reporter

type Reporter struct {
	// contains filtered or unexported fields
}

Reporter holds cached metric objects to report autoscaler metrics

func NewStatsReporter

func NewStatsReporter(podNamespace string, service string, config string, revision string) (*Reporter, error)

NewStatsReporter creates a reporter that collects and reports autoscaler metrics

func (*Reporter) ReportActualPodCount

func (r *Reporter) ReportActualPodCount(v int64) error

ReportActualPodCount captures value v for actual pod count measure.

func (*Reporter) ReportDesiredPodCount

func (r *Reporter) ReportDesiredPodCount(v int64) error

ReportDesiredPodCount captures value v for desired pod count measure.

func (*Reporter) ReportPanic

func (r *Reporter) ReportPanic(v int64) error

ReportPanic captures value v for panic mode measure.

func (*Reporter) ReportPanicRequestConcurrency

func (r *Reporter) ReportPanicRequestConcurrency(v float64) error

ReportPanicRequestConcurrency captures value v for panic request concurrency measure.

func (*Reporter) ReportRequestedPodCount

func (r *Reporter) ReportRequestedPodCount(v int64) error

ReportRequestedPodCount captures value v for requested pod count measure.

func (*Reporter) ReportStableRequestConcurrency

func (r *Reporter) ReportStableRequestConcurrency(v float64) error

ReportStableRequestConcurrency captures value v for stable request concurrency measure.

func (*Reporter) ReportTargetRequestConcurrency

func (r *Reporter) ReportTargetRequestConcurrency(v float64) error

ReportTargetRequestConcurrency captures value v for target request concurrency measure.

type ServiceScraper

type ServiceScraper struct {
	// contains filtered or unexported fields
}

ServiceScraper scrapes Revision metrics via a K8S service by sampling. Which pod to be picked up to serve the request is decided by K8S. Please see https://kubernetes.io/docs/concepts/services-networking/network-policies/ for details.

func NewServiceScraper

func NewServiceScraper(metric *Metric, counter resources.ReadyPodCounter) (*ServiceScraper, error)

NewServiceScraper creates a new StatsScraper for the Revision which the given Metric is responsible for.

func (*ServiceScraper) Scrape

func (s *ServiceScraper) Scrape() (*StatMessage, error)

Scrape calls the destination service then sends it to the given stats channel.

type Stat

type Stat struct {
	// The time the data point was received by autoscaler.
	Time *time.Time

	// The unique identity of this pod.  Used to count how many pods
	// are contributing to the metrics.
	PodName string

	// Average number of requests currently being handled by this pod.
	AverageConcurrentRequests float64

	// Part of AverageConcurrentRequests, for requests going through a proxy.
	AverageProxiedConcurrentRequests float64

	// Number of requests received since last Stat (approximately QPS).
	RequestCount float64

	// Part of RequestCount, for requests going through a proxy.
	ProxiedRequestCount float64
}

Stat defines a single measurement at a point in time

type StatMessage

type StatMessage struct {
	Key  string
	Stat Stat
}

StatMessage wraps a Stat with identifying information so it can be routed to the correct receiver.

type StatsReporter

type StatsReporter interface {
	ReportDesiredPodCount(v int64) error
	ReportRequestedPodCount(v int64) error
	ReportActualPodCount(v int64) error
	ReportStableRequestConcurrency(v float64) error
	ReportPanicRequestConcurrency(v float64) error
	ReportTargetRequestConcurrency(v float64) error
	ReportPanic(v int64) error
}

StatsReporter defines the interface for sending autoscaler metrics

type StatsScraper

type StatsScraper interface {
	// Scrape scrapes the Revision queue metric endpoint.
	Scrape() (*StatMessage, error)
}

StatsScraper defines the interface for collecting Revision metrics

type StatsScraperFactory

type StatsScraperFactory func(*Metric) (StatsScraper, error)

StatsScraperFactory creates a StatsScraper for a given Metric.

type UniScaler

type UniScaler interface {
	// Scale either proposes a number of replicas or skips proposing. The proposal is requested at the given time.
	// The returned boolean is true if and only if a proposal was returned.
	Scale(context.Context, time.Time) (int32, bool)

	// Update reconfigures the UniScaler according to the DeciderSpec.
	Update(DeciderSpec) error
}

UniScaler records statistics for a particular Decider and proposes the scale for the Decider's target based on those statistics.

type UniScalerFactory

type UniScalerFactory func(*Decider) (UniScaler, error)

UniScalerFactory creates a UniScaler for a given PA using the given dynamic configuration.

Directories

Path Synopsis
Package statserver provides a WebSocket server which receives autoscaler statistics, typically from queue proxy sidecar containers, and sends them to a channel.
Package statserver provides a WebSocket server which receives autoscaler statistics, typically from queue proxy sidecar containers, and sends them to a channel.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL