0
0
Lập trình
Flame Kris
Flame Krisbacodekiller

Thiết lập lớp học JupyterHub mở rộng trên Debian 12 LTS với DockerSpawner

Đăng vào 1 tháng trước

• 8 phút đọc

Thiết lập lớp học JupyterHub mở rộng trên Debian 12 LTS với DockerSpawner

Chào cộng đồng Dev.to! Nếu bạn là một giáo viên, nhà khoa học dữ liệu, hoặc quản trị hệ thống đang tìm cách thiết lập một môi trường Jupyter đa người dùng cho việc giảng dạy hoặc hợp tác, bạn đã đến đúng nơi. Hôm nay, chúng ta sẽ tìm hiểu về cách thiết lập tự động hoàn chỉnh cho JupyterHub trên Debian 12 LTS sử dụng Docker và DockerSpawner. Cấu hình này hoàn hảo cho lớp học: nó cung cấp các container tách biệt cho mỗi người dùng, giới hạn tài nguyên để ngăn ngừa quá tải, người dùng giả để thử nghiệm, công cụ benchmark, và thậm chí một sổ tay chia sẻ để mô phỏng khối lượng công việc của sinh viên.

Tại sao chọn JupyterHub với DockerSpawner cho lớp học?

JupyterHub là một hub đa người dùng phục vụ các sổ tay Jupyter cho nhiều người dùng. Kết hợp nó với DockerSpawner sẽ nâng cao trải nghiệm:

  • Tách biệt: Mỗi sinh viên có container Docker riêng, ngăn chặn việc tính toán nặng của một người dùng làm treo những người khác.
  • Khả năng mở rộng: Dễ dàng thêm giới hạn tài nguyên (CPU/RAM) và lưu trữ bền vững.
  • Đơn giản: Sử dụng DummyAuthenticator để thử nghiệm nhanh với 20 người dùng giả (ví dụ, student01 đến student20).
  • Benchmarking: Công cụ tích hợp để theo dõi tải hệ thống trong các phiên lớp học mô phỏng.
  • Bền vững: Các volumes cho mỗi người dùng để lưu trữ công việc, cộng với một thư mục chia sẻ cho các tài nguyên chung như sổ tay benchmark.

Cấu hình này chạy trên Debian 12 LTS (ổn định và an toàn) và sử dụng jupyter/minimal-notebook làm hình ảnh cơ sở. Nó rất tuyệt vời cho việc giảng dạy khoa học dữ liệu, học máy, hoặc các kiến thức cơ bản về Python mà không cần lo lắng về môi trường chia sẻ.

Điều kiện tiên quyết:

  • Một máy chủ Debian 12 LTS (máy ảo, instance đám mây) với quyền truy cập sudo.
  • Thông số tối thiểu: 16GB RAM, 4-core CPU, 512GB ổ đĩa cho 20 người dùng.
  • Kết nối Internet để cài đặt gói.

Kịch bản thiết lập tự động

Dưới đây là điều kỳ diệu: một kịch bản Bash duy nhất xử lý các phụ thuộc, cấu hình, triển khai và giám sát. Sao chép và dán nó vào một tệp (ví dụ, setup_jupyterhub.sh), làm cho nó có thể thực thi (chmod +x setup_jupyterhub.sh), và chạy với quyền root (sudo ./setup_jupyterhub.sh).

bash Copy
#!/bin/bash

set -e

echo "🚀 [1/8] Cập nhật hệ thống và cài đặt các phụ thuộc..."
apt update && apt upgrade -y
apt install -y python3 python3-pip git curl \
               docker.io docker-compose \
               htop iotop iftop sysstat nload stress-ng

echo "🔧 [2/8] Bật và khởi động Docker..."
systemctl enable docker
systemctl start docker
usermod -aG docker ${SUDO_USER:-$USER}

echo "📁 [3/8] Tạo thư mục JupyterHub..."
mkdir -p /opt/jupyterhub-dockerspawner/shared
cd /opt/jupyterhub-dockerspawner

