Skip to content
Snippets Groups Projects
Commit addd9ccc authored by Vadzim Beuzo  [EPAM / GCP]'s avatar Vadzim Beuzo [EPAM / GCP] Committed by Oleksandr Kosse (EPAM)
Browse files

GONRG-10266-Bring-Istio-Autoscaling-to-core-services-Part3

parent d7d0bcd9
No related branches found
No related tags found
1 merge request!705GONRG-10266-Bring-Istio-Autoscaling-to-core-services-Part3
......@@ -34,6 +34,8 @@ You need to set variables in **values.yaml** file using any code editor. Some of
**global.onPremEnabled** | whether on-prem is enabled | boolean | `false` | yes
**global.limitsEnabled** | whether CPU and memory limits are enabled | boolean | `true` | yes
**global.logLevel** | severity of logging level | string | `ERROR` | yes
**global.tier** | Only PROD must be used to enable autoscaling | string | - | no
**global.autoscaling** | enables horizontal pod autoscaling, when tier=PROD | boolean | `true` | yes
### Configmap variables
......@@ -79,6 +81,29 @@ You need to set variables in **values.yaml** file using any code editor. Some of
**istio.proxyMemory** | memory request for Envoy sidecars | string | `100Mi` | yes
**istio.proxyMemoryLimit** | memory limit for Envoy sidecars | string | `256Mi` | yes
### Horizontal Pod Autoscaling (HPA) variables (works only if tier=PROD and autoscaling=true)
| Name | Description | Type | Default |Required |
|------|-------------|------|---------|---------|
**hpa.minReplicas** | minimum number of replicas | integer | `6` | only if `global.autoscaling` is true and `global.tier` is PROD
**hpa.maxReplicas** | maximum number of replicas | integer | `15` | only if `global.autoscaling` is true and `global.tier` is PROD
**hpa.targetType** | type of measurements: AverageValue or Value | string | `AverageValue` | only if `global.autoscaling` is true and `global.tier` is PROD
**hpa.targetValue** | threshold value to trigger the scaling up | integer | `30` | only if `global.autoscaling` is true and `global.tier` is PROD
**hpa.behaviorScaleUpStabilizationWindowSeconds** | time to start implementing the scale up when it is triggered | integer | `10` | only if `global.autoscaling` is true and `global.tier` is PROD
**hpa.behaviorScaleUpPoliciesValue** | the maximum number of new replicas to create (in percents from current state)| integer | `50` | only if `global.autoscaling` is true and `global.tier` is PROD
**hpa.behaviorScaleUpPoliciesPeriodSeconds** | pause for every new scale up decision | integer | `15` | only if `global.autoscaling` is true and `global.tier` is PROD
**hpa.behaviorScaleDownStabilizationWindowSeconds** | time to start implementing the scale down when it is triggered | integer | `60` | only if `global.autoscaling` is true and `global.tier` is PROD
**hpa.behaviorScaleDownPoliciesValue** | the maximum number of replicas to destroy (in percents from current state) | integer | `25` | only if `global.autoscaling` is true and `global.tier` is PROD
**hpa.behaviorScaleDownPoliciesPeriodSeconds** | pause for every new scale down decision | integer | `60` | only if `global.autoscaling` is true and `global.tier` is PROD
### Limits variables
| Name | Description | Type | Default |Required |
|------|-------------|------|---------|---------|
**limits.maxTokens** | maximum number of requests per fillInterval | integer | `20` | only if `global.autoscaling` is true and `global.tier` is PROD
**limits.tokensPerFill** | number of new tokens allowed every fillInterval | integer | `20` | only if `global.autoscaling` is true and `global.tier` is PROD
**limits.fillInterval** | time interval | string | `1s` | only if `global.autoscaling` is true and `global.tier` is PROD
## Install the Helm chart
Run this command from within this directory:
......
{{- if and (eq .Values.global.tier "PROD") (eq .Values.global.autoscaling true) }}
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: {{ printf "%s-hpa" .Values.conf.appName | quote }}
namespace: {{ .Release.Namespace | quote }}
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: {{ .Values.conf.appName | quote }}
minReplicas: {{ .Values.hpa.minReplicas }}
maxReplicas: {{ .Values.hpa.maxReplicas }}
metrics:
- type: External
external:
metric:
name: istio.io|service|server|request_count
selector:
matchLabels:
metric.labels.destination_workload_name: {{ .Values.conf.appName | quote }}
target:
target:
type: {{ .Values.hpa.targetType | quote }}
{{- if eq .Values.hpa.targetType "AverageValue" }}
averageValue: {{ .Values.hpa.targetValue }}
{{- else if eq .Values.hpa.targetType "Value" }}
value: {{ .Values.hpa.targetValue }}
{{- end }}
behavior:
scaleUp:
stabilizationWindowSeconds: {{ .Values.hpa.behaviorScaleUpStabilizationWindowSeconds }}
policies:
- type: Percent
value: {{ .Values.hpa.behaviorScaleUpPoliciesValue }}
periodSeconds: {{ .Values.hpa.behaviorScaleUpPoliciesPeriodSeconds }}
scaleDown:
stabilizationWindowSeconds: {{ .Values.hpa.behaviorScaleDownStabilizationWindowSeconds }}
policies:
- type: Percent
value: {{ .Values.hpa.behaviorScaleDownPoliciesValue }}
periodSeconds: {{ .Values.hpa.behaviorScaleDownPoliciesPeriodSeconds }}
{{- end }}
{{- if and (eq .Values.global.tier "PROD") (eq .Values.global.autoscaling true) }}
apiVersion: networking.istio.io/v1alpha3
kind: EnvoyFilter
metadata:
name: {{ printf "%s-ratelimit" .Values.conf.appName | quote }}
namespace: {{ .Release.Namespace | quote }}
spec:
workloadSelector:
labels:
app: {{ .Values.conf.appName | quote }}
configPatches:
- applyTo: "HTTP_FILTER"
match:
context: "SIDECAR_INBOUND"
listener:
filterChain:
filter:
name: "envoy.filters.network.http_connection_manager"
patch:
operation: INSERT_BEFORE
value:
name: "envoy.filters.http.local_ratelimit"
typed_config:
'@type': "type.googleapis.com/udpa.type.v1.TypedStruct"
type_url: "type.googleapis.com/envoy.extensions.filters.http.local_ratelimit.v3.LocalRateLimit"
value:
stat_prefix: "http_local_rate_limiter"
enable_x_ratelimit_headers: "DRAFT_VERSION_03"
token_bucket:
max_tokens: {{ .Values.local_ratelimit.max_tokens }}
tokens_per_fill: {{ .Values.local_ratelimit.tokens_per_fill }}
fill_interval: {{ .Values.local_ratelimit.fill_interval | quote}}
filter_enabled:
runtime_key: "local_rate_limit_enabled"
default_value:
numerator: 100
denominator: "HUNDRED"
filter_enforced:
runtime_key: "local_rate_limit_enforced"
default_value:
numerator: 100
denominator: "HUNDRED"
{{- end }}
......@@ -3,6 +3,8 @@ global:
onPremEnabled: false
limitsEnabled: true
logLevel: "ERROR"
tier: ""
autoscaling: true
data:
# Configmaps
......@@ -37,3 +39,21 @@ istio:
proxyCPULimit: "200m"
proxyMemory: "50Mi"
proxyMemoryLimit: "256Mi"
hpa:
enabled: true
minReplicas: 6
maxReplicas: 15
targetType: "AverageValue"
targetValue: 30 # rps*0.85*2
behaviorScaleUpStabilizationWindowSeconds: 10
behaviorScaleUpPoliciesValue: 50
behaviorScaleUpPoliciesPeriodSeconds: 15
behaviorScaleDownStabilizationWindowSeconds: 60
behaviorScaleDownPoliciesValue: 25
behaviorScaleDownPoliciesPeriodSeconds: 60
local_ratelimit:
max_tokens: 20 # rps
tokens_per_fill: 20
fill_interval: "1s"
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment