app deployment using helm with full per-app customization

Signed-off-by: Pascal Sthamer <pascal+github@sthamer.xyz>
This commit is contained in:
Pascal Sthamer
2025-12-02 12:57:51 +01:00
parent 78f5e6c0b9
commit b6376cf967
7 changed files with 933 additions and 374 deletions
@@ -2695,7 +2695,7 @@
},
"manageAppDeployments": {
"type": "boolean",
"description": "Whether apps are deployed and managed by worker. When disabled, every used app is expected to to be already deployed (see app.deployViaHelm).",
"description": "Whether apps are deployed and managed by worker. When disabled, every used app is expected to to be already deployed (see apps.enabled).",
"default": true
}
}
@@ -2703,6 +2703,168 @@
"app": {
"type": "object",
"properties": {
"image": {
"type": "object",
"properties": {
"registry": {
"type": "string",
"description": "app image registry (defaults to shuffle.appRegistry)",
"default": ""
},
"repository": {
"type": "string",
"description": "app image repository (defaults to shuffle.appBaseImageName)",
"default": ""
},
"tag": {
"type": "string",
"description": "app image tag (defaults to the apps version)",
"default": ""
},
"pullPolicy": {
"type": "string",
"description": "default image pull policy for app deployments. Only effective for helm-deployed apps (see apps.enabled).",
"default": "IfNotPresent"
},
"pullSecrets": {
"type": "array",
"description": "default image pull secrets for app deployments. Only effective for helm-deployed apps (see apps.enabled).",
"default": [],
"items": {}
}
}
},
"replicaCount": {
"type": "number",
"description": "Default number of replicas to deploy for each app. Only effective for helm-deployed apps (see apps.enabled).",
"default": 1
},
"extraContainerPorts": {
"type": "array",
"description": "Optionally specify extra list of additional ports for app containers. Only effective for helm-deployed apps (see apps.enabled).",
"default": [],
"items": {}
},
"livenessProbe": {
"type": "object",
"properties": {
"enabled": {
"type": "boolean",
"description": "Enable livenessProbe on app containers. Only effective for helm-deployed apps (see apps.enabled).",
"default": false
},
"initialDelaySeconds": {
"type": "number",
"description": "Initial delay seconds for livenessProbe",
"default": 0
},
"periodSeconds": {
"type": "number",
"description": "Period seconds for livenessProbe",
"default": 15
},
"timeoutSeconds": {
"type": "number",
"description": "Timeout seconds for livenessProbe",
"default": 1
},
"failureThreshold": {
"type": "number",
"description": "Failure threshold for livenessProbe",
"default": 4
},
"successThreshold": {
"type": "number",
"description": "Success threshold for livenessProbe",
"default": 1
}
}
},
"readinessProbe": {
"type": "object",
"properties": {
"enabled": {
"type": "boolean",
"description": "Enable readinessProbe on app containers. Only effective for helm-deployed apps (see apps.enabled).",
"default": false
},
"initialDelaySeconds": {
"type": "number",
"description": "Initial delay seconds for readinessProbe",
"default": 0
},
"periodSeconds": {
"type": "number",
"description": "Period seconds for readinessProbe",
"default": 5
},
"timeoutSeconds": {
"type": "number",
"description": "Timeout seconds for readinessProbe",
"default": 1
},
"failureThreshold": {
"type": "number",
"description": "Failure threshold for readinessProbe",
"default": 3
},
"successThreshold": {
"type": "number",
"description": "Success threshold for readinessProbe",
"default": 1
}
}
},
"startupProbe": {
"type": "object",
"properties": {
"enabled": {
"type": "boolean",
"description": "Enable startupProbe on app containers. Only effective for helm-deployed apps (see apps.enabled).",
"default": false
},
"initialDelaySeconds": {
"type": "number",
"description": "Initial delay seconds for startupProbe",
"default": 0
},
"periodSeconds": {
"type": "number",
"description": "Period seconds for startupProbe",
"default": 1
},
"timeoutSeconds": {
"type": "number",
"description": "Timeout seconds for startupProbe",
"default": 1
},
"failureThreshold": {
"type": "number",
"description": "Failure threshold for startupProbe",
"default": 60
},
"successThreshold": {
"type": "number",
"description": "Success threshold for startupProbe",
"default": 1
}
}
},
"customLivenessProbe": {
"type": "object",
"description": "Custom livenessProbe that overrides the default one. Only effective for helm-deployed apps (see apps.enabled).",
"default": {}
},
"customReadinessProbe": {
"type": "object",
"description": "Custom readinessProbe that overrides the default one. Only effective for helm-deployed apps (see apps.enabled).",
"default": {}
},
"customStartupProbe": {
"type": "object",
"description": "Custom startupProbe that overrides the default one. Only effective for helm-deployed apps (see apps.enabled).",
"default": {}
},
"resourcesPreset": {
"type": "string",
"description": "Set app container resources according to one common preset (allowed values: none, nano, small, medium, large, xlarge, 2xlarge). This is ignored if app.resources is set (app.resources is recommended for production).",
@@ -2810,6 +2972,273 @@
}
}
},
"command": {
"type": "array",
"description": "Override default app container command (useful when using custom images)",
"default": [],
"items": {}
},
"args": {
"type": "array",
"description": "Override default app container args (useful when using custom images)",
"default": [],
"items": {}
},
"automountServiceAccountToken": {
"type": "boolean",
"description": "Mount Service Account token in app pods. Only effective for helm-deployed apps (see apps.enabled).",
"default": false
},
"hostAliases": {
"type": "array",
"description": "app pods host aliases. Only effective for helm-deployed apps (see apps.enabled).",
"default": [],
"items": {}
},
"deploymentAnnotations": {
"type": "object",
"description": "Annotations for app deployment. Only effective for helm-deployed apps (see apps.enabled).",
"default": {}
},
"podLabels": {
"type": "object",
"description": "Extra labels for app pods. Only effective for helm-deployed apps (see apps.enabled).",
"default": {}
},
"podAnnotations": {
"type": "object",
"description": "Annotations for app pods. Only effective for helm-deployed apps (see apps.enabled).",
"default": {}
},
"podAffinityPreset": {
"type": "string",
"description": "Pod affinity preset. Ignored if `app.affinity` is set. Allowed values: `soft` or `hard`. Only effective for helm-deployed apps (see apps.enabled).",
"default": ""
},
"podAntiAffinityPreset": {
"type": "string",
"description": "Pod anti-affinity preset. Ignored if `app.affinity` is set. Allowed values: `soft` or `hard`. Only effective for helm-deployed apps (see apps.enabled).",
"default": "soft"
},
"nodeAffinityPreset": {
"type": "object",
"properties": {
"type": {
"type": "string",
"description": "Node affinity preset type. Ignored if `app.affinity` is set. Allowed values: `soft` or `hard`. Only effective for helm-deployed apps (see apps.enabled).",
"default": ""
},
"key": {
"type": "string",
"description": "Node label key to match. Ignored if `app.affinity` is set",
"default": ""
},
"values": {
"type": "array",
"description": "Node label values to match. Ignored if `app.affinity` is set",
"default": [],
"items": {}
}
}
},
"affinity": {
"type": "object",
"description": "Affinity for app pods assignment. Only effective for helm-deployed apps (see apps.enabled).",
"default": {}
},
"nodeSelector": {
"type": "object",
"description": "Node labels for app pods assignment. Only effective for helm-deployed apps (see apps.enabled).",
"default": {}
},
"tolerations": {
"type": "array",
"description": "Tolerations for app pods assignment. Only effective for helm-deployed apps (see apps.enabled).",
"default": [],
"items": {}
},
"updateStrategy": {
"type": "object",
"properties": {
"type": {
"type": "string",
"description": "app deployment strategy type. Only effective for helm-deployed apps (see apps.enabled).",
"default": "RollingUpdate"
}
}
},
"priorityClassName": {
"type": "string",
"description": "app pods' priorityClassName. Only effective for helm-deployed apps (see apps.enabled).",
"default": ""
},
"topologySpreadConstraints": {
"type": "array",
"description": "Topology Spread Constraints for app pod assignment spread across your cluster among failure-domains. Only effective for helm-deployed apps (see apps.enabled).",
"default": [],
"items": {}
},
"schedulerName": {
"type": "string",
"description": "Name of the k8s scheduler (other than default) for app pods. Only effective for helm-deployed apps (see apps.enabled).",
"default": ""
},
"terminationGracePeriodSeconds": {
"type": "string",
"description": "Seconds app pods need to terminate gracefully. Only effective for helm-deployed apps (see apps.enabled).",
"default": ""
},
"lifecycleHooks": {
"type": "object",
"description": "for app containers to automate configuration before or after startup. Only effective for helm-deployed apps (see apps.enabled).",
"default": {}
},
"extraEnvVars": {
"type": "array",
"description": "Array with extra environment variables to add to app containers. Only effective for helm-deployed apps (see apps.enabled).",
"default": [],
"items": {}
},
"extraEnvVarsCM": {
"type": "string",
"description": "Name of existing ConfigMap containing extra env vars for app containers. Only effective for helm-deployed apps (see apps.enabled).",
"default": ""
},
"extraEnvVarsSecret": {
"type": "string",
"description": "Name of existing Secret containing extra env vars for app containers. Only effective for helm-deployed apps (see apps.enabled).",
"default": ""
},
"extraVolumes": {
"type": "array",
"description": "Optionally specify extra list of additional volumes for the app pods. Only effective for helm-deployed apps (see apps.enabled).",
"default": [],
"items": {}
},
"extraVolumeMounts": {
"type": "array",
"description": "Optionally specify extra list of additional volumeMounts for the app containers. Only effective for helm-deployed apps (see apps.enabled).",
"default": [],
"items": {}
},
"sidecars": {
"type": "array",
"description": "Add additional sidecar containers to the app pods. Only effective for helm-deployed apps (see apps.enabled).",
"default": [],
"items": {}
},
"initContainers": {
"type": "array",
"description": "Add additional init containers to the app pods. Only effective for helm-deployed apps (see apps.enabled).",
"default": [],
"items": {}
},
"pdb": {
"type": "object",
"properties": {
"create": {
"type": "boolean",
"description": "Enable/disable a Pod Disruption Budget creation. Only effective for helm-deployed apps (see apps.enabled).",
"default": true
},
"minAvailable": {
"type": "string",
"description": "Minimum number/percentage of pods that should remain scheduled",
"default": ""
},
"maxUnavailable": {
"type": "string",
"description": "Maximum number/percentage of pods that may be made unavailable. Defaults to `1` if both `app.pdb.minAvailable` and `app.pdb.maxUnavailable` are empty.",
"default": ""
}
}
},
"autoscaling": {
"type": "object",
"properties": {
"vpa": {
"type": "object",
"properties": {
"enabled": {
"type": "boolean",
"description": "Enable VPA for app pods. Only effective for helm-deployed apps (see apps.enabled).",
"default": false
},
"annotations": {
"type": "object",
"description": "Annotations for VPA resource",
"default": {}
},
"controlledResources": {
"type": "array",
"description": "VPA List of resources that the vertical pod autoscaler can control. Defaults to cpu and memory",
"default": [],
"items": {}
},
"maxAllowed": {
"type": "object",
"description": "VPA Max allowed resources for the pod",
"default": {}
},
"minAllowed": {
"type": "object",
"description": "VPA Min allowed resources for the pod",
"default": {}
},
"updatePolicy": {
"type": "object",
"properties": {
"updateMode": {
"type": "string",
"description": "Autoscaling update policy",
"default": "Auto"
}
}
}
}
},
"hpa": {
"type": "object",
"properties": {
"enabled": {
"type": "boolean",
"description": "Enable HPA for app pods. Only effective for helm-deployed apps (see apps.enabled).",
"default": false
},
"minReplicas": {
"type": "string",
"description": "Minimum number of replicas",
"default": ""
},
"maxReplicas": {
"type": "string",
"description": "Maximum number of replicas",
"default": ""
},
"targetCPU": {
"type": "string",
"description": "Target CPU utilization percentage",
"default": ""
},
"targetMemory": {
"type": "string",
"description": "Target Memory utilization percentage",
"default": ""
}
}
}
}
},
"service": {
"type": "object",
"properties": {
"labels": {
"type": "object",
"description": "Extra labels for app service. Only effective for helm-deployed apps (see apps.enabled).",
"default": {}
}
}
},
"serviceAccount": {
"type": "object",
"properties": {
@@ -2883,6 +3312,11 @@
}
}
},
"mountTmpVolume": {
"type": "boolean",
"description": "Whether a writable /tmp emptyDir volume should be mounted to the app.",
"default": false
},
"exposedContainerPort": {
"type": "number",
"description": "The port that shuffle app containers will listen on for new requests. ",
@@ -2900,6 +3334,61 @@
}
}
},
"apps": {
"type": "object",
"properties": {
"enabled": {
"type": "boolean",
"description": "Whether apps should be deployed using helm.",
"default": false
},
"shuffleTools": {
"type": "object",
"properties": {
"enabled": {
"type": "boolean",
"description": "Whether the shuffle-tools app is enabled",
"default": true
},
"version": {
"type": "string",
"description": "The version of the shuffle-tools app to deploy.",
"default": "1.2.0"
}
}
},
"shuffleSubflow": {
"type": "object",
"properties": {
"enabled": {
"type": "boolean",
"description": "Whether the shuffle-subflow app is enabled",
"default": true
},
"version": {
"type": "string",
"description": "The version of the shuffle-subflow app to deploy.",
"default": "1.1.0"
}
}
},
"http": {
"type": "object",
"properties": {
"enabled": {
"type": "boolean",
"description": "Whether the http app is enabled",
"default": true
},
"version": {
"type": "string",
"description": "The version of the http app to deploy.",
"default": "1.4.0"
}
}
}
}
},
"ingress": {
"type": "object",
"properties": {