A JupyterHub Spawner that launches isolated notebooks as job
Project description
Nomad Jupyter Spawner
Warning This project is currently in beta
Spawns a Jupyter Notebook via Jupyterhub.
Users can select and image, resource and connect it with volumes (csi / host)
pip install jupyterhub-nomad-spawner
Show Case
https://user-images.githubusercontent.com/1607547/182332760-b0f96ba2-faa8-47b6-9bd7-db93b8d31356.mp4
TODOs:
- Document setup
- Extend for policies
- Namespace support
Usage
Config
import json
import os
import socket
from jupyterhub.auth import DummyAuthenticator
import tarfile
c.JupyterHub.spawner_class = "nomad-spawner"
c.JupyterHub.bind_url = "http://0.0.0.0:8000"
c.JupyterHub.hub_bind_url = "http://0.0.0.0:8081"
c.JupyterHub.hub_connect_url = f"http://{os.environ.get('NOMAD_IP_api')}:{os.environ.get('NOMAD_HOST_PORT_api')}"
c.JupyterHub.allow_named_servers = True
c.JupyterHub.named_server_limit_per_user = 5
c.JupyterHub.authenticator_class = DummyAuthenticator
c.NomadSpawner.mem_limit = "2G"
c.NomadSpawner.datacenters = ["dc1", "dc2", "dc3"]
Nomad Job
job "jupyterhub" {
type = "service"
datacenters = ["dc1"]
group "jupyterhub" {
network {
mode = "host"
port "hub" {
to = 8000
static = 8000
}
port "api" {
to = 8081
}
}
task "jupyterhub" {
driver = "docker"
config {
image = "mxab/jupyterhub:1"
auth_soft_fail = false
args = [
"jupyterhub",
"-f",
"/local/jupyterhub_config.py",
]
ports = ["hub", "api"]
}
template {
destination = "/local/nomad.env"
env = true
data = <<EOF
NOMAD_ADDR=http://host.docker.internal:4646
CONSUL_HTTP_ADDR=http://host.docker.internal:8500
EOF
}
template {
destination = "/local/jupyterhub_config.py"
data = <<EOF
import json
import os
import socket
from jupyterhub.auth import DummyAuthenticator
import tarfile
c.JupyterHub.spawner_class = "nomad-spawner"
c.JupyterHub.bind_url = "http://0.0.0.0:8000"
c.JupyterHub.hub_bind_url = "http://0.0.0.0:8081"
c.JupyterHub.hub_connect_url = f"http://{os.environ.get('NOMAD_IP_api')}:{os.environ.get('NOMAD_HOST_PORT_api')}"
c.JupyterHub.log_level = "DEBUG"
c.ConfigurableHTTPProxy.debug = True
c.JupyterHub.allow_named_servers = True
c.JupyterHub.named_server_limit_per_user = 3
c.JupyterHub.authenticator_class = DummyAuthenticator
c.NomadSpawner.datacenters = ["dc1"]
c.NomadSpawner.mem_limit = "2G"
c.NomadSpawner.common_images = ["jupyter/minimal-notebook:2022-08-20"]
def csi_volume_parameters(spawner):
if spawner.user_options["volume_csi_plugin_id"] == "nfs":
return {
"gid" : "1000",
"uid" : "1000"
}
else:
return None
c.NomadSpawner.csi_volume_parameters = csi_volume_parameters
def vault_policies(spawner):
return [f"my-policy-{spawner.user.name}"]
c.NomadSpawner.vault_policies = vault_policies
EOF
}
resources {
memory = "512"
}
}
service {
name = "jupyter-hub"
port = "hub"
check {
type = "tcp"
interval = "10s"
timeout = "2s"
}
}
service {
name = "jupyter-hub-api"
port = "api"
check {
type = "tcp"
interval = "10s"
timeout = "2s"
}
}
}
}
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Close
Hashes for jupyterhub-nomad-spawner-0.1.0.tar.gz
Algorithm | Hash digest | |
---|---|---|
SHA256 | 9b06d24d2991eed5de51e101431204472db05b179bf5c3a04498091a9c1fe457 |
|
MD5 | 0b5519fb8ab0c051038a171335250aa1 |
|
BLAKE2b-256 | cfe07a4639c3ec5cad0553b0605c3a6e423dd0f871723059f4f4a0e6fac03993 |
Close
Hashes for jupyterhub_nomad_spawner-0.1.0-py3-none-any.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 1ebc4c5e3035847a68b2607b1ebd456a90bb69b34d994e9e87af4b19ebc14cfd |
|
MD5 | d4976a1a56a25ba7a3ad4f11b4938682 |
|
BLAKE2b-256 | fd87af78779105d6f6be1758bca8244f2d81e50b29dd05aa1ad6408309511c7b |