diff --git a/devops/gc/deploy/README.md b/devops/gc/deploy/README.md index b1e7858b01a408a39457a4c4d28cf1b0e4c8e1b4..41a44ae5bca36ee11a9246996d51600088333f6f 100644 --- a/devops/gc/deploy/README.md +++ b/devops/gc/deploy/README.md @@ -34,6 +34,8 @@ First you need to set variables in **values.yaml** file using any code editor. S **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 @@ -70,6 +72,29 @@ First you need to set variables in **values.yaml** file using any code editor. S **istio.proxyMemory** | memory request for Envoy sidecars | string | `100Mi` | yes **istio.proxyMemoryLimit** | memory limit for Envoy sidecars | string | `512Mi` | 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 | 80 | 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 | 50 | only if `global.autoscaling` is true and `global.tier` is PROD +**limits.tokensPerFill** | number of new tokens allowed every fillInterval | integer | 50 | 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: diff --git a/devops/gc/deploy/templates/unit-hpa.yaml b/devops/gc/deploy/templates/unit-hpa.yaml new file mode 100644 index 0000000000000000000000000000000000000000..3cda953f2f4691aa6e7210df91773d3d3bced2f3 --- /dev/null +++ b/devops/gc/deploy/templates/unit-hpa.yaml @@ -0,0 +1,42 @@ +{{- 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: + 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 }} diff --git a/devops/gc/deploy/templates/unit-rate-limits.yaml b/devops/gc/deploy/templates/unit-rate-limits.yaml new file mode 100644 index 0000000000000000000000000000000000000000..ddc911c8bc1c66f08dc28d8f0626668d98586ed8 --- /dev/null +++ b/devops/gc/deploy/templates/unit-rate-limits.yaml @@ -0,0 +1,43 @@ +{{- 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.limits.maxTokens }} + tokens_per_fill: {{ .Values.limits.tokensPerFill }} + fill_interval: {{ .Values.limits.fillInterval | 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 }} diff --git a/devops/gc/deploy/values.yaml b/devops/gc/deploy/values.yaml index caa2c2e41eb4339dc0e318e15623892bda54432b..6e3d4a3727a309fe2cc3bf6b756fcfd9d691e072 100644 --- a/devops/gc/deploy/values.yaml +++ b/devops/gc/deploy/values.yaml @@ -7,6 +7,8 @@ global: onPremEnabled: false limitsEnabled: true logLevel: "ERROR" + tier: "" + autoscaling: true data: logLevel: "" @@ -29,3 +31,20 @@ istio: proxyCPULimit: "500m" proxyMemory: "50Mi" proxyMemoryLimit: "512Mi" + +hpa: + minReplicas: 6 + maxReplicas: 15 + targetType: "AverageValue" #Could be AverageValue or Value + targetValue: 120 #60 rps + behaviorScaleUpStabilizationWindowSeconds: 10 + behaviorScaleUpPoliciesValue: 50 + behaviorScaleUpPoliciesPeriodSeconds: 15 + behaviorScaleDownStabilizationWindowSeconds: 60 + behaviorScaleDownPoliciesValue: 25 + behaviorScaleDownPoliciesPeriodSeconds: 60 + +limits: + maxTokens: 70 + tokensPerFill: 70 + fillInterval: "1s"