上个月大概花了四周时间,学习了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容器的部署方式无论是个人开发,还是企业应用都很方便。
程序员这个职业需要不停的学习新的知识、技能,对个人要求还是不低的。对知识的广度和深度,都有要求。钱不好挣啊!