Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

WAPI-23578 Styles API #482

Merged
merged 18 commits into from
Sep 11, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 12 additions & 0 deletions charts/styles-api/Chart.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
apiVersion: v2
name: styles-api
type: application
description: A Helm chart for Kubernetes to deploy API Styles service

version: 1.26.0
appVersion: 0.30.0

maintainers:
- name: 2gis
url: https://github.com/2gis
email: [email protected]
145 changes: 145 additions & 0 deletions charts/styles-api/README.md

Large diffs are not rendered by default.

10 changes: 10 additions & 0 deletions charts/styles-api/templates/NOTES.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
Styles API service is released as "{{ .Release.Name }}" at "{{ .Release.Namespace }}" namespace.

{{ if .Values.api.ingress.enabled }}
You can check service using curl
{{- range $host := .Values.api.ingress.hosts }}
http{{ if $.Values.api.ingress.tls }}s{{ end }}://{{ $host.host }}/healthcheck
{{- end }}
{{- else }}
You can publish api service in your preferred way (ingress, balancer, etc).
{{ end }}
211 changes: 211 additions & 0 deletions charts/styles-api/templates/_helpers.tpl
Original file line number Diff line number Diff line change
@@ -0,0 +1,211 @@
{{- define "styles.name" -}}
{{- .Release.Name | trunc 32 | trimSuffix "-" }}
{{- end }}

{{- define "styles.api.name" -}}
{{ include "styles.name" . }}
{{- end }}

{{- define "styles.worker.name" -}}
{{ include "styles.name" . }}-worker
{{- end }}

{{- define "styles.migrate.name" -}}
{{ include "styles.name" . }}-migrate
{{- end }}

{{- define "styles.secret.deploys.name" -}}
{{ include "styles.name" . }}-secret-deploys
{{- end }}

{{- define "styles.secret.jobs.name" -}}
{{ include "styles.name" . }}-secret-jobs
{{- end }}

{{- define "styles.selectorLabels" -}}
app.kubernetes.io/name: {{ .Chart.Name }}
app.kubernetes.io/instance: {{ .Release.Name }}
{{- end }}

{{- define "styles.labels" -}}
{{ include "styles.selectorLabels" . }}
app.kubernetes.io/version: {{ .Chart.AppVersion | quote }}
{{- end }}

{{- define "styles.api.selectorLabels" -}}
app.kubernetes.io/name: {{ .Chart.Name }}
app.kubernetes.io/instance: {{ .Release.Name }}
{{- end }}

{{- define "styles.api.labels" -}}
{{ include "styles.api.selectorLabels" . }}
app.kubernetes.io/version: {{ .Chart.AppVersion | quote }}
{{- end }}

{{- define "styles.worker.selectorLabels" -}}
app.kubernetes.io/name: {{ .Chart.Name }}-worker
app.kubernetes.io/instance: {{ .Release.Name }}
{{- end }}

{{- define "styles.worker.labels" -}}
{{ include "styles.worker.selectorLabels" . }}
app.kubernetes.io/version: {{ .Chart.AppVersion | quote }}
{{- end }}

{{- define "styles.migrate.labels" -}}
app.kubernetes.io/name: {{ .Chart.Name }}-migrate
app.kubernetes.io/instance: {{ .Release.Name }}
app.kubernetes.io/version: {{ .Chart.AppVersion | quote }}
{{- end }}

{{- define "styles.env.loglevel" -}}
- name: MGS_LOG_LEVEL
value: "{{ .Values.log.level }}"
{{- end }}

{{- define "styles.env.db" -}}
- name: MGS_DB_HOST
value: "{{ required "A valid .Values.postgres.host required" .Values.postgres.host }}"
- name: MGS_DB_PORT
value: "{{ .Values.postgres.port }}"
- name: MGS_DB_NAME
value: "{{ required "A valid .Values.postgres.name required" .Values.postgres.name }}"
- name: MGS_DB_SCHEMA
value: "{{ .Values.postgres.schema }}"
- name: MGS_DB_CONNECTION_TIMEOUT
value: "{{ .Values.postgres.timeout }}"
- name: MGS_DB_CONNECTION_RETRY
value: "{{ .Values.postgres.retry }}"
- name: MGS_DB_USERNAME
value: "{{ required "A valid .Values.postgres.ro.username required" .Values.postgres.username }}"
{{- end}}

{{- define "styles.env.db.deploys" -}}
{{ include "styles.env.db" . }}
- name: MGS_DB_PASSWORD
valueFrom:
secretKeyRef:
name: {{ include "styles.secret.deploys.name" . }}
key: dbPassword
{{- end }}

