feat: add helm chart for deploying the app on k8s
This commit is contained in:
		
							parent
							
								
									aaa1eff0fe
								
							
						
					
					
						commit
						cbaa5272ef
					
				
					 13 changed files with 261 additions and 0 deletions
				
			
		
							
								
								
									
										4
									
								
								deploy/k8s/Chart.yaml
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										4
									
								
								deploy/k8s/Chart.yaml
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,4 @@ | |||
| apiVersion: v2 | ||||
| name: backoffice-api | ||||
| description: A Helm chart for Kubernetes | ||||
| version: 0.0.0 | ||||
							
								
								
									
										3
									
								
								deploy/k8s/templates/NOTES.txt
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								deploy/k8s/templates/NOTES.txt
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,3 @@ | |||
| {{- if .Values.ingress.enabled }} | ||||
| URL: https://{{ .Values.ingress.host }} | ||||
| {{- end }} | ||||
							
								
								
									
										8
									
								
								deploy/k8s/templates/config.yaml
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										8
									
								
								deploy/k8s/templates/config.yaml
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,8 @@ | |||
| apiVersion: v1 | ||||
| kind: ConfigMap | ||||
| metadata: | ||||
|   name: {{ .Release.Name }} | ||||
| data: | ||||
|   APP_ENV: "production" | ||||
|   APP_PORT: {{ .Values.config.port | quote }} | ||||
|   DATABASE_URL_FILE: "/etc/backoffice-api/secrets/database_url" | ||||
							
								
								
									
										65
									
								
								deploy/k8s/templates/deployment.yaml
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										65
									
								
								deploy/k8s/templates/deployment.yaml
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,65 @@ | |||
| apiVersion: apps/v1 | ||||
| kind: Deployment | ||||
| metadata: | ||||
|   name: {{ .Release.Name }} | ||||
|   labels: | ||||
|     app.kubernetes.io/name: {{ .Chart.Name }} | ||||
|     app.kubernetes.io/instance: {{ .Release.Name }} | ||||
|     app.kubernetes.io/component: "backend-api" | ||||
| spec: | ||||
|   replicas: {{ .Values.replicas }} | ||||
|   strategy: | ||||
|     type: RollingUpdate | ||||
|     rollingUpdate: | ||||
|       maxSurge: 0 | ||||
|       maxUnavailable: 1 | ||||
|   selector: | ||||
|     matchLabels: | ||||
|       app.kubernetes.io/name: {{ .Chart.Name }} | ||||
|       app.kubernetes.io/instance: {{ .Release.Name }} | ||||
|       app.kubernetes.io/component: "backend-api" | ||||
|   template: | ||||
|     metadata: | ||||
|       annotations: | ||||
|         checksum/config: {{ include (print $.Template.BasePath "/config.yaml") . | sha256sum }} | ||||
|         checksum/secret: {{ include (print $.Template.BasePath "/secrets.yaml") . | sha256sum }} | ||||
|       labels: | ||||
|         app.kubernetes.io/name: {{ .Chart.Name }} | ||||
|         app.kubernetes.io/instance: {{ .Release.Name }} | ||||
|         app.kubernetes.io/component: "backend-api" | ||||
|     spec: | ||||
|       automountServiceAccountToken: false | ||||
|       {{- with .Values.image.pullSecrets }} | ||||
|       imagePullSecrets: | ||||
|         {{- toYaml . | nindent 8 }} | ||||
|       {{- end }} | ||||
|       containers: | ||||
|         - name: api | ||||
|           image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}" | ||||
|           imagePullPolicy: Always | ||||
|           ports: | ||||
|             - name: {{ .Values.service.port.name }} | ||||
|               containerPort: {{ .Values.config.port }} | ||||
|               protocol: TCP | ||||
|           #          livenessProbe: | ||||
|           #            httpGet: | ||||
|           #              path: /livez | ||||
|           #              port: {{ .Values.service.port.name }} | ||||
|           #          readinessProbe: | ||||
|           #            httpGet: | ||||
|           #              path: /readyz | ||||
|           #              port: {{ .Values.service.port.name }} | ||||
|           resources: | ||||
|             {{- toYaml .Values.resources | nindent 12 }} | ||||
|           envFrom: | ||||
|             - configMapRef: | ||||
|                 name: {{ .Release.Name }} | ||||
|           volumeMounts: | ||||
|             - mountPath: /etc/backoffice-api/secrets | ||||
|               name: secrets | ||||
|               readOnly: true | ||||
|       volumes: | ||||
|         - name: secrets | ||||
|           secret: | ||||
|             secretName: {{ .Release.Name }} | ||||
| 
 | ||||
							
								
								
									
										27
									
								
								deploy/k8s/templates/ingress.yaml
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										27
									
								
								deploy/k8s/templates/ingress.yaml
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,27 @@ | |||
| {{- if .Values.api.ingress.enabled -}} | ||||
| apiVersion: networking.k8s.io/v1 | ||||
| kind: Ingress | ||||
| metadata: | ||||
|   name: {{ .Release.Name }} | ||||
|   annotations: | ||||
|     {{- if .Values.ingress.annotations }} | ||||
|     {{- toYaml .Values.ingress.annotations | nindent 8 }} | ||||
|     {{- end }} | ||||
| spec: | ||||
|   ingressClassName: {{ .Values.ingress.className }} | ||||
|   tls: | ||||
|     - hosts: | ||||
|         - {{ .Values.ingress.host | quote }} | ||||
|       secretName: {{ .Release.Name }}-ingress-tls | ||||
|   rules: | ||||
|     - host: {{ .Values.ingress.host | quote }} | ||||
|       http: | ||||
|         paths: | ||||
|           - path: {{ .Values.ingress.path }} | ||||
|             pathType: {{ .Values.ingress.pathType }} | ||||
|             backend: | ||||
|               service: | ||||
|                 name: {{ .Release.Name }} | ||||
|                 port: | ||||
|                   name: {{ .Values.service.port.name }} | ||||
| {{- end -}} | ||||
							
								
								
									
										46
									
								
								deploy/k8s/templates/migration-job.yaml
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										46
									
								
								deploy/k8s/templates/migration-job.yaml
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,46 @@ | |||
| apiVersion: batch/v1 | ||||
| kind: Job | ||||
| metadata: | ||||
|   name: {{ .Release.Name }}-migrations-{{ now | unixEpoch }} | ||||
|   labels: | ||||
|     app.kubernetes.io/name: {{ .Chart.Name }} | ||||
|     app.kubernetes.io/instance: {{ .Release.Name }} | ||||
|     app.kubernetes.io/component: "database-migrations" | ||||
|     batch.kubernetes.io/job-name: {{ .Release.Name }}-migrations-{{ now | unixEpoch }} | ||||
| spec: | ||||
|   ttlSecondsAfterFinished: 604800 # 1 week in seconds | ||||
|   template: | ||||
|     metadata: | ||||
|       labels: | ||||
|         app.kubernetes.io/name: {{ .Chart.Name }} | ||||
|         app.kubernetes.io/instance: {{ .Release.Name }} | ||||
|         app.kubernetes.io/component: "database-migrations" | ||||
|         batch.kubernetes.io/job-name: {{ .Release.Name }}-migrations-{{ now | unixEpoch }} | ||||
|     spec: | ||||
|       automountServiceAccountToken: false | ||||
|       {{- with .Values.migrations.image.pullSecrets }} | ||||
|       imagePullSecrets: | ||||
|         {{- toYaml . | nindent 8 }} | ||||
|       {{- end }} | ||||
|       containers: | ||||
|         - name: migrations | ||||
|           image: "{{ .Values.migrations.image.repository }}:{{ .Values.migrations.image.tag }}" | ||||
|           command: ["/bin/ash"] | ||||
|           args: | ||||
|             - -c | ||||
|             - | | ||||
|               migrate -path /srv/migrations -database $(cat /etc/backoffice-api/secrets/database_url) up | ||||
|           {{- with .Values.migrations.resources }} | ||||
|           resources: | ||||
|             {{- toYaml . | nindent 12 }} | ||||
|           {{- end }} | ||||
|           volumeMounts: | ||||
|             - mountPath: /etc/backoffice-api/secrets | ||||
|               name: secrets | ||||
|               readOnly: true | ||||
|       volumes: | ||||
|         - name: secrets | ||||
|           secret: | ||||
|             secretName: {{ .Release.Name }}-migrations | ||||
|       restartPolicy: Never | ||||
|   backoffLimit: 0 | ||||
							
								
								
									
										7
									
								
								deploy/k8s/templates/migration-secrets.yaml
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								deploy/k8s/templates/migration-secrets.yaml
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,7 @@ | |||
| apiVersion: v1 | ||||
| kind: Secret | ||||
| metadata: | ||||
|   name: {{ .Release.Name }}-migrations | ||||
| stringData: | ||||
|   database_url: | | ||||
|     {{ .Values.migrations.config.databaseURL }} | ||||
							
								
								
									
										13
									
								
								deploy/k8s/templates/poddisruptionbudget.yaml
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										13
									
								
								deploy/k8s/templates/poddisruptionbudget.yaml
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,13 @@ | |||
| {{- if gt (.Values.replicas | int) 1 -}} | ||||
| apiVersion: policy/v1 | ||||
| kind: PodDisruptionBudget | ||||
| metadata: | ||||
|   name: {{ .Release.Name }} | ||||
| spec: | ||||
|   minAvailable: 1 | ||||
|   selector: | ||||
|     matchLabels: | ||||
|       app.kubernetes.io/name: {{ .Chart.Name }} | ||||
|       app.kubernetes.io/instance: {{ .Release.Name }} | ||||
|       app.kubernetes.io/component: "backend-api" | ||||
| {{- end -}} | ||||
							
								
								
									
										7
									
								
								deploy/k8s/templates/secrets.yaml
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								deploy/k8s/templates/secrets.yaml
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,7 @@ | |||
| apiVersion: v1 | ||||
| kind: Secret | ||||
| metadata: | ||||
|   name: {{ .Release.Name }} | ||||
| stringData: | ||||
|   database_url: | | ||||
|     {{ .Values.config.databaseURL }} | ||||
							
								
								
									
										15
									
								
								deploy/k8s/templates/service.yaml
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										15
									
								
								deploy/k8s/templates/service.yaml
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,15 @@ | |||
| apiVersion: v1 | ||||
| kind: Service | ||||
| metadata: | ||||
|   name: {{ .Release.Name }} | ||||
| spec: | ||||
|   type: {{ .Values.service.type }} | ||||
|   ports: | ||||
|     - port: {{ .Values.service.port.number }} | ||||
|       targetPort: {{ .Values.service.port.name }} | ||||
|       protocol: TCP | ||||
|       name: {{ .Values.service.port.name }} | ||||
|   selector: | ||||
|     app.kubernetes.io/name: {{ .Chart.Name }} | ||||
|     app.kubernetes.io/instance: {{ .Release.Name }} | ||||
|     app.kubernetes.io/component: "backend-api" | ||||
							
								
								
									
										6
									
								
								deploy/k8s/values.staging.yaml
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								deploy/k8s/values.staging.yaml
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,6 @@ | |||
| api: | ||||
|   ingress: | ||||
|     enabled: true | ||||
|     host: staging.backoffice-api.vmdevel.cz | ||||
|     path: / | ||||
|     className: nginx | ||||
							
								
								
									
										9
									
								
								deploy/k8s/values.test.yaml
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								deploy/k8s/values.test.yaml
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,9 @@ | |||
| ingress: | ||||
|   enabled: true | ||||
|   host: backoffice-api.example.com | ||||
|   annotations: | ||||
|     cert-manager.io/cluster-issuer: letsencrypt-staging | ||||
| 
 | ||||
