Supports horizontal pod autoscaling (hpa) for backend and frontend pods: - use cpu and memory averages - adjust base memory + cpu for backend - threshold set to 80% cpu and 95% memory utilization by default (configurable in values.yaml) - instead of backend and frontend replicas, set max replicas in values.yaml - only enable hpa if backend_max_replicas or frontend_max_replicas is >1, default to 1 for now
		
			
				
	
	
		
			265 lines
		
	
	
		
			6.4 KiB
		
	
	
	
		
			YAML
		
	
	
	
	
	
			
		
		
	
	
			265 lines
		
	
	
		
			6.4 KiB
		
	
	
	
		
			YAML
		
	
	
	
	
	
---
 | 
						|
apiVersion: apps/v1
 | 
						|
kind: Deployment
 | 
						|
metadata:
 | 
						|
  name: {{ .Values.name }}-backend
 | 
						|
  namespace: {{ .Release.Namespace }}
 | 
						|
 | 
						|
spec:
 | 
						|
  selector:
 | 
						|
    matchLabels:
 | 
						|
      app: {{ .Values.name }}
 | 
						|
      role: backend
 | 
						|
{{- if eq (int .Values.backend_max_replicas) 1 }}
 | 
						|
  replicas: 1
 | 
						|
{{- end }}
 | 
						|
  template:
 | 
						|
    metadata:
 | 
						|
      labels:
 | 
						|
        app: {{ .Values.name }}
 | 
						|
        role: backend
 | 
						|
 | 
						|
      annotations:
 | 
						|
        # force helm to update the deployment each time
 | 
						|
        {{- if not .Values.frontend_only }}
 | 
						|
        "helm.update": {{ randAlphaNum 5 | quote }}
 | 
						|
        {{- end }}
 | 
						|
 | 
						|
    spec:
 | 
						|
      {{- if .Values.main_node_type }}
 | 
						|
      nodeSelector:
 | 
						|
        nodeType: {{ .Values.main_node_type }}
 | 
						|
      {{- end }}
 | 
						|
 | 
						|
      volumes:
 | 
						|
        - name: config-volume
 | 
						|
          configMap:
 | 
						|
            name: shared-job-config
 | 
						|
            items:
 | 
						|
              - key: config.yaml
 | 
						|
                path: config.yaml
 | 
						|
 | 
						|
        - name: ops-configs
 | 
						|
          secret:
 | 
						|
            secretName: ops-configs
 | 
						|
 | 
						|
        - name: app-templates
 | 
						|
          configMap:
 | 
						|
            name: app-templates
 | 
						|
 | 
						|
        - name: email-templates
 | 
						|
          configMap:
 | 
						|
            name: email-templates
 | 
						|
 | 
						|
      containers:
 | 
						|
        - name: api
 | 
						|
          image: {{ .Values.backend_image }}
 | 
						|
          imagePullPolicy: {{ .Values.backend_pull_policy }}
 | 
						|
          command:
 | 
						|
              - gunicorn
 | 
						|
              - btrixcloud.main:app_root
 | 
						|
              - --bind
 | 
						|
              - "0.0.0.0:8000"
 | 
						|
              - --access-logfile
 | 
						|
              - "-"
 | 
						|
              - --workers
 | 
						|
              - "{{ .Values.backend_workers | default 1 }}"
 | 
						|
              - --worker-class
 | 
						|
              - uvicorn.workers.UvicornWorker
 | 
						|
 | 
						|
          envFrom:
 | 
						|
            - configMapRef:
 | 
						|
                name: backend-env-config
 | 
						|
            - secretRef:
 | 
						|
                name: backend-auth
 | 
						|
            - secretRef:
 | 
						|
                name: mongo-auth
 | 
						|
 | 
						|
          env:
 | 
						|
            - name: MOTOR_MAX_WORKERS
 | 
						|
              value: "{{ .Values.backend_mongodb_workers | default 1 }}"
 | 
						|
 | 
						|
          volumeMounts:
 | 
						|
            - name: ops-configs
 | 
						|
              mountPath: /ops-configs/
 | 
						|
 | 
						|
            - name: app-templates
 | 
						|
              mountPath: /app/btrixcloud/templates/
 | 
						|
 | 
						|
            - name: email-templates
 | 
						|
              mountPath: /app/btrixcloud/email-templates/
 | 
						|
 | 
						|
          resources:
 | 
						|
            limits:
 | 
						|
              memory: {{ .Values.backend_memory }}
 | 
						|
 | 
						|
            requests:
 | 
						|
              cpu: {{ .Values.backend_cpu }}
 | 
						|
              memory: {{ .Values.backend_memory }}
 | 
						|
 | 
						|
          startupProbe:
 | 
						|
            httpGet:
 | 
						|
              path: /healthzStartup
 | 
						|
              port: 8000
 | 
						|
            periodSeconds: 5
 | 
						|
            failureThreshold: 60
 | 
						|
            successThreshold: 1
 | 
						|
 | 
						|
          readinessProbe:
 | 
						|
            httpGet:
 | 
						|
              path: /healthz
 | 
						|
              port: 8000
 | 
						|
            initialDelaySeconds: 5
 | 
						|
            periodSeconds: 30
 | 
						|
            failureThreshold: 5
 | 
						|
            successThreshold: 1
 | 
						|
 | 
						|
          livenessProbe:
 | 
						|
            httpGet:
 | 
						|
              path: /healthz
 | 
						|
              port: 8000
 | 
						|
            initialDelaySeconds: 5
 | 
						|
            periodSeconds: 30
 | 
						|
            failureThreshold: 15
 | 
						|
            successThreshold: 1
 | 
						|
 | 
						|
        - name: op
 | 
						|
          image: {{ .Values.backend_image }}
 | 
						|
          imagePullPolicy: {{ .Values.backend_pull_policy }}
 | 
						|
          command:
 | 
						|
              - gunicorn
 | 
						|
              - btrixcloud.main_op:app_root
 | 
						|
              - --bind
 | 
						|
              - "0.0.0.0:{{ .Values.opPort }}"
 | 
						|
              - --access-logfile
 | 
						|
              - "-"
 | 
						|
              - --workers
 | 
						|
              - "{{ .Values.backend_workers | default 1 }}"
 | 
						|
              - --worker-class
 | 
						|
              - uvicorn.workers.UvicornWorker
 | 
						|
 | 
						|
          envFrom:
 | 
						|
            - configMapRef:
 | 
						|
                name: backend-env-config
 | 
						|
            - secretRef:
 | 
						|
                name: backend-auth
 | 
						|
            - secretRef:
 | 
						|
                name: mongo-auth
 | 
						|
 | 
						|
          env:
 | 
						|
            - name: MOTOR_MAX_WORKERS
 | 
						|
              value: "{{ .Values.backend_mongodb_workers | default 1 }}"
 | 
						|
 | 
						|
          volumeMounts:
 | 
						|
            - name: config-volume
 | 
						|
              mountPath: /config
 | 
						|
 | 
						|
            - name: ops-configs
 | 
						|
              mountPath: /ops-configs/
 | 
						|
 | 
						|
            - name: app-templates
 | 
						|
              mountPath: /app/btrixcloud/templates/
 | 
						|
 | 
						|
            - name: email-templates
 | 
						|
              mountPath: /app/btrixcloud/email-templates/
 | 
						|
 | 
						|
          resources:
 | 
						|
            limits:
 | 
						|
              memory: {{ .Values.backend_memory }}
 | 
						|
 | 
						|
            requests:
 | 
						|
              cpu: {{ .Values.backend_cpu }}
 | 
						|
              memory: {{ .Values.backend_memory }}
 | 
						|
 | 
						|
          startupProbe:
 | 
						|
            httpGet:
 | 
						|
              path: /healthz
 | 
						|
              port: {{ .Values.opPort }}
 | 
						|
            initialDelaySeconds: 5
 | 
						|
            periodSeconds: 5
 | 
						|
            failureThreshold: 5
 | 
						|
            successThreshold: 1
 | 
						|
 | 
						|
          readinessProbe:
 | 
						|
            httpGet:
 | 
						|
              path: /healthz
 | 
						|
              port: {{ .Values.opPort }}
 | 
						|
            initialDelaySeconds: 5
 | 
						|
            periodSeconds: 30
 | 
						|
            failureThreshold: 5
 | 
						|
            successThreshold: 1
 | 
						|
 | 
						|
          livenessProbe:
 | 
						|
            httpGet:
 | 
						|
              path: /healthz
 | 
						|
              port: {{ .Values.opPort }}
 | 
						|
            initialDelaySeconds: 5
 | 
						|
            periodSeconds: 30
 | 
						|
            failureThreshold: 15
 | 
						|
            successThreshold: 1
 | 
						|
 | 
						|
 | 
						|
 | 
						|