{{- define "styles.env.db.jobs" -}}
{{ include "styles.env.db" . }}
- name: MGS_DB_PASSWORD
valueFrom:
secretKeyRef:
name: {{ include "styles.secret.jobs.name" . }}
key: dbPassword
{{- end }}

{{- define "styles.env.s3" -}}
- name: MGS_S3_ENDPOINT
value: "{{ required "A valid .Values.s3.host required" .Values.s3.host }}"
- name: MGS_S3_BUCKET
value: "{{ .Values.s3.bucket }}"
- name: MGS_S3_PUBLIC_DOMAIN
value: "{{ .Values.s3.publicDomain }}"
- name: MGS_S3_CONNECT_TIMEOUT
value: "{{ .Values.s3.connectTimeout }}"
- name: MGS_S3_REQUEST_TIMEOUT
value: "{{ .Values.s3.requestTimeout }}"
- name: MGS_S3_RESPONSE_TIMEOUT
value: "{{ .Values.s3.responseTimeout }}"
{{- end}}

{{- define "styles.env.s3.deploys" -}}
{{ include "styles.env.s3" . }}
- name: MGS_S3_ACCESS_KEY
valueFrom:
secretKeyRef:
name: {{ include "styles.secret.deploys.name" . }}
key: s3AccessKey
- name: MGS_S3_SECRET_KEY
valueFrom:
secretKeyRef:
name: {{ include "styles.secret.deploys.name" . }}
key: s3SecretKey
{{- end }}

{{- define "styles.env.api" -}}
{{ include "styles.env.loglevel" . }}
{{ include "styles.env.db.deploys" . }}
{{ include "styles.env.s3.deploys" . }}
{{- end }}

{{- define "styles.env.worker" -}}
{{ include "styles.env.loglevel" . }}
{{ include "styles.env.db.deploys" . }}
{{ include "styles.env.s3.deploys" . }}
{{- end }}

{{- define "styles.env.migrate" -}}
{{ include "styles.env.loglevel" . }}
{{ include "styles.env.db.jobs" . }}
{{- end }}

{{/*
Return the target Kubernetes version
*/}}
{{- define "capabilities.kubeVersion" -}}
{{- if .Values.global }}
{{- if .Values.global.kubeVersion }}
{{- .Values.global.kubeVersion -}}
{{- else }}
{{- default .Capabilities.KubeVersion.Version .Values.kubeVersion -}}
{{- end -}}
{{- else }}
{{- default .Capabilities.KubeVersion.Version .Values.kubeVersion -}}
{{- end -}}
{{- end -}}

{{/*
Return the appropriate apiVersion for Horizontal Pod Autoscaler.
*/}}
{{- define "capabilities.hpa.apiVersion" -}}
{{- if semverCompare "<1.23-0" (include "capabilities.kubeVersion" .) -}}
{{- if .beta2 -}}
{{- print "autoscaling/v2beta2" -}}
{{- else -}}
{{- print "autoscaling/v2beta1" -}}
{{- end -}}
{{- else -}}
{{- print "autoscaling/v2" -}}
{{- end -}}
{{- end -}}

{{- define "styles.env.custom.ca.path" -}}
- name: SSL_CERT_DIR
value: {{ include "styles.custom.ca.mountPath" . }}
{{- end }}

{{- define "styles.custom.ca.mountPath" -}}
{{ .Values.customCAs.certsPath | default "/usr/local/share/ca-certificates" }}
{{- end -}}

{{- define "styles.custom.ca.volumeMounts" -}}
- name: custom-ca
mountPath: {{ include "styles.custom.ca.mountPath" . }}/custom-ca.crt
subPath: custom-ca.crt
readOnly: true
{{- end -}}

{{- define "styles.custom.ca.jobs.volumes" -}}
- name: custom-ca
configMap:
name: {{ include "styles.configmap.jobs.name" . }}
{{- end -}}

{{- define "styles.custom.ca.deploys.volumes" -}}
- name: custom-ca
configMap:
name: {{ include "styles.configmap.deploys.name" . }}
{{- end -}}

{{- define "styles.configmap.jobs.name" -}}
{{ include "styles.name" . }}-configmap-jobs
{{- end -}}