echo "🧪 [4/8] Tạo sổ tay benchmark trong thư mục chia sẻ..."
cat > shared/benchmark_notebook.ipynb <<EOF
{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Sổ tay Benchmark\\n",
    "Điều này mô phỏng việc vẽ đồ thị, pandas, numpy, và công việc tính toán."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "import pandas as pd\\n",
    "import numpy as np\\n",
    "import matplotlib.pyplot as plt\\n",
    "\\n",
    "df = pd.DataFrame(np.random.randn(1000, 4), columns=list('ABCD'))\\n",
    "df = df.cumsum()\\n",
    "df.plot()\\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Tải tính toán\\n",
    "for _ in range(10000):\\n",
    "    np.linalg.inv(np.random.rand(10, 10))"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "name": "python",
   "version": "3.x"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
EOF

echo "📄 [5/8] Tạo docker-compose.yml..."
cat > docker-compose.yml <<EOF
version: '3'
services:
  jupyterhub:
    image: jupyterhub/jupyterhub:latest
    container_name: jupyterhub
    restart: always
    ports:
      - "8000:8000"
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - ./jupyterhub_config.py:/srv/jupyterhub/jupyterhub_config.py
      - ./shared:/srv/jupyterhub/shared
EOF

echo "⚙️ [6/8] Cài đặt DummyAuthenticator và tạo cấu hình..."
pip3 install jupyterhub-dummyauthenticator dockerspawner
cat > jupyterhub_config.py <<EOF
from dockerspawner import DockerSpawner

c.JupyterHub.spawner_class = 'dockerspawner.DockerSpawner'
c.JupyterHub.ip = '0.0.0.0'
c.JupyterHub.port = 8000

# Cấu hình DockerSpawner
c.DockerSpawner.image = 'jupyter/minimal-notebook:latest'
c.DockerSpawner.network_name = 'bridge'
c.DockerSpawner.remove = True
c.DockerSpawner.debug = True

# Mount per-user volume và thư mục chia sẻ
c.DockerSpawner.volumes = {
    'jupyterhub-user-{username}': '/home/jovyan/work',
    '/srv/jupyterhub/shared': {'bind': '/home/jovyan/shared', 'mode': 'ro'}
}

# Giới hạn tài nguyên cho mỗi người dùng (điều chỉnh khi cần)
c.Spawner.cpu_limit = 0.5
c.Spawner.mem_limit = '1G'

# Xác thực (Dummy cho thử nghiệm)
c.JupyterHub.authenticator_class = 'dummyauthenticator.DummyAuthenticator'
c.DummyAuthenticator.password = 'pass123'

# Mặc định giao diện JupyterLab
c.Spawner.default_url = '/lab'
EOF

echo "📈 [7/8] Tạo kịch bản giám sát hệ thống..."
cat > monitor.sh <<'EOF'
#!/bin/bash
mkdir -p logs
echo "Bắt đầu ghi nhật ký CPU và bộ nhớ (mỗi 5s)..."
vmstat 5 > logs/vmstat.log &
echo "Bắt đầu ghi nhật ký đĩa I/O..."
iostat -xm 5 > logs/iostat.log &
echo "Bắt đầu ghi nhật ký mạng..."
iftop -t -s 60 -L 50 > logs/iftop.log &
echo "Sử dụng 'tail -f logs/vmstat.log' để giám sát theo thời gian thực."
EOF
chmod +x monitor.sh

echo "📡 [8/8] Khởi động JupyterHub..."
docker-compose up -d

IP=$(hostname -I | awk '{print $1}')
echo "✅ Thiết lập hoàn tất! Truy cập JupyterHub tại: http://$IP:8000"
echo "Đăng nhập với bất kỳ: student01 đến student20 | Mật khẩu: pass123"
echo "Để giám sát hệ thống: ./monitor.sh"
echo "Kiểm tra các container: docker ps"

Kịch bản này:

  • Cài đặt các phụ thuộc như Docker, Compose và các công cụ giám sát (htop, stress-ng).
  • Thiết lập các thư mục và cấu hình.
  • Triển khai JupyterHub thông qua Docker Compose.
  • Tạo một sổ tay benchmark để kiểm tra tải.
  • Thêm một kịch bản giám sát cho nhật ký.

Sau khi chạy, truy cập tại http://<địa-chỉ-IP-của-bạn>:8000. Đăng nhập bằng studentXX (01-20) và mật khẩu pass123.

Hiểu các thành phần chính

Phép thuật của DockerSpawner

DockerSpawner tạo ra một container mới cho mỗi lần đăng nhập của người dùng. Những điểm nổi bật trong cấu hình:

  • Hình ảnh: jupyter/minimal-notebook:latest - nhẹ nhàng với các kiến thức cơ bản về Python.
  • Volumes: Dành cho mỗi người dùng (jupyterhub-user-{username}) để lưu trữ bền vững /home/jovyan/work; thư mục chia sẻ ở chế độ chỉ đọc.
  • Giới hạn: 0.5 CPU và 1GB RAM cho mỗi người dùng – điều chỉnh trong jupyterhub_config.py cho phần cứng của bạn.

Xác thực và người dùng

Chúng ta sử dụng DummyAuthenticator cho sự đơn giản: bất kỳ tên người dùng nào cũng hoạt động với mật khẩu. Đề xuất 20 người dùng giả như student01. Đối với các lớp học thực tế, hãy chuyển sang OAuth (Google/Microsoft) hoặc LDAP.

Sổ tay Benchmark

Sổ tay chia sẻ benchmark_notebook.ipynb mô phỏng công việc của sinh viên:

  • Tạo và vẽ đồ thị dữ liệu ngẫu nhiên với pandas/numpy/matplotlib.
  • Chạy các phép toán ma trận nặng CPU.

Chạy nó cho nhiều người dùng để kiểm tra tải!

Công cụ Giám sát

  • htop/iotop/iftop: Các chế độ xem thời gian thực.
  • monitor.sh: Ghi nhật ký CPU, bộ nhớ, đĩa, mạng mỗi 5 giây.
  • docker stats: Các chỉ số theo container.
  • stress-ng: Để tạo tải nhân tạo (ví dụ, stress-ng --cpu 4 --timeout 60s).

Kiểm tra và Benchmark cài đặt của bạn

  1. SSH vào và chạy kịch bản.
  2. Bắt đầu giám sát: ./monitor.sh.
  3. Đăng nhập với nhiều sinh viên qua trình duyệt.
  4. Mở /home/jovyan/shared/benchmark_notebook.ipynb và thực thi.
  5. Theo dõi tài nguyên: Mong đợi có sự gia tăng nhưng không có sự cố nhờ giới hạn.
  6. Xác minh tách biệt: docker ps cho thấy các container cụ thể của người dùng.

Mẹo Pro: Đối với 20 người dùng, theo dõi các nút thắt cổ chai. Nếu RAM đạt giới hạn, hãy mở rộng máy chủ của bạn hoặc điều chỉnh giới hạn.

Bảo mật: Tường lửa và Thực tiễn tốt nhất

Đừng để mở các cổng! Thiết lập UFW:

bash Copy
apt install -y ufw
ufw allow 22/tcp   # SSH
ufw allow 8000/tcp # JupyterHub
ufw enable
ufw status
  • Vô hiệu hóa SSH root.
  • Thêm HTTPS với Let's Encrypt cho môi trường sản xuất.
  • Cập nhật thường xuyên: apt update && apt upgrade.

Bảng Ước lượng Tài nguyên

Tài nguyên Khuyến nghị cho 20 người dùng nhẹ
RAM 16GB+ (1GB/user + overhead)
CPU 4+ cores (0.5/user)
Disk 512GB+ (cho notebooks/volumes)
Mạng 100Mbps+ cho truy cập đa người dùng

Khắc phục sự cố Các vấn đề Thường gặp

  • Docker thất bại: Kiểm tra systemctl status docker.
  • Lỗi đăng nhập: Xác minh mật khẩu trong cấu hình; khởi động lại docker-compose restart.
  • Quá tải tài nguyên: Tăng giới hạn hoặc thêm swap.
  • Nhật ký container: docker logs jupyterhub.
  • Vấn đề bền vững: Đảm bảo các volumes đã được gán đúng cách.

Tùy chỉnh Nâng cao

Sẵn sàng nâng cao?

  • Hình ảnh tùy chỉnh: Xây dựng một hình ảnh với các thư viện được cài đặt sẵn (ví dụ, scikit-learn):
bash Copy
  FROM jupyter/minimal-notebook:latest
  RUN pip install pandas numpy matplotlib scikit-learn

Cập nhật c.DockerSpawner.image tới hình ảnh bạn đã xây dựng.

  • OAuth: Cài đặt jupyterhub-oauthenticator và cấu hình cho Google.
  • Lưu trữ bên ngoài: Gán một ổ đĩa vào /opt/jupyterhub-dockerspawner/userdata.
  • Ghi nhật ký: Đặt c.JupyterHub.log_level = 'DEBUG' để theo dõi hoạt động của người dùng.
  • Kubernetes Scaling: Di chuyển đến Helm charts cho các lớp học lớn hơn.

Nếu bạn cần trợ giúp với những điều này, hãy để lại bình luận!

Kết luận

Thiết lập JupyterHub sử dụng Docker này biến máy chủ Debian của bạn thành một công cụ lớp học mạnh mẽ trong vài phút. Nó an toàn, mở rộng và sẵn sàng cho việc benchmarking—hoàn hảo cho các nhà giáo dục tự động hóa mọi thứ. Hãy thử nghiệm và cho tôi biết kết quả trong phần bình luận. Mẹo Jupyter yêu thích của bạn là gì?

Cảm ơn bạn đã đọc! Nếu bài viết này hữu ích, hãy cho nó một ❤️ hoặc unicorn. Theo dõi để nhận thêm mẹo về quản trị hệ thống và khoa học dữ liệu.

Gợi ý câu hỏi phỏng vấn
Không có dữ liệu

Không có dữ liệu

Bài viết được đề xuất
Bài viết cùng tác giả

Bình luận

Chưa có bình luận nào

Chưa có bình luận nào