---
 | 
						|
 | 
						|
apiVersion: v1
 | 
						|
kind: Service
 | 
						|
 | 
						|
metadata:
 | 
						|
  namespace: {{ .Release.Namespace }}
 | 
						|
  name: {{ .Values.name }}-backend
 | 
						|
  labels:
 | 
						|
    app: {{ .Values.name }}
 | 
						|
    role: backend
 | 
						|
 | 
						|
{{- if .Values.service }}
 | 
						|
  {{- if .Values.service.annotations }}
 | 
						|
  annotations:
 | 
						|
  {{- range $key, $val := .Values.service.annotations }}
 | 
						|
    {{ $key }}: {{ $val | quote }}
 | 
						|
  {{- end }}
 | 
						|
  {{- end }}
 | 
						|
{{- end }}
 | 
						|
 | 
						|
spec:
 | 
						|
  selector:
 | 
						|
    app: {{ .Values.name }}
 | 
						|
    role: backend
 | 
						|
 | 
						|
  ports:
 | 
						|
    - protocol: TCP
 | 
						|
      port: 8000
 | 
						|
      name: api
 | 
						|
 | 
						|
    - protocol: TCP
 | 
						|
      port: {{ .Values.opPort }}
 | 
						|
      name: operator
 | 
						|
 | 
						|
{{- if gt (int .Values.backend_max_replicas) 1 }}
 | 
						|
---
 | 
						|
apiVersion: autoscaling/v2
 | 
						|
kind: HorizontalPodAutoscaler
 | 
						|
metadata:
 | 
						|
  name: backend-autoscaler
 | 
						|
spec:
 | 
						|
  scaleTargetRef:
 | 
						|
    apiVersion: apps/v1
 | 
						|
    kind: Deployment
 | 
						|
    name: {{ .Values.name }}-backend
 | 
						|
  minReplicas: 1
 | 
						|
  maxReplicas: {{ .Values.backend_max_replicas }}
 | 
						|
  metrics:
 | 
						|
  - type: Resource
 | 
						|
    resource:
 | 
						|
      name: cpu
 | 
						|
      target:
 | 
						|
        type: Utilization
 | 
						|
        averageUtilization: {{ .Values.backend_avg_cpu_threshold }}
 | 
						|
  - type: Resource
 | 
						|
    resource:
 | 
						|
      name: memory
 | 
						|
      target:
 | 
						|
        type: Utilization
 | 
						|
        averageUtilization: {{ .Values.backend_avg_memory_threshold }}
 | 
						|
{{- end }}
 |