docs(jupyterhub): revise JupyterHub doc

This commit is contained in:
Masaki Yatsu
2025-09-08 10:51:25 +09:00
parent 1af53ace21
commit 5d781ff208

View File

@@ -22,9 +22,14 @@ This will prompt for:
- Keycloak must be installed and configured - Keycloak must be installed and configured
- For NFS storage: Longhorn must be installed - For NFS storage: Longhorn must be installed
- For Vault integration: Vault must be installed and configured - For Vault integration: Vault must be installed and configured
- Helm repository must be accessible
## Kernel Images ## Kernel Images
### Important Note
Building and using custom buun-stack images requires building the `buunstack` Python package first. The package wheel file will be included in the Docker image during build.
JupyterHub supports multiple kernel image profiles: JupyterHub supports multiple kernel image profiles:
### Standard Profiles ### Standard Profiles
@@ -85,13 +90,20 @@ Buun-stack images provide comprehensive data science environments with:
Build and push buun-stack images to your registry: Build and push buun-stack images to your registry:
```bash ```bash
# Build images # Build images (includes building the buunstack Python package)
just jupyterhub::build-kernel-images just jupyterhub::build-kernel-images
# Push to registry # Push to registry
just jupyterhub::push-kernel-images just jupyterhub::push-kernel-images
``` ```
The build process:
1. Builds the `buunstack` Python package wheel
2. Copies the wheel into the Docker build context
3. Installs the wheel in the Docker image
4. Cleans up temporary files
⚠️ **Note**: Buun-stack images are comprehensive and large (~13GB). Initial image pulls and deployments take significant time due to the extensive package set. ⚠️ **Note**: Buun-stack images are comprehensive and large (~13GB). Initial image pulls and deployments take significant time due to the extensive package set.
### Image Configuration ### Image Configuration
@@ -102,8 +114,8 @@ Configure image settings in `.env.local`:
# Image registry # Image registry
IMAGE_REGISTRY=localhost:30500 IMAGE_REGISTRY=localhost:30500
# Image tag # Image tag (current default)
JUPYTER_PYTHON_KERNEL_TAG=python-3.12-1 JUPYTER_PYTHON_KERNEL_TAG=python-3.12-28
``` ```
## Vault Integration ## Vault Integration
@@ -122,20 +134,23 @@ Vault integration requires:
### Setup ### Setup
Enable Vault integration during installation: Vault integration is configured during JupyterHub installation. You have two options:
#### Option 1: Interactive setup (recommended)
```bash
just jupyterhub::install
# Answer "yes" when prompted about Vault integration
```
#### Option 2: Pre-configured setup
```bash ```bash
# Set environment variable before installation or answer yes to prompt during install
export JUPYTERHUB_VAULT_INTEGRATION_ENABLED=true export JUPYTERHUB_VAULT_INTEGRATION_ENABLED=true
just jupyterhub::install just jupyterhub::install
``` ```
Or configure manually: **Note**: The `just jupyterhub::setup-vault-jwt-auth` command is called automatically during installation if Vault integration is enabled. This command currently serves as a placeholder for future JWT-based authentication enhancements.
```bash
# Setup Vault integration (creates user-specific tokens)
just jupyterhub::setup-vault-jwt-auth
```
### Usage in Notebooks ### Usage in Notebooks
@@ -217,8 +232,17 @@ JUPYTERHUB_VAULT_INTEGRATION_ENABLED=false
VAULT_ADDR=http://vault.vault.svc:8200 VAULT_ADDR=http://vault.vault.svc:8200
# Image settings # Image settings
JUPYTER_PYTHON_KERNEL_TAG=python-3.12-6 JUPYTER_PYTHON_KERNEL_TAG=python-3.12-28
IMAGE_REGISTRY=localhost:30500 IMAGE_REGISTRY=localhost:30500
# Vault token TTL settings
JUPYTERHUB_VAULT_TOKEN_TTL=720h # Admin token: 30 days (effective limit)
JUPYTERHUB_VAULT_TOKEN_MAX_TTL=8760h # Admin token: 1 year (currently unused - no auto-renewal)
NOTEBOOK_VAULT_TOKEN_TTL=24h # User token: 1 day (auto-renewed)
NOTEBOOK_VAULT_TOKEN_MAX_TTL=168h # User token: 7 days (max renewal limit)
# Logging
JUPYTER_BUUNSTACK_LOG_LEVEL=warning # Options: debug, info, warning, error
``` ```
### Advanced Configuration ### Advanced Configuration
@@ -238,10 +262,11 @@ just jupyterhub::uninstall
Upgrade to newer versions: Upgrade to newer versions:
```bash ```bash
# Update image tag # Update image tag in .env.local
export JUPYTER_PYTHON_KERNEL_TAG=python-3.12-2 export JUPYTER_PYTHON_KERNEL_TAG=python-3.12-29
# Rebuild and push images # Rebuild and push images
just jupyterhub::build-kernel-images
just jupyterhub::push-kernel-images just jupyterhub::push-kernel-images
# Upgrade JupyterHub deployment # Upgrade JupyterHub deployment
@@ -297,7 +322,15 @@ just keycloak::update-client buunstack jupyterhub \
"https://your-jupyter-host/hub/oauth_callback" "https://your-jupyter-host/hub/oauth_callback"
``` ```
## Implementation ## Technical Implementation Details
### Helm Chart Version
JupyterHub uses the official Zero to JupyterHub (Z2JH) Helm chart:
- Chart: `jupyterhub/jupyterhub`
- Version: `4.2.0` (configurable via `JUPYTERHUB_CHART_VERSION`)
- Documentation: https://z2jh.jupyter.org/
### User-Specific Vault Token System ### User-Specific Vault Token System
@@ -316,6 +349,12 @@ The `buunstack` SecretStore uses pre-created user-specific Vault tokens that are
└─────────────────┘ └──────────────────┘ └─────────────────┘ └─────────────────┘ └──────────────────┘ └─────────────────┘
``` ```
**Key Components**:
- **JupyterHub Admin Token**: Created with admin policy, stored at `jupyterhub/vault-token`, available as `JUPYTERHUB_VAULT_TOKEN` environment variable
- **User-Specific Tokens**: Created dynamically during notebook spawn, available as `NOTEBOOK_VAULT_TOKEN` environment variable
- **User Policies**: Restrict access to `secret/data/jupyter/users/{username}/*`
#### Token Lifecycle #### Token Lifecycle
1. **Pre-spawn Hook Setup** 1. **Pre-spawn Hook Setup**
@@ -471,3 +510,11 @@ For production deployments, consider:
- Configuring resource limits per user - Configuring resource limits per user
- Setting up monitoring and alerts - Setting up monitoring and alerts
- Monitoring Vault token expiration and renewal patterns - Monitoring Vault token expiration and renewal patterns
## Known Limitations
1. **Admin Token Refresh**: JupyterHub's admin Vault token (`JUPYTERHUB_VAULT_TOKEN`) does not auto-refresh. You must redeploy JupyterHub before the token expires (default TTL: 720h/30 days). The `JUPYTERHUB_VAULT_TOKEN_MAX_TTL` setting is currently not utilized since automatic renewal is not implemented. Monitor the token expiration and schedule redeployments accordingly.
2. **Cull Settings**: Server idle timeout is set to 2 hours by default. Adjust `cull.timeout` and `cull.every` in the Helm values for different requirements.
3. **NFS Storage**: When using NFS storage, ensure proper permissions are set on the NFS server. The default `JUPYTER_FSGID` is 100.