JupyterHub on Kubernetes部署
花了三天看了诸多文档,经历N次尝试后,终于成功在自己的Mac上,将JupyterHub部署在了Kubernetes(k8s)上,写一篇博客记录下安装过程,希望可以帮助到需要的朋友。
1.实验依赖
- Mac v10.12.2
- Docker v18.09.3
- Kubernetes v1.13.0
- Helm v2.11.0
2.安装Docker Desktop + k8s
Docker Desktop是使用Mac学习Docker,Kubernetes最简单和快捷的工具,可以很方便的为你搭建一个k8s环境,所以我们的第一步也是安装Docker Desktop,并配置k8s。
Docker Destop本身安装很简单,但遗憾的是k8s所需的镜像由于墙的原因很难拿到。在启用kubernetes过程中,会出现kubernetes is starting的问题,所以参考https://github.com/maguowei/k8s-docker-for-mac的方法,可以成功配置。
简单复述一下步骤:
-
从github上clone该项目
-
下载并安装Docker Desktop(注意:必须安装他提供的版本,最新版的Docker Desktop无效,可能原因是缺少某些镜像)
-
设置Docker官方加速镜像 https://registry.docker-cn.com,记得点Apply&Restart,否则不生效
- 在Kubernetes中启用Enable Kubernetes,直到两个都变成 is running
- 验证docker,k8s安装是否成功。可以在网上参考一些demo,在自己环境中部署一些镜像,学习使用docker,k8s的基本命令。附一下我使用到的参考文献:
- http://www.runoob.com/docker/docker-tutorial.html (Docker 菜鸟教程)
- https://www.jianshu.com/p/051ff99b9421 (使用k8s部署nginx服务)
3.安装Helm
根据Jupyterhub官方文档https://zero-to-jupyterhub.readthedocs.io/en/latest/描述,在k8s部署Jupyterhub需要使用helm,所以第二部需要安装Helm。
还是因为某些镜像拿不下的原因,如果按照官方文档的方法还是不行,参考https://blog.csdn.net/wzygis/article/details/84346573的方法来。
因为已经写的很清楚了,这里还是简单回顾步骤:
- 在https://github.com/helm/helm/releases/tag/v2.11.0下载Mac版的安装包,注意版本!我此处下载的是v2.11.0版本,后续拉取镜像的时候要注意版本对应上。
- 解压缩
tar -xvzf helm-v2.11.0-darwin-amd64.tar.gz -C ~/app/
mv ~/app/darwin-amd64/helm /usr/local/bin/helm
- 编辑tiller.yaml,直接复制原文内容,执行命令
kubectl apply -f tiller.yaml
helm init
- 替换镜像
kubectl edit deploy tiller-deploy -n kube-system
-
image gcr.io/kubernetes-helm/tiller:v2.11.0 替换成 image: sapcc/tiller:v2.11.0(注意:此处的版本必须和下载的helm客户端版本一致,否则报错)
-
验证helm是否安装成功
helm version
1552701357411.jpg
这里还可以参考https://my.oschina.net/u/2306127/blog/1619818。
4.安装Jupyterhub
安装好了k8s,helm后,终于来到了最后一步,安装jupyterhub。然而可惜的是,官网提供的方法仍然不可用,需要参考https://my.oschina.net/u/2306127/blog/1836933的方法。当然这里面还有坑。。。
基本按照参考文章里的快速安装指南来安装,但是按照他的安装步骤是不成功的,所以这里参考我的来:
-
从github上clone该项目,https://github.com/openthings/kubernetes-tools/tree/master/jupyter
-
执行jupyterhub-images-pull.sh脚本(原来getimages.sh脚本下载的镜像不能用,这里直接用这个脚本)来下载镜像(这里有个镜像gcr.io/google_containers/pause下载不成功)
-
参考https://blog.csdn.net/wangtaoking1/article/details/49122977描述的方法下载gcr.io/google_containers/pause镜像
docker pull docker.io/kubernetes/pause
docker tag kubernetes/pause gcr.io/google_containers/pause:0.8.0
-
修改secretToken
- 执行 openssl rand -hex 32,生成字符串
- 在 /jupyterhub/values.yaml中,替换proxy下的secretToken为刚才生成的字符串
-
继续修改values.yaml中的storageClass,有两处,我这里设置成了"hostpath",也可以设置成“NFS”,根据自己的情况来吧。
-
继续修改values.yaml中的images tag,镜像的版本信息需要和jupyterhub-images-pull.sh下载的一致,这里可以对应着全部改掉。
-
继续修改values.yaml中proxy:service: type:为 NodePort。
-
这里还有一个坑踩了好久,默认的Node分配的Memory只有2G,但是开启各种pod后,很快资源就不够了,这样jupyterhub服务启不来,所以干脆这里调节成4G。然后修改values.yaml中的memory,注意我这里proxy和hub只分配了256Mi,但是 singleuser:memory:guarantee至少1G,否则jupyterhub不运行。
- 执行命令,开启服务
helm install ./jupyterhub --version=v0.7.0 \
- 验证是否部署成功
kubectl --namespace=jupyter get pod (两个都running)
```
kubectl --namespace=jupyter get svc proxy-public(查看端口)
```
1552704423052.jpg
-
浏览器登录localhost:30877
1552704680601.jpg
5.总结
整个安装过程还是比较曲折的,由于之前完全没接触过docker,k8s,jupyterhub,花了一些时间在学习概念和工具的使用。还有大量时间在搜寻资料和试错上,不过好在还是有大神已经造了轮子,自己多尝试还是可以成功部署的。
6.最主要的几篇参考文献
- https://zero-to-jupyterhub.readthedocs.io/en/latest/index.html
- https://github.com/maguowei/k8s-docker-for-mac
- https://blog.csdn.net/wzygis/article/details/84346573
- https://my.oschina.net/u/2306127/blog/1619818
- https://my.oschina.net/u/2306127/blog/1836933
- https://blog.csdn.net/wangtaoking1/article/details/49122977