在 Docker Swarm 部署 Jupyter Enterprise Gateway:容器化远程内核实战指南
【免费下载链接】enterprise_gatewayA lightweight, multi-tenant, scalable and secure gateway that enables Jupyter Notebooks to share resources across distributed clusters such as Apache Spark, Kubernetes and others.项目地址: https://gitcode.com/gh_mirrors/en/enterprise_gateway
本文是一份面向初学者的Jupyter Enterprise Gateway(JEG)Docker Swarm 部署实战指南。Jupyter Enterprise Gateway 是一个轻量级、多租户、可扩展且安全的网关,它让 Jupyter Notebook 能够把内核进程"远程化",动态调度到 Apache Spark、Kubernetes、Docker Swarm 等分布式集群上运行。本文将以 Docker Swarm 为例,带你一步步完成容器化远程内核的部署与配置,并解释内核如何以 Swarm Service 的形式在集群中弹性运行。
上图展示了 Jupyter Enterprise Gateway 的核心架构:客户端通过 HTTPS/WSS 连接网关,网关通过 ZMQ 将内核调度到分布式集群的各个节点上。
为什么选择 Docker Swarm 部署远程内核?🚀
在传统 Jupyter Notebook 架构中,内核是本地进程,资源被单台机器锁死;而通过Jupyter Enterprise Gateway 容器化部署,内核变成了可调度的分布式单元,天然获得三大优势:
- 弹性伸缩:内核作为 Swarm Service 可"落"在集群任意节点,横向扩展无压力;
- 资源隔离:每个内核独立容器,互不干扰,多租户场景更安全;
- 统一运维:复用 Docker Swarm 的监控、重启与调度能力。
对比上面两张动图可以发现:同样的集群规模下,使用 Jupyter Enterprise Gateway 后,可同时运行的远程内核数量大幅提升。
部署前需要准备什么?✅
在动手Docker Swarm 部署 Jupyter Enterprise Gateway之前,请确认环境满足以下条件:
- 一个已初始化的 Docker Swarm 集群(在管理节点执行
docker swarm init); - 集群中可拉取以下镜像(来自 Docker Hub 的 elyra 组织):
elyra/enterprise-gateway:网关主镜像,含服务器软件与默认内核规格;elyra/kernel-py:Python 远程内核镜像;elyra/kernel-r、elyra/kernel-scala、elyra/kernel-tf-py等按需使用;
- 管理节点拥有
/var/run/docker.sock的访问权限(网关需要用它来创建内核服务)。
本地构建镜像可运行
make docker-images,相关 Dockerfile 位于 etc/docker/,例如 enterprise-gateway/Dockerfile。
一键部署步骤:docker stack 快速上手指南 🛠️
项目仓库中已经为你准备好了 compose 栈定义文件 docker-compose.yml。它创建了一个专供 Enterprise Gateway 与内核服务通信的overlay 网络,并附带一个 HAProxy 代理服务用于入口负载均衡。
部署命令(在 Swarm 管理节点执行):
docker stack deploy -c docker-compose.yml enterprise-gateway执行后,enterprise-gateway会以 Swarm Service 的形式出现在集群中,所有相关对象(包括内核实例)都会被自动打上app=enterprise-gateway标签。
compose 文件关键配置解读
让我们看看 docker-compose.yml 中几个值得关注的配置点:
- 挂载 Docker Socket:
/var/run/docker.sock必须挂载进容器,否则网关无法动态创建内核 Service; - 网络环境变量:
EG_DOCKER_NETWORK指定内核加入的 overlay 网络; - 内核白名单:
EG_ALLOWED_KERNELS默认允许r_docker、python_docker、python_tf_docker、python_tf_gpu_docker、scala_docker五种容器化内核; - 副本数:目前由于 Swarm 的会话亲和性(session affinity)尚未完全支持,服务默认配置为单副本(
replicas: 1)。
配置容器化远程内核:理解 DockerSwarmProcessProxy 🧩
当用户请求启动内核时,Jupyter Enterprise Gateway 会根据内核规格文件(kernel.json)中的process_proxy配置来决定创建哪种实体。在Docker Swarm 部署场景下,关键类就是DockerSwarmProcessProxy,其实现位于 docker_swarm.py:
- 它通过
kernel_id标签查找对应的 Swarm Service; - 跟踪 Task 的
preparing → starting → running状态,等待内核就绪; - 内核退出后自动调用
terminate_container_resources清理 Service。
内核如何被"远程化"启动?
以 Python 远程内核为例,其内核规格文件位于 python_docker/kernel.json。关键配置如下:
{ "metadata": { "process_proxy": { "class_name": "enterprise_gateway.services.processproxies.docker_swarm.DockerSwarmProcessProxy", "config": { "image_name": "elyra/kernel-py:VERSION" } } }, "argv": [ "python", "/usr/local/share/jupyter/kernels/python_docker/scripts/launch_docker.py", "--RemoteProcessProxy.kernel-id", "{kernel_id}", "--RemoteProcessProxy.response-address", "{response_address}", "--RemoteProcessProxy.public-key", "{public_key}" ] }实际启动时,真正被调用的并非内核进程本身,而是启动脚本 launch_docker.py。它会通过 Docker Python API 完成以下动作:
- 读取
KERNEL_IMAGE环境变量校验镜像名合法性; - 用
KERNEL_USERNAME-kernel_id生成 Service 名称; - 打上
kernel_id、component=kernel、app=enterprise-gateway三个标签; - 以
dnsrr端点模式、none重启策略创建 Swarm Service; - 将内核加入与网关相同的 overlay 网络。
💡 若改用
DockerProcessProxy,内核则会以传统 Docker 容器形式运行在网关所在宿主机上。两种模式可混用:即使网关以 Swarm Service 部署,也可以让某个内核以普通容器方式运行。
验证与连接:从 Notebook 使用远程内核 🌐
部署完成后,打开 Jupyter Notebook 并配置连接到网关(默认端口 8888,由 HAProxy 转发到网关服务)。在 Notebook 中你会看到新增的Python on Docker、R on Docker等内核选项,选择后内核便会在 Swarm 集群中动态创建并回连。
排错时可关注以下要点:
- 日志:查看网关日志确认内核启动状态与 Task 状态流转;
- 网络:确认内核与网关处于同一 overlay 网络(环境变量
EG_DOCKER_NETWORK); - 超时:如内核长时间处于 starting,可调大
EG_KERNEL_LAUNCH_TIMEOUT环境变量。
官方文档与源码指引 📚
如果你想深入了解,推荐阅读以下项目内资料:
- 官方部署文档:deploy-docker.md(Docker 与 Swarm 部署详解);
- Docker 镜像说明:docker.md(各内核镜像的构建与使用);
- 网关启动脚本:start-enterprise-gateway.sh(默认内核名、超时、日志级别等参数入口);
- 容器化内核生命周期管理源码:docker_swarm.py;
- 更多内核规格示例:etc/kernelspecs/。
结语
通过本文的Docker Swarm 部署 Jupyter Enterprise Gateway实战,你已经掌握了从 compose 栈部署、内核规格配置到远程内核启动验证的完整链路。Jupyter Enterprise Gateway 让 Notebook 摆脱单机束缚,把"容器化远程内核"的能力真正落地——无论是小团队开发环境,还是多租户生产集群,这套方案都能帮助你更高效地共享集群资源。现在就动手试试吧!🎉
【免费下载链接】enterprise_gatewayA lightweight, multi-tenant, scalable and secure gateway that enables Jupyter Notebooks to share resources across distributed clusters such as Apache Spark, Kubernetes and others.项目地址: https://gitcode.com/gh_mirrors/en/enterprise_gateway
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考