IPython、JupyterHub、JupyterLab是用于大数据分析和机器学习的流行的环境,JupyterHub可以运行于Kubernetes集群环境中,从而供多人同时使用,支持动态伸缩。
虽然登录后可以通过pip和conda安装软件包,但是服务重启或者pod漂移后将会被重新初始化,所安装的软件和配置参数、使用状态都会丢失。
按照Kubernetes的原则,pod在运行过程中应该是固定的,以便于复制、伸缩和迁移,所有的动态数据应该保留到网络中的共享存储之中。因此,我们可以将所有的软件预先安装在容器中,然后部署镜像到集群中即可。
下面介绍JupyterHub容器镜像的自定义方法与步骤。
1、准备文件
创建Dockerfile
创建一个目录(或首先创建一个git项目)。然后编辑一个 Dockerfile 文件用于后续的Docker容器镜像构建。
# Copyright (c) Jupyter Development Team.# Distributed under the terms of the Modified BSD License.FROM jupyter/all-spark-notebook:5811dcb711baLABEL maintainer="Databook Project,https://github.com/databooks"USER root# ====================================================================# Add proxy, using --build-arg "HTTP_PROXY=http://192.168.199.99:9999"ENV HTTP_PROXY ${HTTP_PROXY}ENV HTTPS_PROXY ${HTTP_PROXY}ENV http_proxy ${HTTP_PROXY}ENV https_proxy ${HTTP_PROXY}ENV SLUGIFY_USES_TEXT_UNIDECODE=yes#Add conda install mirror:RUN echo $http_proxy && \ conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/ && \ conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/ && \ conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge/ && \ conda config --set show_channel_urls yes#Add pip install mirror:RUN echo "[global] \index-url = http://pypi.tuna.tsinghua/simple \trusted-host = \ pypi.tuna.tsinghua \timeout = 120 \" > /etc/pip.conf# ====================================================================# ====================================================================USER $NB_UIDRUN pip install --upgrade pip RUN pip install bs4 && \ pip install lxml && \ pip install py4j && \ pip install pyspark && \ pip install tushareRUN conda install -y nodejs scikit-image matplotlab ipyleafletRUN conda install -y tensorflow apache-airflow mlflowRUN conda install -y pytorch torchvision cudatoolkit=10.0 -c pytorchRUN conda update --allRUN conda install jupyterlab=0.34.12RUN jupyter labextension install @jupyter-widgets/jupyterlab-managerRUN jupyter labextension install jupyter-leafletRUN jupyter labextension upgrade --allRUN jupyter lab build# ====================================================================ENV HTTP_PROXY ""ENV HTTPS_PROXY ""ENV http_proxy ""ENV https_proxy ""# ====================================================================
注意事项:
- 更新jupyterhub的版本。
- 重构jupyter的版本。
- 安装指定的jupyterlab版本。
创建编译脚本文件
创建一个shell脚本文件,可以快速重复执行容器镜像的构建操作。
docker build --build-arg "HTTP_PROXY=http://192.168.199.99:9999" -t openthings/databook .
使用DockerHub构建
将上述文件放到github.com的项目中,就可以在hub.docker.com启动自动构建工作(比本地构建更快)。然后将镜像拉取到本地即可,也可以推送到阿里云/AWS等的镜像服务中,再拉取或者直接使用。
参考文件:
2、编译镜像
执行脚本,将得到所构建的镜像,名为openthings/databook:latest。
为了正常下载所需要的软件包,可以指定proxy参数,如下:
docker build --build-arg "HTTP_PROXY=http://192.168.199.99:9999" -t openthings/databook .
3、分发容器镜像到节点
为了在集群中所有节点都能够运行JupyterHub服务容器,需要将镜像部署到所有的节点。有几种方法:
- 各节点从dockerhub或aliyun/aws的镜像服务直接拉取。如果是在局域网环境,将会带来较大的网络流量,速度较慢。
- 上传到本地的Registry服务(如Harbor/Nexus)拉取,然后各节点从其上拉取容器镜像。
- 如果没有本地镜像服务,也可以直接上传到各个节点。
- 导出镜像:docker save openthings/databook -o databook.tar
- 复制镜像:scp databook.tar user@node0:~/databook.tar
- 导入镜像:到目标节点,执行 docker load -i databook.tar
下一步,部署(或更新)Kubernetes集群中的JupyterHub服务。
4、部署JupyterHub服务
首先修改helm chart目录 deploy-k8s 的values.yaml文件,将镜像地址改为openthings/databook:lates,然后使用helm来部署JupyterHub的chart。
安装:
helm install ./deploy-k8s --version=v0.6 --name=databook --namespace=databook
删除:
helm del --purge databook
更新:
helm upgrade databook ./deploy-k8s
更多参考:
5、启动JupyterHub应用
到Kubernetes Dashboard,查看命名空间jupyter的service的IP地址,然后到浏览器输入。缺省页面为notebook,将地址后面改为lab,即可进入Jupyterlab的多窗口风格页面。