This demo is made on a windows 10 computer. It shows how to interact with a Kube cluster in python and start a simple job on it and wait for the job to end and get its status/logs. The tricky part is to get the logs since the job object do not directly contains the info and thus, we need to get the pod associated with the job and get the pod logs.
Kube setup (server)
I use the Kube functionality of Docker for windows. Start Kubernetes which is part of Docker for windows
Once the kube cluster is up and running you can interact with it from a terminal (I use PowerShell) that we will call T1 and will be use for the kube server-side interaction.
Create service account
PS C:\Users\charl> kubectl create serviceaccount jobdemo
serviceaccount "jobdemo" created
Get full permission to the SA (not clean but not the goal here)
PS C:\Users\charl> kubectl create clusterrolebinding cluster-admin-binding --clusterrole cluster-admin --serviceaccount default:jobdemo
clusterrolebinding.rbac.authorization.k8s.io "cluster-admin-binding" created
Get secret token of the SA (from the secrets)
PS C:\Users\charl> kubectl get secret jobdemo-token-jk59q -o json … "token": "ZXlKaGJHY2lPaUpTVXpJMU5pSXNJbXRwWkNJNklpSjkuZXlKcGMzTWlPaUpyZFdK...F6bDlKUUFGSF94Q3BvMVE=" …
It s base64…decode it in a string and save it.
Python script setup (client)
Start a new powershell terminal (let’s call it T2) to work on this part. Build the container from the dockerfile included in the repo
PS C:\Code\kubejobs> docker build -t quicktest .
Start the container and mount the repo in the container (not mandatory but allow to edit code in windows)
PS C:\Code\kubejobs> docker run -it -v C:\Code\kubejobs:/mountfolder quicktest
Export the token (the decode version of the base64 token we retrieved previously)
[root@54a8362da7d1 mountfolder]# export KUBE_TOKEN=eyJhbGciOiJSUzI1NiIsImtpZCI...Es5howDOSTWqzl9JQAFH_xCpo1Q
Start the python script
[root@54a8362da7d1 mountfolder]# python3.6 kubeJobsDemo.py
Starting
Starting job
Checking job status
Job is still running. Sleep 1s
Checking job status
Job is still running. Sleep 1s
Checking job status
Job is still running. Sleep 1s
Checking job status
Job is still running. Sleep 1s
Checking job status
Job is still running. Sleep 1s
Checking job status
Job is still running. Sleep 1s
Checking job status
Job is still running. Sleep 1s
Checking job status
Job is over
getting job pods
Checking job status
getting job logs
Job is over without error. Here are the logs: 3.141592653589793
Cleaning up the job
Ending
[root@54a8362da7d1 mountfolder]#
You can also chech the job creation when the python script is running (but not after because job is deleted at the end) from the T1 terminal used before.
PS C:\Users\charl> kubectl get jobs
NAME DESIRED SUCCESSFUL AGE
pi 1 0 3s
As you can see, we also print the logs of the job. I use this python script daily when I spawn jobs on a remote Kube cluster from a Jenkins server (my Jenkins jobs are just spawning Kube job on remote cluster and waiting for them to be over). I’m sharing it hoping it can help some ppl.
The code is quite simple and the only tricky part is to get the pod associated to the job so that we can get the logs (BTW this may not works in case the job spawn several pods).
The link Job-Pod is done with the use of selector since it was the recommended methode when I done the script (https://github.com/kubernetes/kubernetes/issues/24709)
Full code is here: https://bitbucket.org/charly37/kubejobs/src/master/