InterLink aims to provide an abstraction for the execution of a Kubernetes pod on any remote resource capable of managing a Container execution lifecycle. We target to facilitate the development of provider specific plugins, so the resource providers can leverage the power of virtual kubelet without a black belt in kubernetes internals.
The project consists of two main components:
The project got inspired by the KNoC and Liqo projects, enhancing that with the implemention a generic API layer b/w the virtual kubelet component and the provider logic for the container lifecycle management.
The Go programming language (to build binaries)
Docker Engine (optional)
Note: if you want a quick start setup (using a Docker container), Go is not necessary
It is very important for you to remember to set CPU and Memory Limits in your Pod/Deployment YAML, otherwise default resources will be applied; specifically, if you don't set a CPU limit, only 1 CPU will be used for each task, while if you don't set any Memory limit, only 1MB will be used for each task.
Docker entrypoints are not supported by Singularity. This means you have to manually specify a command to be executed. If you don't, /bin/sh is assumed as the default one.
The following is a simple example of a Pod with a specified command and limits properly set:
apiVersion: v1
kind: Pod
metadata:
name: test-pod
annotations:
slurm-job.knoc.io/flags: "--job-name=test-pod-cfg -t 2800 --ntasks=8 --nodes=1 --mem-per-cpu=2000"
spec:
restartPolicy: Never
containers:
- image: docker://busybox:latest
command: ["echo"]
args: ["hello world"]
imagePullPolicy: Always
name: "hello world"
resources:
limits:
memory: 100Mi
cpu: 2
Just run:
cd docker && docker compose up -d
This way, a docker container with a full SLURM environment will be started. You can find the used SLURM configuration in /docker/SlurmConfig.yaml. If you want to update the config after you already started it once, run:
docker compose up -d --build --force-recreate
So, the old container will be deleted, the image rebuilt and a new container with the updated config will be deployed.
It is of course possible to use binaries as a standalone application. Just run
make all
and you will be able to find the built slurm-sd binary inside the bin directory. Before executing it, remember to check if the configuration file is correctly set according to your needs. You can find an example one under examples/config/SlurmConfig.yaml. Do not forget to set the SLURMCONFIGPATH environment variable to point to your config.
SidecarPort: "4000"
SbatchPath: "/usr/bin/sbatch"
ScancelPath: "/usr/bin/scancel"
SqueuePath: "/usr/bin/squeue"
CommandPrefix: ""
SingularityPrefix: ""
ExportPodData: true
DataRootFolder: ".local/interlink/jobs/"
Namespace: "vk"
Tsocks: false
TsocksPath: "$WORK/tsocks-1.8beta5+ds1/libtsocks.so"
TsocksLoginNode: "login01"
BashPath: /bin/bash
VerboseLogging: true
ErrorsOnlyLogging: false
It is possible to specify Annotations when submitting Pods to the K8S cluster. A list of all Annotations follows: | Annotation | Description |
---|---|---|
slurm-job.vk.io/singularity-commands | Used to add specific Commands to be executed before the actual SLURM Job starts. It adds Commands on the Singularity exection line, in the SLURM bastch file | |
slurm-job.vk.io/pre-exec | Used to add commands to be executed before the Job starts. It adds a command in the SLURM batch file after the #SBATCH directives | |
slurm-job.vk.io/singularity-mounts | Used to add mountpoints to the Singularity Containers | |
slurm-job.vk.io/singularity-options | Used to specify Singularity arguments | |
slurm-job.vk.io/image-root | Used to specify the root path of the Singularity Image | |
slurm-job.vk.io/flags | Used to specify SLURM flags. These flags will be added to the SLURM script in the form of #SBATCH flag1, #SBATCH flag2, etc | |
slurm-job.vk.io/mpi-flags | Used to prepend "mpiexec -np $SLURM_NTASKS *flags*" to the Singularity Execution |
Detailed explanation of the SLURM config file key values. Edit the config file before running the binary or before
building the docker image (docker compose up -d --build --force-recreate will recreate and re-run the updated image) |
Key | Value |
---|---|---|
SidecarPort | the sidecar listening port. Sidecar and Interlink will communicate on this port. Set $SIDECARPORT environment variable to specify a custom one | |
SbatchPath | path to your Slurm's sbatch binary | |
ScancelPath | path to your Slurm's scancel binary | |
CommandPrefix | here you can specify a prefix for the programmatically generated script (for the slurm plugin). Basically, if you want to run anything before the script itself, put it here. | |
ExportPodData | Set it to true if you want to export Pod's ConfigMaps and Secrets as mountpoints in your Singularity Container | |
DataRootFolder | Specify where to store the exported ConfigMaps/Secrets locally | |
Namespace | Namespace where Pods in your K8S will be registered | |
Tsocks | true or false values only. Enables or Disables the use of tsocks library to allow proxy networking. Only implemented for the Slurm sidecar at the moment. | |
TsocksPath | path to your tsocks library. | |
TsocksLoginNode | specify an existing node to ssh to. It will be your "window to the external world" | |
BashPath | Path to your Bash shell | |
VerboseLogging | Enable or disable Debug messages on logs. True or False values only | |
ErrorsOnlyLogging | Specify if you want to get errors only on logs. True or false values only |
Here's the complete list of every customizable environment variable. When specified, it overwrites the listed key within the SLURM config file.
Env | Value |
---|---|
SLURMCONFIGPATH | your SLURM config file path. Default is /etc/interlink/SlurmConfig.yaml |
SIDECARPORT | the Sidecar listening port. Docker default is 4000, Slurm default is 4001. |
SBATCHPATH | path to your Slurm's sbatch binary. Overwrites SbatchPath. |
SCANCELPATH | path to your Slurm's scancel binary. Overwrites ScancelPath. |
SHARED_FS | set this env to "true" to save configmaps values inside files directly mounted to Singularity containers instead of using ENVS to create them later |
CUSTOMKUBECONF | path to a service account kubeconfig |
TSOCKS | true or false, to use tsocks library allowing proxy networking. Working on Slurm sidecar at the moment. Overwrites Tsocks. |
TSOCKSPATH | path to your tsocks library. Overwrites TsocksPath. |