{{- define "styles.configmap.deploys.name" -}}
{{ include "styles.name" . }}-configmap-deploys
{{- end -}}
81 changes: 81 additions & 0 deletions charts/styles-api/templates/api/deployment.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,81 @@
apiVersion: apps/v1
kind: Deployment
metadata:
name: {{ include "styles.api.name" . }}
{{- if or .Values.api.annotations .Values.customCAs.bundle }}
annotations:
{{- if .Values.customCAs.bundle }}
checksum/config: {{ include (print .Template.BasePath "/configmap-deploys.yaml") . | sha256sum }}
{{- end }}
{{- with .Values.api.annotations }}
{{- toYaml . | nindent 4 }}
{{- end }}
{{- end }}
labels:
{{- include "styles.api.labels" . | nindent 4 }}
{{- with .Values.api.labels }}
{{- toYaml . | nindent 4 }}
{{- end }}
spec:
{{- if not .Values.api.hpa.enabled }}
replicas: {{ .Values.api.replicas }}
{{- end }}
revisionHistoryLimit: {{ .Values.api.revisionHistoryLimit }}
strategy:
{{- toYaml .Values.api.strategy | nindent 4 }}
selector:
matchLabels:
{{- include "styles.api.selectorLabels" . | nindent 6 }}
template:
metadata:
annotations:
checksum/config: {{ (include (print $.Template.BasePath "/secret-deploys.yaml") . | fromYaml).data | toYaml | sha256sum }}
{{- with .Values.api.podAnnotations }}
{{- toYaml . | nindent 8 }}
{{- end }}
labels:
{{- include "styles.api.labels" . | nindent 8 }}
{{- with .Values.api.podLabels }}
{{- toYaml . | nindent 8 }}
{{- end }}
spec:
containers:
- name: api
image: {{ required "A valid .Values.dgctlDockerRegistry entry required" .Values.dgctlDockerRegistry }}/{{ .Values.image.repository }}:{{ .Values.image.tag }}
imagePullPolicy: {{ .Values.imagePullPolicy }}
command: [ "mgs", "server" ]
ports:
- name: http
containerPort: 8080
readinessProbe:
httpGet:
path: /healthcheck
port: http
resources:
{{- toYaml .Values.api.resources | nindent 12 }}
env:
{{- include "styles.env.api" . | nindent 12 }}
{{- if .Values.customCAs.bundle }}
volumeMounts:
{{- include "styles.custom.ca.volumeMounts" . | nindent 12 }}
{{- end }}
{{- if .Values.customCAs.bundle }}
volumes:
{{- include "styles.custom.ca.deploys.volumes" . | nindent 8 }}
{{- end }}
{{- with .Values.api.nodeSelector }}
nodeSelector:
{{- toYaml . | nindent 8 }}
{{- end }}
{{- with .Values.api.affinity }}
affinity:
{{- toYaml . | nindent 8 }}
{{- end }}
{{- with .Values.api.tolerations }}
tolerations:
{{- toYaml . | nindent 8 }}
{{- end }}
{{- with .Values.imagePullSecrets }}
imagePullSecrets:
{{- toYaml . | nindent 8 }}
{{- end }}
39 changes: 39 additions & 0 deletions charts/styles-api/templates/api/hpa.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
{{- with .Values.api.hpa }}
{{- if .enabled }}
apiVersion: {{ include "capabilities.hpa.apiVersion" $ }}
kind: HorizontalPodAutoscaler
metadata:
name: {{ include "styles.api.name" $ }}
labels:
{{- include "styles.api.labels" $ | nindent 4 }}
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: {{ include "styles.api.name" $ }}
minReplicas: {{ .minReplicas }}
maxReplicas: {{ .maxReplicas }}
behavior:
scaleUp:
stabilizationWindowSeconds: {{ .scaleUpStabilizationWindowSeconds }}
scaleDown:
stabilizationWindowSeconds: {{ .scaleDownStabilizationWindowSeconds }}
metrics:
{{- with .targetCPUUtilizationPercentage }}
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: {{ . }}
{{- end }}
{{- with .targetMemoryUtilizationPercentage }}
- type: Resource
resource:
name: memory
target:
type: Utilization
averageUtilization: {{ . }}
{{- end }}
{{- end }}
{{- end }}
39 changes: 39 additions & 0 deletions charts/styles-api/templates/api/ingress.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
{{- if .Values.api.ingress.enabled -}}
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: {{ include "styles.api.name" . }}
labels:
{{- include "styles.api.labels" . | nindent 4 }}
{{- with .Values.api.ingress.annotations }}
annotations:
{{- toYaml . | nindent 4 }}
{{- end }}
spec:
ingressClassName: {{ .Values.api.ingress.className }}
{{- if .Values.api.ingress.tls }}
tls:
{{- range .Values.api.ingress.tls }}
- hosts:
{{- range .hosts }}
- {{ . | quote }}
{{- end }}
secretName: {{ .secretName }}
{{- end }}
{{- end }}
rules:
{{- range .Values.api.ingress.hosts }}
- host: {{ .host | quote }}
http:
paths:
{{- range .paths }}
- path: {{ .path }}
pathType: Prefix
backend:
service:
name: {{ include "styles.api.name" $ }}
port:
number: {{ $.Values.api.service.port }}
{{- end }}
{{- end }}
{{- end }}
Loading
Loading