groups: - name: "Container Images" description: "Image to be used for container" - name: "Container Entrypoint" description: "Configuration of the executable that will be run when the container is started" - name: "Container Environment Variables" description: "Set the environment that will be visible to the container" - name: "Networking" description: "Configure networking for container" - name: "Port Forwarding" description: "Configure ports to forward to workload" - name: "Storage" description: "Persist and share data that is separate from the lifecycle of the container" - name: "Health Check" description: "Define mechanism to periodically probe the container to ensure it's functioning as desired" - name: "Workload Details" description: "Configure how workload should be deployed" - name: "Scaling/Upgrade Policy" description: "Configure how pods are replaced when configuration is upgraded" - name: "Restart Policy" description: "Configure when pod should be restarted in case of failure" - name: "Resource Reservation" description: "Specify resources to be allocated to workload" - name: "Resource Limits" description: "Set CPU/memory limits for Kubernetes Pod" - name: "Portal Configuration" description: "Configure UI web portal" questions: - variable: enableUIPortal label: "Enable WebUI Portal" description: "Enable webui portal for easier access to workload (Only valid for TrueNAS SCALE Bluefin and later)" group: "Portal Configuration" schema: type: boolean default: false - variable: portalDetails label: "WebUI Portal" description: "Configure WebUI Portal" group: "Portal Configuration" schema: show_if: [["enableUIPortal", "=", true]] type: dict attrs: - variable: portalName label: "Portal Name" description: "Specify a UI Portal name to use which would be displayed in the UI" schema: type: string default: "Web Portal" - variable: protocol label: "Protocol for Portal" description: "Specify protocol for portal" schema: type: string default: "http" enum: - value: "http" description: "HTTP Protocol" - value: "https" description: "HTTPS Protocol" - variable: useNodeIP label: "Use Node IP for Portal IP/Domain" schema: type: boolean default: true - variable: host description: "IP/Domain to use for accessing the portal" label: "Portal IP/Domain" schema: show_if: [["useNodeIP", "=", false]] type: string $ref: - "definitions/nodeIP" - variable: port label: "Port" description: "Specify port to be used for Portal access" schema: type: int max: 65535 default: 15000 # Workload type - variable: workloadType description: "Please specify type of workload to deploy" label: "Workload Type" group: "Workload Details" schema: type: string hidden: true default: "Deployment" required: true enum: - value: "Deployment" description: "Deploy a Deployment workload" - value: "Job" description: "Deploy job workload" - value: "CronJob" description: "Deploy cronjob workload" # Cronjob schedule - variable: cronSchedule label: "Cron Schedule" group: "Workload Details" schema: hidden: true type: cron show_if: [["workloadType", "=", "CronJob"]] default: minute: "5" # Image related - variable: image description: "Docker Image Details" label: "Docker Image" group: "Container Images" schema: type: dict required: true attrs: - variable: repository description: "Docker image repository" label: "Image repository" schema: type: string required: true - variable: tag description: "Tag to use for specified image" label: "Image Tag" schema: type: string default: "latest" - variable: pullPolicy description: "Docker Image Pull Policy" label: "Image Pull Policy" schema: type: string default: "IfNotPresent" enum: - value: "IfNotPresent" description: "Only pull image if not present on host" - value: "Always" description: "Always pull image even if present on host" - value: "Never" description: "Never pull image even if it's not present on host" # Update strategy - variable: updateStrategy description: "Upgrade Policy" label: "Update Strategy" group: "Scaling/Upgrade Policy" schema: type: string show_if: [["workloadType", "=", "Deployment"]] default: "Recreate" enum: - value: "RollingUpdate" description: "Create new pods and then kill old ones" - value: "Recreate" description: "Kill existing pods before creating new ones" # Restart Policy - variable: jobRestartPolicy description: "Restart Policy for Job" label: "Restart Policy" group: "Restart Policy" schema: hidden: true type: string default: "OnFailure" show_if: [["workloadType", "!=", "Deployment"]] enum: - value: "OnFailure" description: "Only restart job if it fails" - value: "Never" description: "Never restart job even if it fails" # Configurable CMD / Entrypoint / Environment Variables - variable: containerCommand description: "Commands to execute inside container overriding image CMD default" label: "Container CMD" group: "Container Entrypoint" schema: type: list items: - variable: command description: "Container Command" label: "Command" schema: type: string - variable: containerArgs description: "Specify arguments for container command" label: "Container Args" group: "Container Entrypoint" schema: type: list items: - variable: arg description: "Container Arg" label: "Arg" schema: type: string - variable: containerEnvironmentVariables description: "Container Environment Variables" label: "Container Environment Variables" group: "Container Environment Variables" schema: type: list items: - variable: environmentVariable description: "Container Environment Variable" label: "Container Environment Variable" schema: type: dict attrs: - variable: name description: "Environment Variable Name" label: "Environment Variable Name" schema: type: string required: true - variable: value description: "Environment Variable Value" label: "Environment Variable Value" schema: type: string required: true # Networking options - variable: externalInterfaces description: "Add External Interfaces" label: "Add external Interfaces" group: "Networking" schema: type: list items: - variable: interfaceConfiguration description: "Interface Configuration" label: "Interface Configuration" schema: type: dict $ref: - "normalize/interfaceConfiguration" attrs: - variable: hostInterface description: "Please specify host interface" label: "Host Interface" schema: type: string required: true $ref: - "definitions/interface" - variable: ipam description: "Define how IP Address will be managed" label: "IP Address Management" schema: type: dict required: true attrs: - variable: type description: "Specify type for IPAM" label: "IPAM Type" schema: type: string required: true enum: - value: "dhcp" description: "Use DHCP" - value: "static" description: "Use static IP" show_subquestions_if: "static" subquestions: - variable: staticIPConfigurations label: "Static IP Addresses" schema: type: list items: - variable: staticIP label: "Static IP" schema: type: ipaddr cidr: true - variable: staticRoutes label: "Static Routes" schema: type: list items: - variable: staticRouteConfiguration label: "Static Route Configuration" schema: type: dict attrs: - variable: destination label: "Destination" schema: type: ipaddr cidr: true required: true - variable: gateway label: "Gateway" schema: type: ipaddr cidr: false required: true - variable: dnsPolicy label: "DNS Policy" description: "Default behaviour is where Pod inherits the name resolution configuration from the node that the pods run on, if None is specified, It allows a Pod to ignore DNS settings from the Kubernetes environment." group: "Networking" schema: type: string default: "Default" enum: - value: "Default" description: "Use Default DNS Policy where Pod will inherit the name resolution configuration from the node." - value: "ClusterFirst" description: > "Kubernetes internal DNS will be prioritised and resolved first. If the domain does not resolve with internal kubernetes DNS, the DNS query will be forwarded to the upstream nameserver inherited from the node. This is useful if the workload needs to access other service(s)/workload(s) using kubernetes internal DNS." - value: "ClusterFirstWithHostNet" description: "For Pods running with hostNetwork and wanting to prioritise internal kubernetes DNS should make use of this policy." - value: "None" description: "Ignore DNS settings from the Kubernetes cluster" - variable: dnsConfig label: "DNS Configuration" group: "Networking" description: "Specify custom DNS configuration which will be applied to the pod" schema: type: dict attrs: - variable: nameservers label: "Nameservers" schema: default: [] type: list items: - variable: nameserver label: "Nameserver" schema: type: string - variable: searches label: "Searches" schema: default: [] type: list items: - variable: search label: "Search Entry" schema: type: string - variable: options label: "DNS Options" schema: type: list items: - variable: optionsEntry label: "Option Entry Configuration" schema: type: dict attrs: - variable: name label: "Option Name" schema: type: string required: true - variable: value label: "Option Value" schema: type: string required: true - variable: hostNetwork label: "Provide access to node network namespace for the workload" group: "Networking" schema: type: boolean default: false show_if: [["externalInterfaces", "=", []]] - variable: hostPortsList label: "Specify host ports for the workload" description: "Only use host ports if scaling of a workload is not required" group: "Networking" schema: show_if: [["updateStrategy", "=", "Recreate"]] type: list hidden: true items: - variable: hostPortConfiguration label: "Host Port Configuration" schema: type: dict attrs: - variable: containerPort label: "Container Port" schema: type: string required: true - variable: hostPort label: "Host Port" schema: type: string required: true - variable: portForwardingList label: "Specify Node ports to forward to workload" group: "Port Forwarding" description: "Specify ports of node and workload to forward traffic from node port to workload port" schema: type: list show_if: [["hostNetwork", "=", false]] items: - variable: portForwarding label: "Port Forwarding Configuration" schema: type: dict attrs: - variable: containerPort label: "Container Port" schema: type: int required: true - variable: nodePort label: "Node Port" schema: type: int required: true min: 9000 max: 65535 - variable: protocol label: "Protocol" schema: type: string default: "TCP" enum: - value: "TCP" description: "TCP Protocol" - value: "UDP" description: "UDP Protocol" # Storage Options # Host path based volumes - variable: hostPathVolumes label: "Host Path Volumes" group: "Storage" schema: type: list items: - variable: hostPathConfiguration label: "Host Path Configuration" schema: type: dict attrs: - variable: hostPath label: "Host Path" schema: type: hostpath required: true - variable: mountPath label: "Mount Path" description: "Path where host path will be mounted inside the pod" schema: type: path required: true - variable: readOnly label: "Read Only" schema: type: boolean default: false - variable: emptyDirVolumes label: "Memory Backed Volumes" description: "Mount memory based temporary volumes for fast access i.e consuming /dev/shm" group: "Storage" schema: type: list items: - variable: emptyDirVolume label: "Memory Backed Volume" schema: type: dict attrs: - variable: mountPath label: "Mount Path" description: "Path where temporary path will be mounted inside the pod" schema: type: path required: true - variable: sizeLimit label: "Size Limit" description: | Optional - Size of the memory backed volume.
Format: 100Mi, 1Gi, 2Gi etc schema: type: string valid_chars: "^([+-]?[0-9.]+)([eEinumkKMGTP]*[-+]?[0-9]*)$" default: "512Mi" # Volumes - variable: volumes label: "Volumes" group: "Storage" schema: type: list items: - variable: volume label: "Volume" schema: type: dict $ref: - "normalize/ixVolume" attrs: - variable: mountPath label: "Mount Path" description: "Path where the volume will be mounted inside the pod" schema: type: path required: true - variable: datasetName label: "Dataset Name" schema: type: string required: true # Pod Probes # Liveness Probe - variable: livenessProbe label: "Liveness Probe" description: "Configure Liveness Probe" group: "Health Check" schema: hidden: true type: dict default: null "null": true attrs: - variable: command label: "Liveness command" description: "Specify a command to determine liveness of pod" schema: type: list required: true items: - variable: commandArg label: "Command Arg" schema: type: string - variable: initialDelaySeconds label: "Seconds Delay" description: "Seconds to delay the first liveness probe" schema: type: int default: 5 - variable: periodSeconds label: "Period Seconds" description: "Specify number of seconds to run liveness probe" schema: type: int default: 10 # Specify GPU configuration - variable: gpuConfiguration label: "GPU Configuration" group: "Resource Reservation" schema: type: dict $ref: - "definitions/gpuConfiguration" attrs: [] - variable: tty label: "Enable TTY" description: "Determines whether containers in a pod runs with TTY enabled. By default pod has it disabled." group: "Workload Details" schema: type: boolean default: false - variable: stdin label: "Enable STDIN" description: "Determines whether containers in a pod runs with stdin enabled. By default pod has it disabled." group: "Workload Details" schema: type: boolean default: false - variable: securityContext label: "Security Context" group: "Workload Details" schema: type: dict attrs: - variable: privileged label: "Privileged Mode" description: "Determines if any container in a pod can enable privileged mode. By default a container is not allowed to access any devices on the host, but a 'privileged' container is given access to all devices on the host. This allows the container nearly all the same access as processes running on the host." schema: type: boolean default: false - variable: capabilities label: "Capabilities" description: "With Linux capabilities, you can grant certain privileges to a process without granting all the privileges of the root user." schema: type: list items: - variable: capability description: "Add Capability" label: "Add Capability" schema: type: string - variable: enableRunAsUser label: "Configure Container User and Group ID" description: "Configure security context runAsUser and runAsGroup variables" schema: type: boolean default: false show_subquestions_if: true subquestions: - variable: runAsUser label: "Run Container As User" description: "Configure user id for container." schema: type: int default: 568 - variable: runAsGroup label: "Run Container As Group" description: "Configure group id for container." schema: type: int default: 568 - variable: enableResourceLimits label: "Enable Pod resource limits" group: "Resource Limits" schema: type: boolean default: false - variable: cpuLimit label: "CPU Limit" description: "CPU resource limit allow plain integer values with suffix m(milli) e.g 1000m, 100." group: "Resource Limits" schema: type: string show_if: [["enableResourceLimits", "=", true]] valid_chars: "^\\d+(?:\\.\\d+(?!.*m$)|m?$)" default: "4000m" - variable: memLimit label: "Memory Limit" group: "Resource Limits" description: "Memory limits is specified by number of bytes. Followed by quantity suffix like E,P,T,G,M,k and Ei,Pi,Ti,Mi,Gi,Ki can also be used. e.g 129e6, 129M, 128974848000m, 123Mi" schema: type: string show_if: [["enableResourceLimits", "=", true]] valid_chars: "^([+-]?[0-9.]+)([eEinumkKMGTP]*[-+]?[0-9]*)$" default: "8Gi"