| config: | ||||
|   database: | ||||
|     url: postgres://user:pass@127.0.0.1:5432/db?sslmode=disable | ||||
							
								
								
									
										51
									
								
								deploy/k8s/values.yaml
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										51
									
								
								deploy/k8s/values.yaml
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,51 @@ | |||
| image: | ||||
|   pullSecrets: [] | ||||
|   pullPolicy: IfNotPresent | ||||
|   repository: registry.mareshq.com/hq/backoffice/backoffice-api/api | ||||
|   tag: latest | ||||
| 
 | ||||
| replicas: 2 | ||||
| 
 | ||||
| ingress: | ||||
|   enabled: false | ||||
|   host: example.com | ||||
|   className: nginx | ||||
|   path: / | ||||
|   pathType: Prefix | ||||
|   annotations: {} | ||||
| 
 | ||||
| service: | ||||
|   type: ClusterIP | ||||
|   port: | ||||
|     name: http | ||||
|     number: 80 | ||||
| 
 | ||||
| resources: | ||||
|   limits: | ||||
|     cpu: 200m | ||||
|     memory: 256Mi | ||||
|   requests: | ||||
|     cpu: 200m | ||||
|     memory: 256Mi | ||||
| 
 | ||||
| config: | ||||
|   port: 8080 | ||||
|   databaseURL: "" | ||||
| 
 | ||||
| migrations: | ||||
|   image: | ||||
|     pullSecrets: [] | ||||
|     pullPolicy: IfNotPresent | ||||
|     repository: registry.mareshq.com/hq/backoffice/backoffice-api/migrations | ||||
|     tag: latest | ||||
| 
 | ||||
|   resources: | ||||
|     limits: | ||||
|       cpu: 100m | ||||
|       memory: 128Mi | ||||
|     requests: | ||||
|       cpu: 100m | ||||
|       memory: 128Mi | ||||
| 
 | ||||
|   config: | ||||
|     databaseURL: "" | ||||
		Reference in a new issue