The Dapr sidecar is designed to be a long running process, in the context of a Kubernetes Job this behaviour can block your job completion.
To address this issue the Dapr sidecar has an endpoint to Shutdown
the sidecar.
When running a basic Kubernetes Job you will need to call the /shutdown
endpoint for the sidecar to gracefully stop and the job will be considered Completed
.
When a job is finish without calling Shutdown
your job will be in a NotReady
state with only the daprd
container running endlessly.
Be sure and use the POST HTTP verb when calling the shutdown API.
apiVersion: batch/v1
kind: Job
metadata:
name: job-with-shutdown
spec:
template:
metadata:
annotations:
dapr.io/enabled: "true"
dapr.io/app-id: "with-shutdown"
spec:
containers:
- name: job
image: alpine
command: ["/bin/sh", "-c", "apk --no-cache add curl && sleep 20 && curl -X POST localhost:3500/v1.0/shutdown"]
restartPolicy: Never
You can also call the Shutdown
from any of the Dapr SDK
package main
import (
"context"
"log"
"os"
dapr "github.com/dapr/go-sdk/client"
)
func main() {
client, err := dapr.NewClient()
if err != nil {
log.Panic(err)
}
defer client.Close()
defer client.Shutdown()
// Job
}