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"
}
}
}
}
Development
Setup
Get poetry: https://python-poetry.org/docs/#installation
poetry install
Release
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.1.tar.gz
Algorithm | Hash digest | |
---|---|---|
SHA256 | 9d8ba255d90d5224077302a93172661ace7c387691fe271b443e2d476ecdf0dd |
|
MD5 | 00e38286c843bcc6406f73403efe4cfe |
|
BLAKE2b-256 | cae9ec9e9bfe5c01c906f1ec50f78f2a3e9871e1754849b0de7737e804e0b651 |
Close
Hashes for jupyterhub_nomad_spawner-0.2.1-py3-none-any.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | a5fe3d1af664568803eb85ebb1d1ad049251028e10fd3f771028f004bdbecb75 |
|
MD5 | 6a1e232abf914ce8deeb6c648447be3b |
|
BLAKE2b-256 | fd6474a4155dd88999bf9515e22f4b3311c5f07d39d05a0aaeb7c32f36723a38 |