Schedule a Job
The guides above provide examples on how to configure workloads of the type service.Service
, which is typically used for long-running web applications that should never go down. Alternatively, you could also schedule another kind of workload profile, namely wl.Job
which corresponds to a one-off or recurring execution of tasks that run to completion and then stop.
Prerequisitesโ
Please refer to the prerequisites in the guide for scheduling a job.
The example below also requires you to have initialized the project using the kusion workspace create
and kusion init
command, which will create a workspace and also generate a kcl.mod
file under the stack directory.
Managing Workspace Configurationโ
In the first guide in this series, we introduced a step to initialize a workspace with an empty configuration. The same empty configuration will still work in this guide, no changes are required there. Alternatively, if you have updated your workspace config in the previous guides, no changes need to be made either.
However, if you (or the platform team) would like to set default values for the workloads to standardize the behavior of applications in the dev
workspace, you can do so by updating the ~/dev.yaml
:
modules:
service:
default:
replicas: 3
labels:
label-key: label-value
annotations:
annotation-key: annotation-value
Please note that the replicas
in the workspace configuration only works as a default value and will be overridden by the value set in the application configuration.
The workspace configuration need to be updated with the command:
kusion workspace update dev -f ~/dev.yaml
For a full reference of what can be configured in the workspace level, please see the workspace reference.
Exampleโ
To schedule a job with cron expression, update simple-service/dev/kcl.mod
and simple-service/dev/main.k
to the following:
simple-service/dev/kcl.mod
:
[package]
name = "simple-service"
version = "0.1.0"
[dependencies]
kam = { git = "https://github.com/KusionStack/kam.git", tag = "0.2.0" }
job = { oci = "oci://ghcr.io/kusionstack/job", tag = "0.1.0" }
network = { oci = "oci://ghcr.io/kusionstack/network", tag = "0.2.0" }
[profile]
entries = ["main.k"]
simple-service/dev/main.k
:
import kam.v1.app_configuration as ac
import job
import job.container as c
helloworld: ac.AppConfiguration {
workload: job.Job {
containers: {
"busybox": c.Container {
# The target image
image: "busybox:1.28"
# Run the following command as defined
command: ["/bin/sh", "-c", "echo hello"]
}
}
# Run every minute.
schedule: "* * * * *"
}
}
The KCL snippet above schedules a job. Alternatively, if you want a one-time job without cron, simply remove the schedule
from the configuration.
You can find the full example in here in the konfig repo.
Applyingโ
Re-run steps in Applying and schedule the job. Your output might look like one of the following:
If you are starting from scratch, all resources are created on the spot:
$ kusion apply
โ๏ธ Generating Spec in the Stack dev...
Stack: dev ID Action
* โโ v1:Namespace:simple-service Create
* โโ batch/v1:CronJob:simple-service:simple-service-dev-helloworld Create
? Do you want to apply these diffs? yes
Start applying diffs ...
SUCCESS Create v1:Namespace:simple-service success
SUCCESS Create batch/v1:CronJob:simple-service:helloworld-dev-helloworld success
Create batch/v1:CronJob:simple-service:simple-service-dev-helloworld success [2/2] โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ 100% | 0s
Apply complete! Resources: 2 created, 0 updated, 0 deleted.
If you are starting from the last guide which configures an opsrule
, the output looks like the following which destroys the Deployment
and Service
and replace it with a CronJob
:
$ kusion apply
โ๏ธ Generating Spec in the Stack dev...
Stack: dev ID Action
* โโ v1:Namespace:simple-service UnChanged
* โโ batch/v1:CronJob:simple-service:simple-service-dev-helloworld Create
* โโ apps/v1:Deployment:simple-service:simple-service-dev-helloworld Delete
* โโ v1:Service:simple-service:simple-service-dev-helloworld-private Delete
? Do you want to apply these diffs? yes
Start applying diffs ...
SUCCESS UnChanged v1:Namespace:simple-service, skip
SUCCESS Delete apps/v1:Deployment:simple-service:simple-service-dev-helloworld success
SUCCESS Create batch/v1:CronJob:simple-service:simple-service-dev-helloworld success
SUCCESS Delete v1:Service:simple-service:simple-service-dev-helloworld-private success
Delete v1:Service:simple-service:simple-service-dev-helloworld-private success [4/4] โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ 100% | 0s
Apply complete! Resources: 1 created, 0 updated, 2 deleted.
Validationโ
We can verify the job has now been scheduled:
$ kubectl get cronjob -n simple-service
NAME SCHEDULE SUSPEND ACTIVE LAST SCHEDULE AGE
simple-service-dev-helloworld * * * * * False 0 <none> 2m18s
Verify the job has been triggered after the minute mark since we scheduled it to run every minute:
$ kubectl get job -n simple-service
NAME COMPLETIONS DURATION AGE
simple-service-dev-helloworld-28415748 1/1 5s 11s