上個(gè)月大概花了四周時(shí)間,學(xué)習(xí)了docker讶迁、k8s肴捉、jupyterhub等組件的概念和使用,并在個(gè)人Mac和測試集群上分別部署了一套基于k8s的jupyterhub乏德,提供jupyter notebook基本服務(wù):對(duì)于用戶來說撤奸,可以創(chuàng)建屬于自己的notebook吠昭,并支持主流的十余種機(jī)器學(xué)習(xí)、深度學(xué)習(xí)算法胧瓜。對(duì)于管理者來說矢棚,可以支持基于數(shù)據(jù)庫的身份認(rèn)證、持久化府喳、更新singleuser鏡像等功能蒲肋。整體上看,滿足算法工程師前期模型開發(fā)的各項(xiàng)需求钝满。
項(xiàng)目暫時(shí)告一段落兜粘,有必要簡單對(duì)安裝過程、工具命令舱沧、后期展望做個(gè)總結(jié)妹沙,方便后續(xù)上手繼續(xù)改進(jìn)。
1. 安裝回顧
1.1 安裝過程
由于涉及的組件較多熟吏,參考資料比較少距糖,關(guān)鍵還有墻的緣故,整體安裝過程相對(duì)來說比較繁瑣牵寺。經(jīng)過我的采坑后悍引,沉淀出的兩篇文章,可以供相關(guān)同學(xué)參考帽氓。
安裝流程主要包括:
- 安裝docker趣斤、k8s
- 安裝helm
- 安裝jupyterhub
- 配置pvc持久化
- 開發(fā)并配置auth身份認(rèn)證
- 更新singleuser鏡像
具體的一些細(xì)節(jié),有些不方便公開黎休,但個(gè)人Mac版的安裝浓领、配置過程都可以在我的文章中查詢。
步驟1-3可以參考JupyterHub on Kubernetes部署
步驟4取決于PVC持久化選擇的類型势腮,重點(diǎn)是一個(gè)權(quán)限的問題联贩。由于singleuser鏡像默認(rèn)的用戶為jovyan(uid=1000),所屬組(gid=100)捎拯,所以需要配置時(shí)泪幌,指定singleuser的uid和gid;此外還要指定掛載位置homeMountPath為/home/jovyan/
步驟5可以參考JupyterHub on Kubernetes的SQLite署照、MySQL身份認(rèn)證 (Auth)祸泪,目前github上已經(jīng)更新了密碼加密部分。
步驟6目的是使用已經(jīng)安裝好各種算法包的鏡像建芙,包裝成singleuser鏡像供用戶使用没隘。這部分在1.2小節(jié)里具體說一下。
按照上述6個(gè)步驟禁荸,基本可以搭出一個(gè)基于k8s的jupyterhub升略,對(duì)外提供服務(wù)微王。
1.2 更新singleuser鏡像
singleuser鏡像是官網(wǎng)上為用戶提供的notebook基礎(chǔ)鏡像,上面安裝了jupyterhub品嚣,但是在實(shí)際項(xiàng)目中炕倘,我們需要為用戶提供多種算法包,如果一個(gè)個(gè)自己安裝的話翰撑,還是很麻煩的罩旋,所以最簡單的辦法,就是拿已經(jīng)安裝好的鏡像眶诈,我們包裝成singleuser就可以啦涨醋。
Deepo是一個(gè)docker鏡像倉庫,提供了包含很多算法的鏡像逝撬。所以第一步我們可以從GitHub(https://github.com/ufoym/deepo)下載相關(guān)鏡像浴骂,作為基礎(chǔ)鏡像。
第二步是在該鏡像中宪潮,創(chuàng)建user組(gid=100)溯警,創(chuàng)建jovyan用戶(uid=1000),這都是為了和singleuser鏡像匹配狡相。
第三步是切換到j(luò)ovyan用戶梯轻,并安裝jupyterhub,可以參考https://github.com/jupyterhub/jupyterhub 上的Installation安裝過程尽棕。
第四步是保存該鏡像喳挑,重新命名,并打tag滔悉,修改values的相關(guān)配置伊诵,聯(lián)調(diào)成功后,用戶可以在自己nootbook中調(diào)用pandas回官、tensorflow等曹宴。
2. 工具命令
這部分主要是記錄一下這些組件我使用過的命令,方便后續(xù)再改進(jìn)時(shí)參考孙乖。
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. 后期展望
對(duì)于后期,肯定需要一版一版的去改進(jìn)迭代份氧。從我的角度看唯袄,目前還存在以下改進(jìn)空間。
3.1 提供注冊服務(wù)
目前新用戶注冊賬戶還缺乏對(duì)應(yīng)的server蜗帜,還是管理員手工腳本添加恋拷。我感覺可以寫一個(gè)web服務(wù),用戶可以在web頁面完成基本的注冊功能厅缺。
3.2 PVC/PV隱患
目前的PVC/PV邏輯是為每一個(gè)用戶提供一個(gè)獨(dú)立的PVC/PV蔬顾,用于數(shù)據(jù)的持久化宴偿。但是隨著用戶規(guī)模的拓展,這種方式不可持續(xù)诀豁。理想的情況應(yīng)該是開辟一個(gè)總的PVC/PV窄刘,所有用戶的數(shù)據(jù)都存儲(chǔ)在該P(yáng)V下,彼此之間相互保持獨(dú)立舷胜。
4. 總結(jié)
基于k8s的jupyterhub服務(wù)娩践,目前已經(jīng)在很多公司得到落地實(shí)踐,甚至還是一大賣點(diǎn)烹骨。
docker容器之前也沒接觸過翻伺,但這次簡單的使用感覺非常好【诨溃基于docker容器的部署方式無論是個(gè)人開發(fā)吨岭,還是企業(yè)應(yīng)用都很方便。
程序員這個(gè)職業(yè)需要不停的學(xué)習(xí)新的知識(shí)峦树、技能辣辫,對(duì)個(gè)人要求還是不低的。對(duì)知識(shí)的廣度和深度空入,都有要求络它。錢不好掙啊歪赢!