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
- 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.2.0.tar.gz
Algorithm | Hash digest | |
---|---|---|
SHA256 | 085bc687f5853fe8d9e34526d99252947777aa482e7b5fa74d5e380ca5cce63c |
|
MD5 | 58f54c8b03cbb570952aafe8ea161c7b |
|
BLAKE2b-256 | e8b2ac8f468ee917772e7ab4d1635e65f8240e7a79b67cb45c402f263703614f |
Close
Hashes for jupyterhub_nomad_spawner-0.2.0-py3-none-any.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | a9fee2cb371752328ff92e404d4de70505a9e267b1813442b078e25910f6455e |
|
MD5 | a8a2b10cdc0e060950fcc07a280ade4b |
|
BLAKE2b-256 | 9d3906217edec35e07e98498ce033ec070a6acaf613f50bc442081a9b3376697 |