package v2 import ( "cue.dev/x/k8s.io/apimachinery/pkg/api/resource" "cue.dev/x/k8s.io/apimachinery/pkg/apis/meta/v1" ) // ContainerResourceMetricSource indicates how to scale on a resource metric // known to Kubernetes, as specified in requests and limits, describing each // pod in the current scale target (e.g. CPU or memory). The values will be // averaged together before being compared to the target. Such metrics are // built in to Kubernetes, and have special scaling options on top of those // available to normal per-pod metrics using the "pods" source. Only one // "target" type should be set. #ContainerResourceMetricSource: { // container is the name of the container in the pods of the scaling target "container"!: string // name is the name of the resource in question. "name"!: string // target specifies the target value for the given metric "target"!: #MetricTarget } // ContainerResourceMetricStatus indicates the current value of a resource // metric known to Kubernetes, as specified in requests and limits, describing // a single container in each pod in the current scale target (e.g. CPU or // memory). Such metrics are built in to Kubernetes, and have special scaling // options on top of those available to normal per-pod metrics using the "pods" // source. #ContainerResourceMetricStatus: { // container is the name of the container in the pods of the scaling target "container"!: string // current contains the current value for the given metric "current"!: #MetricValueStatus // name is the name of the resource in question. "name"!: string } // CrossVersionObjectReference contains enough information to let you identify // the referred resource. #CrossVersionObjectReference: { // apiVersion is the API version of the referent "apiVersion"?: string // kind is the kind of the referent; More info: // https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds "kind"!: string // name is the name of the referent; More info: // https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names "name"!: string } // ExternalMetricSource indicates how to scale on a metric not associated with // any Kubernetes object (for example length of queue in cloud messaging // service, or QPS from loadbalancer running outside of cluster). #ExternalMetricSource: { // metric identifies the target metric by name and selector "metric"!: #MetricIdentifier // target specifies the target value for the given metric "target"!: #MetricTarget } // ExternalMetricStatus indicates the current value of a global metric not // associated with any Kubernetes object. #ExternalMetricStatus: { // current contains the current value for the given metric "current"!: #MetricValueStatus // metric identifies the target metric by name and selector "metric"!: #MetricIdentifier } // HPAScalingPolicy is a single policy which must hold true for a specified past interval. #HPAScalingPolicy: { // periodSeconds specifies the window of time for which the policy should hold // true. PeriodSeconds must be greater than zero and less than or equal to 1800 // (30 min). "periodSeconds"!: int32 & int // type is used to specify the scaling policy. "type"!: string // value contains the amount of change which is permitted by the policy. It must // be greater than zero "value"!: int32 & int } // HPAScalingRules configures the scaling behavior for one direction via scaling // Policy Rules and a configurable metric tolerance. // // Scaling Policy Rules are applied after calculating DesiredReplicas from // metrics for the HPA. They can limit the scaling velocity by specifying // scaling policies. They can prevent flapping by specifying the stabilization // window, so that the number of replicas is not set instantly, instead, the // safest value from the stabilization window is chosen. // // The tolerance is applied to the metric values and prevents scaling too // eagerly for small metric variations. (Note that setting a tolerance requires // the beta HPAConfigurableTolerance feature gate to be enabled.) #HPAScalingRules: { // policies is a list of potential scaling polices which can be used during // scaling. If not set, use the default values: - For scale up: allow doubling // the number of pods, or an absolute change of 4 pods in a 15s window. - For // scale down: allow all pods to be removed in a 15s window. "policies"?: [...#HPAScalingPolicy] // selectPolicy is used to specify which policy should be used. If not set, the // default value Max is used. "selectPolicy"?: string // stabilizationWindowSeconds is the number of seconds for which past // recommendations should be considered while scaling up or scaling down. // StabilizationWindowSeconds must be greater than or equal to zero and less // than or equal to 3600 (one hour). If not set, use the default values: - For // scale up: 0 (i.e. no stabilization is done). - For scale down: 300 (i.e. the // stabilization window is 300 seconds long). "stabilizationWindowSeconds"?: int32 & int // tolerance is the tolerance on the ratio between the current and desired // metric value under which no updates are made to the desired number of // replicas (e.g. 0.01 for 1%). Must be greater than or equal to zero. If not // set, the default cluster-wide tolerance is applied (by default 10%). // // For example, if autoscaling is configured with a memory consumption target of // 100Mi, and scale-down and scale-up tolerances of 5% and 1% respectively, // scaling will be triggered when the actual consumption falls below 95Mi or // exceeds 101Mi. // // This is an beta field and requires the HPAConfigurableTolerance feature gate to be enabled. "tolerance"?: resource.#Quantity } // HorizontalPodAutoscaler is the configuration for a horizontal pod autoscaler, // which automatically manages the replica count of any resource implementing // the scale subresource based on the metrics specified. #HorizontalPodAutoscaler: { // APIVersion defines the versioned schema of this representation of an object. // Servers should convert recognized schemas to the latest internal value, and // may reject unrecognized values. More info: // https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources "apiVersion": "autoscaling/v2" // Kind is a string value representing the REST resource this object represents. // Servers may infer this from the endpoint the client submits requests to. // Cannot be updated. In CamelCase. More info: // https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds "kind": "HorizontalPodAutoscaler" // metadata is the standard object metadata. More info: // https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata "metadata"?: v1.#ObjectMeta // spec is the specification for the behaviour of the autoscaler. More info: // https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status. "spec"!: #HorizontalPodAutoscalerSpec // status is the current information about the autoscaler. "status"?: #HorizontalPodAutoscalerStatus } // HorizontalPodAutoscalerBehavior configures the scaling behavior of the target // in both Up and Down directions (scaleUp and scaleDown fields respectively). #HorizontalPodAutoscalerBehavior: { // scaleDown is scaling policy for scaling Down. If not set, the default value // is to allow to scale down to minReplicas pods, with a 300 second // stabilization window (i.e., the highest recommendation for the last 300sec // is used). "scaleDown"?: #HPAScalingRules // scaleUp is scaling policy for scaling Up. If not set, the default value is the higher of: // * increase no more than 4 pods per 60 seconds // * double the number of pods per 60 seconds // No stabilization is used. "scaleUp"?: #HPAScalingRules } // HorizontalPodAutoscalerCondition describes the state of a // HorizontalPodAutoscaler at a certain point. #HorizontalPodAutoscalerCondition: { // lastTransitionTime is the last time the condition transitioned from one status to another "lastTransitionTime"?: v1.#Time // message is a human-readable explanation containing details about the transition "message"?: string // reason is the reason for the condition's last transition. "reason"?: string // status is the status of the condition (True, False, Unknown) "status"!: string // type describes the current condition "type"!: string } // HorizontalPodAutoscalerList is a list of horizontal pod autoscaler objects. #HorizontalPodAutoscalerList: { // APIVersion defines the versioned schema of this representation of an object. // Servers should convert recognized schemas to the latest internal value, and // may reject unrecognized values. More info: // https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources "apiVersion": "autoscaling/v2" // items is the list of horizontal pod autoscaler objects. "items"!: [...#HorizontalPodAutoscaler] // Kind is a string value representing the REST resource this object represents. // Servers may infer this from the endpoint the client submits requests to. // Cannot be updated. In CamelCase. More info: // https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds "kind": "HorizontalPodAutoscalerList" // metadata is the standard list metadata. "metadata"?: v1.#ListMeta } // HorizontalPodAutoscalerSpec describes the desired functionality of the HorizontalPodAutoscaler. #HorizontalPodAutoscalerSpec: { // behavior configures the scaling behavior of the target in both Up and Down // directions (scaleUp and scaleDown fields respectively). If not set, the // default HPAScalingRules for scale up and scale down are used. "behavior"?: #HorizontalPodAutoscalerBehavior // maxReplicas is the upper limit for the number of replicas to which the // autoscaler can scale up. It cannot be less that minReplicas. "maxReplicas"!: int32 & int // metrics contains the specifications for which to use to calculate the desired // replica count (the maximum replica count across all metrics will be used). // The desired replica count is calculated multiplying the ratio between the // target value and the current value by the current number of pods. Ergo, // metrics used must decrease as the pod count is increased, and vice-versa. // See the individual metric source types for more information about how each // type of metric must respond. If not set, the default metric will be set to // 80% average CPU utilization. "metrics"?: [...#MetricSpec] // minReplicas is the lower limit for the number of replicas to which the // autoscaler can scale down. It defaults to 1 pod. minReplicas is allowed to // be 0 if the alpha feature gate HPAScaleToZero is enabled and at least one // Object or External metric is configured. Scaling is active as long as at // least one metric value is available. "minReplicas"?: int32 & int // scaleTargetRef points to the target resource to scale, and is used to the // pods for which metrics should be collected, as well as to actually change // the replica count. "scaleTargetRef"!: #CrossVersionObjectReference } // HorizontalPodAutoscalerStatus describes the current status of a horizontal pod autoscaler. #HorizontalPodAutoscalerStatus: { // conditions is the set of conditions required for this autoscaler to scale its // target, and indicates whether or not those conditions are met. "conditions"?: [...#HorizontalPodAutoscalerCondition] // currentMetrics is the last read state of the metrics used by this autoscaler. "currentMetrics"?: [...#MetricStatus] // currentReplicas is current number of replicas of pods managed by this // autoscaler, as last seen by the autoscaler. "currentReplicas"?: int32 & int // desiredReplicas is the desired number of replicas of pods managed by this // autoscaler, as last calculated by the autoscaler. "desiredReplicas"!: int32 & int // lastScaleTime is the last time the HorizontalPodAutoscaler scaled the number // of pods, used by the autoscaler to control how often the number of pods is // changed. "lastScaleTime"?: v1.#Time // observedGeneration is the most recent generation observed by this autoscaler. "observedGeneration"?: int64 & int } // MetricIdentifier defines the name and optionally selector for a metric #MetricIdentifier: { // name is the name of the given metric "name"!: string // selector is the string-encoded form of a standard kubernetes label selector // for the given metric When set, it is passed as an additional parameter to // the metrics server for more specific metrics scoping. When unset, just the // metricName will be used to gather metrics. "selector"?: v1.#LabelSelector } // MetricSpec specifies how to scale based on a single metric (only `type` and // one other matching field should be set at once). #MetricSpec: { // containerResource refers to a resource metric (such as those specified in // requests and limits) known to Kubernetes describing a single container in // each pod of the current scale target (e.g. CPU or memory). Such metrics are // built in to Kubernetes, and have special scaling options on top of those // available to normal per-pod metrics using the "pods" source. "containerResource"?: #ContainerResourceMetricSource // external refers to a global metric that is not associated with any Kubernetes // object. It allows autoscaling based on information coming from components // running outside of cluster (for example length of queue in cloud messaging // service, or QPS from loadbalancer running outside of cluster). "external"?: #ExternalMetricSource // object refers to a metric describing a single kubernetes object (for example, // hits-per-second on an Ingress object). "object"?: #ObjectMetricSource // pods refers to a metric describing each pod in the current scale target (for // example, transactions-processed-per-second). The values will be averaged // together before being compared to the target value. "pods"?: #PodsMetricSource // resource refers to a resource metric (such as those specified in requests and // limits) known to Kubernetes describing each pod in the current scale target // (e.g. CPU or memory). Such metrics are built in to Kubernetes, and have // special scaling options on top of those available to normal per-pod metrics // using the "pods" source. "resource"?: #ResourceMetricSource // type is the type of metric source. It should be one of "ContainerResource", // "External", "Object", "Pods" or "Resource", each mapping to a matching field // in the object. "type"!: string } // MetricStatus describes the last-read state of a single metric. #MetricStatus: { // container resource refers to a resource metric (such as those specified in // requests and limits) known to Kubernetes describing a single container in // each pod in the current scale target (e.g. CPU or memory). Such metrics are // built in to Kubernetes, and have special scaling options on top of those // available to normal per-pod metrics using the "pods" source. "containerResource"?: #ContainerResourceMetricStatus // external refers to a global metric that is not associated with any Kubernetes // object. It allows autoscaling based on information coming from components // running outside of cluster (for example length of queue in cloud messaging // service, or QPS from loadbalancer running outside of cluster). "external"?: #ExternalMetricStatus // object refers to a metric describing a single kubernetes object (for example, // hits-per-second on an Ingress object). "object"?: #ObjectMetricStatus // pods refers to a metric describing each pod in the current scale target (for // example, transactions-processed-per-second). The values will be averaged // together before being compared to the target value. "pods"?: #PodsMetricStatus // resource refers to a resource metric (such as those specified in requests and // limits) known to Kubernetes describing each pod in the current scale target // (e.g. CPU or memory). Such metrics are built in to Kubernetes, and have // special scaling options on top of those available to normal per-pod metrics // using the "pods" source. "resource"?: #ResourceMetricStatus // type is the type of metric source. It will be one of "ContainerResource", // "External", "Object", "Pods" or "Resource", each corresponds to a matching // field in the object. "type"!: string } // MetricTarget defines the target value, average value, or average utilization of a specific metric #MetricTarget: { // averageUtilization is the target value of the average of the resource metric // across all relevant pods, represented as a percentage of the requested value // of the resource for the pods. Currently only valid for Resource metric // source type "averageUtilization"?: int32 & int // averageValue is the target value of the average of the metric across all // relevant pods (as a quantity) "averageValue"?: resource.#Quantity // type represents whether the metric type is Utilization, Value, or AverageValue "type"!: string // value is the target value of the metric (as a quantity). "value"?: resource.#Quantity } // MetricValueStatus holds the current value for a metric #MetricValueStatus: { // currentAverageUtilization is the current value of the average of the resource // metric across all relevant pods, represented as a percentage of the // requested value of the resource for the pods. "averageUtilization"?: int32 & int // averageValue is the current value of the average of the metric across all // relevant pods (as a quantity) "averageValue"?: resource.#Quantity // value is the current value of the metric (as a quantity). "value"?: resource.#Quantity } // ObjectMetricSource indicates how to scale on a metric describing a kubernetes // object (for example, hits-per-second on an Ingress object). #ObjectMetricSource: { // describedObject specifies the descriptions of a object,such as kind,name apiVersion "describedObject"!: #CrossVersionObjectReference // metric identifies the target metric by name and selector "metric"!: #MetricIdentifier // target specifies the target value for the given metric "target"!: #MetricTarget } // ObjectMetricStatus indicates the current value of a metric describing a // kubernetes object (for example, hits-per-second on an Ingress object). #ObjectMetricStatus: { // current contains the current value for the given metric "current"!: #MetricValueStatus // DescribedObject specifies the descriptions of a object,such as kind,name apiVersion "describedObject"!: #CrossVersionObjectReference // metric identifies the target metric by name and selector "metric"!: #MetricIdentifier } // PodsMetricSource indicates how to scale on a metric describing each pod in // the current scale target (for example, transactions-processed-per-second). // The values will be averaged together before being compared to the target // value. #PodsMetricSource: { // metric identifies the target metric by name and selector "metric"!: #MetricIdentifier // target specifies the target value for the given metric "target"!: #MetricTarget } // PodsMetricStatus indicates the current value of a metric describing each pod // in the current scale target (for example, // transactions-processed-per-second). #PodsMetricStatus: { // current contains the current value for the given metric "current"!: #MetricValueStatus // metric identifies the target metric by name and selector "metric"!: #MetricIdentifier } // ResourceMetricSource indicates how to scale on a resource metric known to // Kubernetes, as specified in requests and limits, describing each pod in the // current scale target (e.g. CPU or memory). The values will be averaged // together before being compared to the target. Such metrics are built in to // Kubernetes, and have special scaling options on top of those available to // normal per-pod metrics using the "pods" source. Only one "target" type // should be set. #ResourceMetricSource: { // name is the name of the resource in question. "name"!: string // target specifies the target value for the given metric "target"!: #MetricTarget } // ResourceMetricStatus indicates the current value of a resource metric known // to Kubernetes, as specified in requests and limits, describing each pod in // the current scale target (e.g. CPU or memory). Such metrics are built in to // Kubernetes, and have special scaling options on top of those available to // normal per-pod metrics using the "pods" source. #ResourceMetricStatus: { // current contains the current value for the given metric "current"!: #MetricValueStatus // name is the name of the resource in question. "name"!: string }