diff --git a/devops/gc/deploy/README.md b/devops/gc/deploy/README.md index 91b1d6f7aca2fae3bcd86aab7678538dcc81ec72..e579739b2dc66b2d4e8779a23eddbeca69eb4f46 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 @@ -84,6 +86,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 | `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 | `10` | only if `global.autoscaling` is true and `global.tier` is PROD +**hpa.maxReplicas** | maximum number of replicas | integer | `20` | 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 | `40` | 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 | `25` | only if `global.autoscaling` is true and `global.tier` is PROD +**limits.tokensPerFill** | number of new tokens allowed every fillInterval | integer | `25` | 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/hpa.yaml b/devops/gc/deploy/templates/hpa.yaml new file mode 100644 index 0000000000000000000000000000000000000000..c7dd904696aad3307208817f588c7f883e2f6981 --- /dev/null +++ b/devops/gc/deploy/templates/hpa.yaml @@ -0,0 +1,43 @@ +{{- 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 }} diff --git a/devops/gc/deploy/templates/rate-limit.yaml b/devops/gc/deploy/templates/rate-limit.yaml new file mode 100644 index 0000000000000000000000000000000000000000..f60af4b183dd67b9ed729c26a911b326c7df65f5 --- /dev/null +++ b/devops/gc/deploy/templates/rate-limit.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.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 }} diff --git a/devops/gc/deploy/values.yaml b/devops/gc/deploy/values.yaml index c506d6f8cab8f019ae8540e834c4510d6005fccd..e21084b51a4eb440a54838b94431e5a18d40b87e 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: # configmaps @@ -45,3 +47,20 @@ istio: proxyCPULimit: "200m" proxyMemory: "50Mi" proxyMemoryLimit: "256Mi" + +hpa: + minReplicas: 10 + maxReplicas: 20 + targetType: "AverageValue" + targetValue: 40 # rps*0.85*2 + behaviorScaleUpStabilizationWindowSeconds: 10 + behaviorScaleUpPoliciesValue: 50 + behaviorScaleUpPoliciesPeriodSeconds: 15 + behaviorScaleDownStabilizationWindowSeconds: 60 + behaviorScaleDownPoliciesValue: 25 + behaviorScaleDownPoliciesPeriodSeconds: 60 + +local_ratelimit: + max_tokens: 25 # rps + tokens_per_fill: 25 + fill_interval: "1s"