Files
triggerdotdev--trigger.dev/hosting/k8s/helm/templates/supervisor.yaml
T
2026-07-13 13:32:57 +08:00

295 lines
13 KiB
YAML

{{- if .Values.supervisor.serviceAccount.create }}
apiVersion: v1
kind: ServiceAccount
metadata:
name: {{ include "trigger-v4.supervisorServiceAccountName" . }}
labels:
{{- $component := "supervisor" }}
{{- include "trigger-v4.componentLabels" (dict "Chart" .Chart "Release" .Release "Values" .Values "component" $component) | nindent 4 }}
{{- with .Values.supervisor.serviceAccount.annotations }}
annotations:
{{- toYaml . | nindent 4 }}
{{- end }}
{{- end }}
---
{{- if .Values.supervisor.rbac.create }}
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
name: {{ include "trigger-v4.supervisorRoleName" . }}
namespace: {{ default .Release.Namespace .Values.supervisor.config.kubernetes.namespace }}
labels:
{{- $component := "supervisor" }}
{{- include "trigger-v4.componentLabels" (dict "Chart" .Chart "Release" .Release "Values" .Values "component" $component) | nindent 4 }}
rules:
- apiGroups: [""]
resources: ["pods"]
verbs: ["create", "delete", "deletecollection", "get", "list", "watch"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: {{ include "trigger-v4.supervisorRoleName" . }}-binding
namespace: {{ default .Release.Namespace .Values.supervisor.config.kubernetes.namespace }}
labels:
{{- $component := "supervisor" }}
{{- include "trigger-v4.componentLabels" (dict "Chart" .Chart "Release" .Release "Values" .Values "component" $component) | nindent 4 }}
subjects:
- kind: ServiceAccount
name: {{ include "trigger-v4.supervisorServiceAccountName" . }}
namespace: {{ default .Release.Namespace }}
roleRef:
kind: Role
name: {{ include "trigger-v4.supervisorRoleName" . }}
apiGroup: rbac.authorization.k8s.io
{{- end }}
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: {{ include "trigger-v4.fullname" . }}-supervisor
labels:
{{- $component := "supervisor" }}
{{- include "trigger-v4.componentLabels" (dict "Chart" .Chart "Release" .Release "Values" .Values "component" $component) | nindent 4 }}
spec:
replicas: 1
strategy:
type: RollingUpdate
rollingUpdate:
maxUnavailable: 0
maxSurge: 1
selector:
matchLabels:
{{- include "trigger-v4.componentSelectorLabels" (dict "Chart" .Chart "Release" .Release "Values" .Values "component" $component) | nindent 6 }}
template:
metadata:
labels:
{{- include "trigger-v4.componentSelectorLabels" (dict "Chart" .Chart "Release" .Release "Values" .Values "component" $component) | nindent 8 }}
{{- with .Values.supervisor.podAnnotations }}
annotations:
{{- toYaml . | nindent 8 }}
{{- end }}
spec:
serviceAccountName: {{ include "trigger-v4.supervisorServiceAccountName" . }}
securityContext:
fsGroup: 1000
{{- with .Values.supervisor.podSecurityContext }}
{{- toYaml . | nindent 8 }}
{{- end }}
{{- if not .Values.webapp.bootstrap.enabled }}
initContainers:
- name: init-shared
image: busybox:1.35
command: ['sh', '-c', 'mkdir -p /home/node/shared']
securityContext:
runAsUser: 1000
volumeMounts:
- name: shared
mountPath: /home/node/shared
{{- end }}
containers:
- name: supervisor
image: {{ include "trigger-v4.supervisor.image" . }}
imagePullPolicy: {{ .Values.supervisor.image.pullPolicy }}
ports:
- name: workload
containerPort: {{ .Values.supervisor.service.ports.workload }}
protocol: TCP
- name: metrics
containerPort: {{ .Values.supervisor.service.ports.metrics }}
protocol: TCP
{{- if .Values.supervisor.livenessProbe.enabled }}
livenessProbe:
httpGet:
path: /health
port: workload
initialDelaySeconds: {{ .Values.supervisor.livenessProbe.initialDelaySeconds }}
periodSeconds: {{ .Values.supervisor.livenessProbe.periodSeconds }}
timeoutSeconds: {{ .Values.supervisor.livenessProbe.timeoutSeconds }}
failureThreshold: {{ .Values.supervisor.livenessProbe.failureThreshold }}
successThreshold: {{ .Values.supervisor.livenessProbe.successThreshold }}
{{- end }}
{{- if .Values.supervisor.readinessProbe.enabled }}
readinessProbe:
httpGet:
path: /health
port: workload
initialDelaySeconds: {{ .Values.supervisor.readinessProbe.initialDelaySeconds }}
periodSeconds: {{ .Values.supervisor.readinessProbe.periodSeconds }}
timeoutSeconds: {{ .Values.supervisor.readinessProbe.timeoutSeconds }}
failureThreshold: {{ .Values.supervisor.readinessProbe.failureThreshold }}
successThreshold: {{ .Values.supervisor.readinessProbe.successThreshold }}
{{- end }}
{{- if .Values.supervisor.startupProbe.enabled }}
startupProbe:
httpGet:
path: /health
port: workload
initialDelaySeconds: {{ .Values.supervisor.startupProbe.initialDelaySeconds }}
periodSeconds: {{ .Values.supervisor.startupProbe.periodSeconds }}
timeoutSeconds: {{ .Values.supervisor.startupProbe.timeoutSeconds }}
failureThreshold: {{ .Values.supervisor.startupProbe.failureThreshold }}
successThreshold: {{ .Values.supervisor.startupProbe.successThreshold }}
{{- end }}
resources:
{{- toYaml .Values.supervisor.resources | nindent 12 }}
env:
# Core configuration
- name: TRIGGER_API_URL
value: "http://{{ include "trigger-v4.fullname" . }}-webapp:{{ .Values.webapp.service.port }}"
- name: TRIGGER_WORKER_TOKEN
{{- if .Values.webapp.bootstrap.enabled }}
valueFrom:
secretKeyRef:
name: {{ include "trigger-v4.fullname" . }}-worker-token
key: token
{{- else if .Values.supervisor.bootstrap.workerToken.secret.name }}
valueFrom:
secretKeyRef:
name: {{ .Values.supervisor.bootstrap.workerToken.secret.name }}
key: {{ .Values.supervisor.bootstrap.workerToken.secret.key }}
{{- else }}
value: {{ .Values.supervisor.bootstrap.workerToken.value | quote }}
{{- end }}
{{- if or .Values.secrets.enabled .Values.secrets.existingSecret }}
- name: MANAGED_WORKER_SECRET
valueFrom:
secretKeyRef:
name: {{ include "trigger-v4.secretsName" . }}
key: MANAGED_WORKER_SECRET
{{- end }}
# Worker instance configuration
- name: TRIGGER_WORKER_INSTANCE_NAME
valueFrom:
fieldRef:
fieldPath: spec.nodeName
# Kubernetes configuration
- name: KUBERNETES_NAMESPACE
value: {{ default .Release.Namespace .Values.supervisor.config.kubernetes.namespace | quote }}
- name: KUBERNETES_FORCE_ENABLED
value: {{ .Values.supervisor.config.kubernetes.forceEnabled | quote }}
- name: KUBERNETES_WORKER_NODETYPE_LABEL
value: {{ .Values.supervisor.config.kubernetes.workerNodetypeLabel | quote }}
{{- $registryAuthEnabled := false }}
{{- if .Values.registry.deploy }}
{{- $registryAuthEnabled = .Values.registry.auth.enabled }}
{{- else }}
{{- $registryAuthEnabled = .Values.registry.external.auth.enabled }}
{{- end }}
{{- if $registryAuthEnabled }}
- name: KUBERNETES_IMAGE_PULL_SECRETS
value: "{{ include "trigger-v4.fullname" . }}-registry-secret"
{{- end }}
- name: KUBERNETES_EPHEMERAL_STORAGE_SIZE_LIMIT
value: {{ default "10Gi" .Values.supervisor.config.kubernetes.ephemeralStorageSizeLimit | quote }}
- name: KUBERNETES_EPHEMERAL_STORAGE_SIZE_REQUEST
value: {{ default "2Gi" .Values.supervisor.config.kubernetes.ephemeralStorageSizeRequest | quote }}
# Pod cleaner configuration
- name: POD_CLEANER_ENABLED
value: {{ .Values.supervisor.config.podCleaner.enabled | quote }}
- name: POD_CLEANER_BATCH_SIZE
value: {{ .Values.supervisor.config.podCleaner.batchSize | quote }}
- name: POD_CLEANER_INTERVAL_MS
value: {{ .Values.supervisor.config.podCleaner.intervalMs | quote }}
# Failed pod handler
- name: FAILED_POD_HANDLER_ENABLED
value: {{ .Values.supervisor.config.failedPodHandler.enabled | quote }}
- name: FAILED_POD_HANDLER_RECONNECT_INTERVAL_MS
value: {{ .Values.supervisor.config.failedPodHandler.reconnectIntervalMs | quote }}
# Workload API configuration
- name: TRIGGER_WORKLOAD_API_PROTOCOL
value: {{ .Values.supervisor.config.workloadApi.protocol | quote }}
- name: TRIGGER_WORKLOAD_API_DOMAIN
value: "{{ include "trigger-v4.fullname" . }}-supervisor.{{ .Release.Namespace }}.svc.cluster.local"
- name: TRIGGER_WORKLOAD_API_PORT_EXTERNAL
value: {{ .Values.supervisor.config.workloadApi.portExternal | quote }}
- name: TRIGGER_WORKLOAD_API_PORT_INTERNAL
value: {{ .Values.supervisor.config.workloadApi.portInternal | quote }}
- name: TRIGGER_WORKLOAD_API_HOST_INTERNAL
value: {{ .Values.supervisor.config.workloadApi.hostInternal | quote }}
- name: TRIGGER_WORKLOAD_API_ENABLED
value: {{ .Values.supervisor.config.workloadApi.enabled | quote }}
# Dequeue configuration
- name: TRIGGER_DEQUEUE_ENABLED
value: {{ .Values.supervisor.config.dequeue.enabled | quote }}
- name: TRIGGER_DEQUEUE_INTERVAL_MS
value: {{ .Values.supervisor.config.dequeue.intervalMs | quote }}
- name: TRIGGER_DEQUEUE_MAX_RUN_COUNT
value: {{ .Values.supervisor.config.dequeue.maxRunCount | quote }}
- name: TRIGGER_DEQUEUE_IDLE_INTERVAL_MS
value: {{ .Values.supervisor.config.dequeue.idleIntervalMs | quote }}
# Heartbeat configuration
- name: RUNNER_HEARTBEAT_INTERVAL_SECONDS
value: {{ .Values.supervisor.config.runner.heartbeatIntervalSeconds | quote }}
- name: RUNNER_SNAPSHOT_POLL_INTERVAL_SECONDS
value: {{ .Values.supervisor.config.runner.snapshotPollIntervalSeconds | quote }}
# Metrics configuration
- name: METRICS_ENABLED
value: {{ .Values.supervisor.config.metrics.enabled | quote }}
- name: METRICS_COLLECT_DEFAULTS
value: {{ .Values.supervisor.config.metrics.collectDefaults | quote }}
- name: METRICS_HOST
value: {{ .Values.supervisor.config.metrics.host | quote }}
- name: METRICS_PORT
value: {{ .Values.supervisor.config.metrics.port | quote }}
# Debug
- name: DEBUG
value: {{ .Values.supervisor.config.debug | quote }}
# OTEL
- name: OTEL_EXPORTER_OTLP_ENDPOINT
value: "http://{{ include "trigger-v4.fullname" . }}-webapp.{{ .Release.Namespace }}.svc.cluster.local:{{ .Values.webapp.service.port }}/otel"
{{- with .Values.supervisor.extraEnvVars }}
{{- toYaml . | nindent 12 }}
{{- end }}
{{- if not .Values.webapp.bootstrap.enabled }}
volumeMounts:
- name: shared
mountPath: /home/node/shared
{{- end }}
{{- with .Values.supervisor.securityContext }}
securityContext:
{{- toYaml . | nindent 12 }}
{{- end }}
{{- if not .Values.webapp.bootstrap.enabled }}
volumes:
- name: shared
{{- if .Values.persistence.shared.enabled }}
persistentVolumeClaim:
claimName: {{ include "trigger-v4.fullname" . }}-shared
{{- else }}
emptyDir: {}
{{- end }}
{{- end }}
{{- with .Values.supervisor.nodeSelector }}
nodeSelector:
{{- toYaml . | nindent 8 }}
{{- end }}
{{- with .Values.supervisor.affinity }}
affinity:
{{- toYaml . | nindent 8 }}
{{- end }}
{{- with .Values.supervisor.tolerations }}
tolerations:
{{- toYaml . | nindent 8 }}
{{- end }}
---
apiVersion: v1
kind: Service
metadata:
name: {{ include "trigger-v4.fullname" . }}-supervisor
labels:
{{- $component := "supervisor" }}
{{- include "trigger-v4.componentLabels" (dict "Chart" .Chart "Release" .Release "Values" .Values "component" $component) | nindent 4 }}
spec:
type: {{ .Values.supervisor.service.type }}
ports:
- port: {{ .Values.supervisor.service.ports.workload }}
targetPort: workload
protocol: TCP
name: workload
- port: {{ .Values.supervisor.service.ports.metrics }}
targetPort: metrics
protocol: TCP
name: metrics
selector:
{{- include "trigger-v4.componentSelectorLabels" (dict "Chart" .Chart "Release" .Release "Values" .Values "component" $component) | nindent 4 }}