2019独角兽企业重金招聘Python工程师标准>>>
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:5811dcb711ba
LABEL 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_UID
RUN pip install --upgrade pip
RUN pip install bs4 && \
pip install lxml && \
pip install py4j && \
pip install pyspark && \
pip install tushare
RUN conda install -y nodejs scikit-image matplotlab ipyleaflet
RUN conda install -y tensorflow apache-airflow mlflow
RUN conda install -y pytorch torchvision cudatoolkit=10.0 -c pytorch
RUN conda update --all
RUN conda install jupyterlab=0.34.12
RUN jupyter labextension install @jupyter-widgets/jupyterlab-manager
RUN jupyter labextension install jupyter-leaflet
RUN jupyter labextension upgrade --all
RUN 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等的镜像服务中,再拉取或者直接使用。
参考文件:
- http://github.com/databooks/databook/build-tools/
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
更多参考:
- JupyterHub on Kubernetes--项目简介
- JupyterHub on Kubernetes--部署指南
- JupyterHub on Kubernetes-- Helm Chart简介
- JupyterHub on Kubernetes部署与应用指南
- JupyterHub on Kubernetes-Helm安装
- Jupyter Hub on Kubernetes Part II: NFS
- JupyterHub on Kubernetes-容器存储
- Ubuntu 18.04+JupyterHub的NFS服务 Bug 修复
- 为JupyterHub自定义Notebook Images
5、启动JupyterHub应用
到Kubernetes Dashboard,查看命名空间jupyter的service的IP地址,然后到浏览器输入。缺省页面为notebook,将地址后面改为lab,即可进入Jupyterlab的多窗口风格页面。