diff --git a/deployment/helm/Chart.yaml b/deployment/helm/Chart.yaml new file mode 100644 index 0000000000000000000000000000000000000000..259e84649f2be035e95b7ac6c48f9ce50e8dd5be --- /dev/null +++ b/deployment/helm/Chart.yaml @@ -0,0 +1,6 @@ +apiVersion: v1 +appVersion: v1.0.1-rc +description: task deployment +name: task +version: 1.0.1 +icon: "https://www.vereign.com/wp-content/themes/vereign2020/images/vereign-logo.svg" diff --git a/deployment/helm/LICENSE b/deployment/helm/LICENSE new file mode 100644 index 0000000000000000000000000000000000000000..8077ef1f6a1100ae71db8ffe5782e9571819ba6c --- /dev/null +++ b/deployment/helm/LICENSE @@ -0,0 +1,16 @@ +Deployment recipe for TSA task service + + +Copyright 2022 Vereign AG + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. diff --git a/deployment/helm/README.md b/deployment/helm/README.md new file mode 100644 index 0000000000000000000000000000000000000000..13c7ca57b952bd697927ba388c5aaac3d2f41620 --- /dev/null +++ b/deployment/helm/README.md @@ -0,0 +1,59 @@ +# task + +  + +task deployment + +## Values + +| Key | Type | Default | Description | +|-----|------|---------|-------------| +| addresses.cache | string | `"http://cache:8080"` | | +| addresses.policy | string | `"http://policy:8080"` | | +| autoscaling.enabled | bool | `false` | Enable autoscaling | +| autoscaling.maxReplicas | int | `3` | Maximum replicas | +| autoscaling.minReplicas | int | `1` | Minimum replicas | +| autoscaling.targetCPUUtilizationPercentage | int | `70` | CPU target for autoscaling trigger | +| autoscaling.targetMemoryUtilizationPercentage | int | `70` | Memory target for autoscaling trigger | +| image.name | string | `"gaiax/task"` | Image name | +| image.pullPolicy | string | `"IfNotPresent"` | Image pull policy | +| image.pullSecrets | string | `"deployment-key-light"` | Image pull secret when internal image is used | +| image.repository | string | `"eu.gcr.io/vrgn-infra-prj"` | | +| image.sha | string | `""` | Image sha, usually generated by the CI Uses image.tag if empty | +| image.tag | string | `""` | Image tag Uses .Chart.AppVersion if empty | +| ingress.annotations."cert-manager.io/cluster-issuer" | string | `"letsencrypt-production-http"` | | +| ingress.annotations."kubernetes.io/ingress.class" | string | `"nginx"` | | +| ingress.annotations."kubernetes.io/ingress.global-static-ip-name" | string | `"dev-light-public"` | | +| ingress.annotations."nginx.ingress.kubernetes.io/rewrite-target" | string | `"/$2"` | | +| ingress.enabled | bool | `true` | | +| ingress.frontendDomain | string | `"gaiax.vereign.com"` | | +| ingress.frontendTlsSecretName | string | `"cert-manager-tls"` | | +| ingress.tlsEnabled | bool | `true` | | +| log.encoding | string | `"json"` | | +| log.level | string | `"debug"` | | +| metrics.enabled | bool | `true` | Enable prometheus metrics | +| metrics.port | int | `2112` | Port for prometheus metrics | +| mongo.addr | string | `"mongodb://mongodb-mongodb-replicaset.infra:27017/task?replicaSet=rs0&authSource=admin"` | | +| mongo.dbname | string | `"task"` | | +| mongo.pass | string | `""` | | +| mongo.user | string | `""` | | +| name | string | `"task"` | Application name | +| nameOverride | string | `""` | Ovverwrites application name | +| podAnnotations | object | `{}` | | +| replicaCount | int | `1` | Default number of instances to start | +| resources.limits.cpu | string | `"150m"` | | +| resources.limits.memory | string | `"128Mi"` | | +| resources.requests.cpu | string | `"25m"` | | +| resources.requests.memory | string | `"64Mi"` | | +| security.runAsGid | int | `0` | Group used by the apps | +| security.runAsNonRoot | bool | `false` | by default, apps run as non-root | +| security.runAsUid | int | `0` | User used by the apps | +| service.port | int | `8080` | | +| task.http.host | string | `""` | | +| task.http.port | int | `8080` | | +| task.http.timeout.idle | string | `"120s"` | | +| task.http.timeout.read | string | `"10s"` | | +| task.http.timeout.write | string | `"10s"` | | + +---------------------------------------------- +Autogenerated from chart metadata using [helm-docs v1.10.0](https://github.com/norwoodj/helm-docs/releases/v1.10.0) diff --git a/deployment/helm/templates/_helpers.tpl b/deployment/helm/templates/_helpers.tpl new file mode 100644 index 0000000000000000000000000000000000000000..6955ccba19a0e68b2918305e46546f4741fea0aa --- /dev/null +++ b/deployment/helm/templates/_helpers.tpl @@ -0,0 +1,88 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Expand the name of the chart. +*/}} +{{- define "app.name" -}} +{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" -}} +{{- end -}} + +{{/* +Create a fully qualified app name. +We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). +*/}} +{{- define "app.fullname" -}} +{{- $name := default .Chart.Name .Values.nameOverride -}} +{{- printf "%s-%s" $name .Release.Namespace | trunc 63 | trimSuffix "-" -}} +{{- end -}} + +{{/* +Create instance name based on app version and short image sha. +*/}} +{{- define "app.revision" -}} +{{- default .Release.Name .Values.appRel | trunc 63 | trimSuffix "-" -}} +{{- end -}} + +{{/* +Create chart name and version as used by the chart label. +*/}} +{{- define "app.chart" -}} +{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" -}} +{{- end -}} + +{{/* +Common labels +*/}} +{{- define "app.labels" -}} +helm.sh/chart: {{ include "app.chart" . }} +{{ include "app.selectorLabels" . }} +app.kubernetes.io/version: {{ .Chart.AppVersion }} +app.kubernetes.io/managed-by: {{ .Release.Service }} +{{- end -}} + +{{/* +Selector labels +*/}} +{{- define "app.selectorLabels" -}} +app.kubernetes.io/name: {{ include "app.name" . }} +app.kubernetes.io/component: {{ include "app.fullname" . }} +{{- end -}} + +{{/* +Metrics Annotations +*/}} +{{- define "app.metricsAnnotations" -}} +{{- if .Values.metrics.enabled -}} +prometheus.io/scrape: "true" +prometheus.io/port: "{{ .Values.metrics.port }}" +prometheus.io/path: {{ .Values.metrics.path | default "/metrics" | quote }} +{{- end -}} +{{- end -}} + +{{/* +Image string +*/}} +{{- define "app.image" -}} +{{- if .Values.image.sha -}} +{{ .Values.image.repository }}/{{ .Values.image.name }}@{{ .Values.image.sha }} +{{- else -}} +{{ .Values.image.repository }}/{{ .Values.image.name }}:{{ default .Chart.AppVersion .Values.image.tag }} +{{- end -}} +{{- end -}} + +{{/* +Security context +*/}} +{{- define "app.securitycontext" -}} +runAsNonRoot: {{ .Values.security.runAsNonRoot | default false }} +runAsGroup: {{ .Values.security.runAsGid | default 0 }} +runAsUser: {{ .Values.security.runAsUid | default 0 }} +fsGroup: {{ .Values.security.runAsGid | default 0 }} +{{- end -}} + +{{/* +PostgreSQL Connection string URI +*/}} +{{- define "app.postgresql.connectionstring" -}} +postgresql://{{ .Values.connectionManager.database.user }}:{{ .Values.connectionManager.database.password }}@{{ .Values.connectionManager.database.host }}:{{ .Values.connectionManager.database.port }}/{{ .Release.Namespace }}_{{ include "app.name" . | replace "-" "_" }}?schema={{ .Values.connectionManager.database.schema }} +{{- end -}} + diff --git a/deployment/helm/templates/deployment.yaml b/deployment/helm/templates/deployment.yaml new file mode 100644 index 0000000000000000000000000000000000000000..560fe74fa66a7d0548918765cefce09dc38ba3b0 --- /dev/null +++ b/deployment/helm/templates/deployment.yaml @@ -0,0 +1,85 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: "{{ template "app.name" . }}" + namespace: {{ .Release.Namespace }} + labels: + {{- include "app.labels" . | nindent 4 }} + app.kubernetes.io/instance: {{ include "app.revision" . }} + app.kubernetes.io/part-of: rse +spec: + replicas: {{ .Values.replicaCount }} + strategy: + type: RollingUpdate + rollingUpdate: + maxSurge: 1 + maxUnavailable: 0 + selector: + matchLabels: + {{- include "app.selectorLabels" . | nindent 6 }} + template: + metadata: + labels: + {{- include "app.labels" . | nindent 8 }} + annotations: + {{- include "app.metricsAnnotations" . | nindent 8 }} +{{- if .Values.podAnnotations }} +{{ toYaml .Values.podAnnotations | indent 8 }} +{{- end }} + spec: + securityContext: +{{- include "app.securitycontext" . | nindent 8 }} + imagePullSecrets: + - name: {{ .Values.image.pullSecrets }} + containers: + - name: {{ template "app.name" . }} + image: "{{ .Values.image.repository }}/{{ .Values.image.name }}:{{ default .Chart.AppVersion .Values.image.tag }}" + imagePullPolicy: {{ .Values.image.pullPolicy | quote }} + env: + - name: LOG_LEVEL + value: {{ .Values.log.level | default "INFO" }} + - name: LOG_ENCODING + value: {{ .Values.log.encoding | default "json" }} + - name: HTTP_HOST + value: {{ .Values.task.http.host | quote }} + - name: HTTP_PORT + value: {{ .Values.task.http.port | quote }} + - name: HTTP_IDLE_TIMEOUT + value: {{ .Values.task.http.timeout.idle | quote }} + - name: HTTP_READ_TIMEOUT + value: {{ .Values.task.http.timeout.read | quote }} + - name: HTTP_WRITE_TIMEOUT + value: {{ .Values.task.http.timeout.write | quote }} + - name: MONGO_ADDR + value: {{ .Values.mongo.addr | quote }} + - name: MONGO_USER + value: {{ .Values.mongo.user | quote }} + - name: MONGO_PASS + value: {{ .Values.mongo.pass | quote }} + - name: MONGO_DB + value: {{ .Values.mongo.dbname | quote }} + - name: CACHE_ADDR + value: {{ .Values.addresses.cache | quote }} + - name: POLICY_ADDR + value: {{ .Values.addresses.policy | quote }} + {{- if .Values.extraVars }} + {{- toYaml .Values.extraVars | indent 10 }} + {{- end }} + ports: + {{- if .Values.metrics.enabled }} + - name: monitoring + containerPort: {{ .Values.metrics.port }} + {{- end }} + - name: http + containerPort: {{ .Values.task.http.port }} + readinessProbe: + httpGet: + path: /readiness + port: {{ .Values.task.http.port }} + initialDelaySeconds: 5 + periodSeconds: 5 + successThreshold: 2 + failureThreshold: 2 + timeoutSeconds: 5 + resources: +{{ toYaml .Values.resources | indent 10 }} diff --git a/deployment/helm/templates/hpa.yaml b/deployment/helm/templates/hpa.yaml new file mode 100644 index 0000000000000000000000000000000000000000..fc5c29e7463c24756cfa83754e8ab9336be7b8c2 --- /dev/null +++ b/deployment/helm/templates/hpa.yaml @@ -0,0 +1,27 @@ +{{- if .Values.autoscaling.enabled }} +apiVersion: autoscaling/v2 +kind: HorizontalPodAutoscaler +metadata: + labels: + {{- include "app.labels" . | nindent 4 }} + name: {{ template "app.name" . }} + namespace: {{ .Release.Namespace }} +spec: + scaleTargetRef: + apiVersion: apps/v1 + kind: Deployment + name: {{ template "app.name" . }} + minReplicas: {{ .Values.autoscaling.minReplicas }} + maxReplicas: {{ .Values.autoscaling.maxReplicas }} + metrics: +{{- with .Values.autoscaling.targetCPUUtilizationPercentage }} + - type: Resource + resource: + name: cpu +{{- end }} +{{- with .Values.autoscaling.targetMemoryUtilizationPercentage }} + - type: Resource + resource: + name: memory +{{- end }} +{{- end }} \ No newline at end of file diff --git a/deployment/helm/templates/ingress.yaml b/deployment/helm/templates/ingress.yaml new file mode 100644 index 0000000000000000000000000000000000000000..d757af54f3d03c8abb8a5f3016f544e8604cffd4 --- /dev/null +++ b/deployment/helm/templates/ingress.yaml @@ -0,0 +1,29 @@ +{{- if .Values.ingress.enabled }} +apiVersion: networking.k8s.io/v1 +kind: Ingress +metadata: + name: {{ template "app.name" . }} + namespace: {{ .Release.Namespace }} + annotations: +{{ toYaml .Values.ingress.annotations | indent 4 }} + labels: + {{- include "app.labels" . | nindent 4 }} +spec: +{{- if .Values.ingress.tlsEnabled }} + tls: + - hosts: + - {{ .Values.ingress.frontendDomain }} + secretName: {{ .Values.ingress.frontendTlsSecretName }} +{{- end }} + rules: + - host: {{ .Values.ingress.frontendDomain }} + http: + paths: + - path: /{{ .Release.Namespace }}/{{ template "app.name" . }}(/|$)(.*) + pathType: Prefix + backend: + service: + name: {{ template "app.name" . }} + port: + number: {{ .Values.service.port }} +{{- end }} \ No newline at end of file diff --git a/deployment/helm/templates/service.yaml b/deployment/helm/templates/service.yaml new file mode 100644 index 0000000000000000000000000000000000000000..7a01132b230651dce081a92146b4e1339f0bffaa --- /dev/null +++ b/deployment/helm/templates/service.yaml @@ -0,0 +1,15 @@ +apiVersion: v1 +kind: Service +metadata: + name: {{ template "app.name" . }} + namespace: {{ .Release.Namespace }} + labels: + {{- include "app.labels" . | nindent 4 }} +spec: + clusterIP: None + ports: + - name: http + targetPort: {{ .Values.service.port }} + port: {{ .Values.task.http.port }} + selector: + {{- include "app.selectorLabels" . | nindent 4 }} diff --git a/deployment/helm/values-override.yaml b/deployment/helm/values-override.yaml new file mode 100644 index 0000000000000000000000000000000000000000..df425ed96cc4a2e790d0379a250e657d23afb794 --- /dev/null +++ b/deployment/helm/values-override.yaml @@ -0,0 +1,31 @@ +image: + repository: registry.gitlab.com/gaia-x/data-infrastructure-federation-services/tsa + # -- Image name + name: task +mongo: + addr: mongodb+srv://vereign-mongodb-mongodb-svc.gxfs-vereign.svc.cluster.local/policy?ssl=false + user: ENC[AES256_GCM,data:Ax6AHW8=,iv:ExIEokXncj8lY9IR8KTLTNsQ1kzvCT4MStgHoKdshAg=,tag:iY7Btv4DBaceH17Y7mv6ww==,type:str] + pass: ENC[AES256_GCM,data:QCcDftpod8xivG4PFalDHvIOzosnPHo=,iv:Fpc/cHYwZzvpErpMpD54Lhe8q9Qt8PDxk3IbWrza/08=,tag:Rs9F5JNt2swm91joMHN5ug==,type:str] +ingress: + frontendDomain: tsa.gxfs.dev + frontendTlsSecretName: wildcard-gxfs-dev +sops: + kms: [] + gcp_kms: [] + azure_kv: [] + hc_vault: [] + age: + - recipient: age1nrk70nevtmrcgzjunsed43ar6dk3e06qt7tryqqprj9axv4e0djqa0n0cg + enc: | + -----BEGIN AGE ENCRYPTED FILE----- + YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBlbGxYckE3amlRQ1lqYkJ0 + cU9ja0QwOGprdFIxdlREYzV1VjNxc1Z0alhJCnZTenhmSnhjVnh4TG5hK2ROTHpU + ZGNXQ0JBaTlLRFdlRWpiSFVmTHh1aXcKLS0tIGNRUWFYNlNNeGNVMFNZazhKL1JR + dE5CNGpJNXRFaUlQZ0ZxcjVNY1A2T2cKHwckI0mmC/WgP+393YOXerwVCMY5G0mi + mjcwATZFOnCwafIbVq5JhuDCylNw3chuLinXw7OHIzBbDrTKCoyBnQ== + -----END AGE ENCRYPTED FILE----- + lastmodified: "2022-08-08T15:40:04Z" + mac: ENC[AES256_GCM,data:dlZq3RItOFZR9FFH0BpTkT6Eux/DTgpR/9PH3vZWVfcGGDngxov1g067RDd+9qQ1YP13r45c93q7atNX1a/GPWnfW5RvLC8JT8r57SiVydicThNiNgNColFnKTs+E1z7mj4OgKcD8hTk9hK127QEmn1xfMPuRXmPLw80ds0NELk=,iv:VQqow9C9C3mj5am4mBFFb1LrUZhuL3z1S47wdn1nOuM=,tag:QRA73FQqANyaWta19T0QHQ==,type:str] + pgp: [] + encrypted_regex: ^(user|pass)$ + version: 3.7.3 diff --git a/deployment/helm/values.yaml b/deployment/helm/values.yaml new file mode 100644 index 0000000000000000000000000000000000000000..af00562e50f3846249f555a209be1bab6c7844f6 --- /dev/null +++ b/deployment/helm/values.yaml @@ -0,0 +1,116 @@ +# -- Default number of instances to start +replicaCount: 1 +# -- Application name +name: task +# -- Ovverwrites application name +nameOverride: "" + +image: + repository: eu.gcr.io/vrgn-infra-prj + # -- Image name + name: gaiax/task + # -- Image tag + # Uses .Chart.AppVersion if empty + tag: "" + # -- Image sha, usually generated by the CI + # Uses image.tag if empty + sha: "" + # -- Image pull policy + pullPolicy: IfNotPresent + # -- Image pull secret when internal image is used + pullSecrets: deployment-key-light + + +podAnnotations: {} +## +## Pass extra environment variables to the container. +## +# extraVars: +# - name: EXTRA_VAR_1 +# value: extra-var-value-1 +# - name: EXTRA_VAR_2 +# value: extra-var-value-2 +## +## Create new service when true, and use the specified uner name when set to the name specified +## + +resources: + requests: + cpu: 25m + memory: 64Mi + limits: + cpu: 150m + memory: 128Mi + +## Configure pod autoscaling +## + +autoscaling: + # -- Enable autoscaling + enabled: false + # -- Minimum replicas + minReplicas: 1 + # -- Maximum replicas + maxReplicas: 3 + # -- CPU target for autoscaling trigger + targetCPUUtilizationPercentage: 70 + # -- Memory target for autoscaling trigger + targetMemoryUtilizationPercentage: 70 +## +## Prometheus Exporter / Metrics +## + +metrics: + # -- Enable prometheus metrics + enabled: true + # -- Port for prometheus metrics + port: 2112 + +log: + level: "debug" + encoding: json + +## +## Kubernetes [SecurityContext](https://kubernetes.io/docs/tasks/configure-pod-container/security-context/) object. +## + +security: + # -- by default, apps run as non-root + runAsNonRoot: false + # -- User used by the apps + runAsUid: 0 + # -- Group used by the apps + runAsGid: 0 +## +## +service: + port: 8080 + +task: + http: + host: "" + port: 8080 + timeout: + idle: 120s + read: 10s + write: 10s + +mongo: + addr: "mongodb://mongodb-mongodb-replicaset.infra:27017/task?replicaSet=rs0&authSource=admin" + user: "" + pass: "" + dbname: task + +addresses: + policy: http://policy:8080 + cache: http://cache:8080 + +ingress: + enabled: true + annotations: + kubernetes.io/ingress.class: nginx + nginx.ingress.kubernetes.io/rewrite-target: /$2 + tlsEnabled: true + frontendDomain: gaiax.vereign.com + frontendTlsSecretName: cert-manager-tls +