JupyterHub+Docker+K8s 简单总结

上个月大概花了四周时间,学习了docker、k8s、jupyterhub等组件的概念和使用,并在个人Mac和测试集群上分别部署了一套基于k8s的jupyterhub,提供jupyter notebook基本服务:对于用户来说,可以创建属于自己的notebook,并支持主流的十余种机器学习、深度学习算法。对于管理者来说,可以支持基于数据库的身份认证、持久化、更新singleuser镜像等功能。整体上看,满足算法工程师前期模型开发的各项需求。

项目暂时告一段落,有必要简单对安装过程、工具命令、后期展望做个总结,方便后续上手继续改进。

1. 安装回顾

1.1 安装过程

由于涉及的组件较多,参考资料比较少,关键还有墙的缘故,整体安装过程相对来说比较繁琐。经过我的采坑后,沉淀出的两篇文章,可以供相关同学参考。

安装流程主要包括:

  • 安装docker、k8s
  • 安装helm
  • 安装jupyterhub
  • 配置pvc持久化
  • 开发并配置auth身份认证
  • 更新singleuser镜像

具体的一些细节,有些不方便公开,但个人Mac版的安装、配置过程都可以在我的文章中查询。

步骤1-3可以参考JupyterHub on Kubernetes部署

步骤4取决于PVC持久化选择的类型,重点是一个权限的问题。由于singleuser镜像默认的用户为jovyan(uid=1000),所属组(gid=100),所以需要配置时,指定singleuser的uid和gid;此外还要指定挂载位置homeMountPath为/home/jovyan/

步骤5可以参考JupyterHub on Kubernetes的SQLite、MySQL身份认证 (Auth),目前github上已经更新了密码加密部分。

步骤6目的是使用已经安装好各种算法包的镜像,包装成singleuser镜像供用户使用。这部分在1.2小节里具体说一下。

按照上述6个步骤,基本可以搭出一个基于k8s的jupyterhub,对外提供服务。

1.2 更新singleuser镜像

singleuser镜像是官网上为用户提供的notebook基础镜像,上面安装了jupyterhub,但是在实际项目中,我们需要为用户提供多种算法包,如果一个个自己安装的话,还是很麻烦的,所以最简单的办法,就是拿已经安装好的镜像,我们包装成singleuser就可以啦。

Deepo是一个docker镜像仓库,提供了包含很多算法的镜像。所以第一步我们可以从GitHub(https://github.com/ufoym/deepo)下载相关镜像,作为基础镜像。

第二步是在该镜像中,创建user组(gid=100),创建jovyan用户(uid=1000),这都是为了和singleuser镜像匹配。

第三步是切换到jovyan用户,并安装jupyterhub,可以参考https://github.com/jupyterhub/jupyterhub 上的Installation安装过程。

第四步是保存该镜像,重新命名,并打tag,修改values的相关配置,联调成功后,用户可以在自己nootbook中调用pandas、tensorflow等。

2. 工具命令

这部分主要是记录一下这些组件我使用过的命令,方便后续再改进时参考。

2.1 docker

# list docker images
docker images

# list docker container
docker ps

# run a image
docker run -it <image_name>:<tag> bash

# package a image
docker save <image_name>:<tag>  -o  path/xx.tar 

# load a image
docker load -i <images_tar_name> 

# copy files between images and pc
docker cp xx:xx/path1  /path2

# make a new image from container
docker commit <container_id>   <images_name>:<tag>

2.2 k8s

# get, describe, delete, logs, exec
kubectl get pods -n <namespace> -o yaml
kubectl describe pod <pod_name> -n <namespace>
kubectl delete svc <svc_name> -n <namespace>
kubectl logs <pod_name> -n <namespace>
kubectl exec -it <pod_name> bash -n <namespace>

2.3 helm


# install 
helm install ./jupyterhub --version=0.7.0 --name=jupyter --namespace=jupyter

# delete   
helm delete --purge <namespace>

3. 后期展望

对于后期,肯定需要一版一版的去改进迭代。从我的角度看,目前还存在以下改进空间。

3.1 提供注册服务

目前新用户注册账户还缺乏对应的server,还是管理员手工脚本添加。我感觉可以写一个web服务,用户可以在web页面完成基本的注册功能。

3.2 PVC/PV隐患

目前的PVC/PV逻辑是为每一个用户提供一个独立的PVC/PV,用于数据的持久化。但是随着用户规模的拓展,这种方式不可持续。理想的情况应该是开辟一个总的PVC/PV,所有用户的数据都存储在该PV下,彼此之间相互保持独立。

4. 总结

基于k8s的jupyterhub服务,目前已经在很多公司得到落地实践,甚至还是一大卖点。

docker容器之前也没接触过,但这次简单的使用感觉非常好。基于docker容器的部署方式无论是个人开发,还是企业应用都很方便。

程序员这个职业需要不停的学习新的知识、技能,对个人要求还是不低的。对知识的广度和深度,都有要求。钱不好挣啊!

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容