Kubeflow是面向Kubernetes集羣基礎設施的機器學習服務組件。kubeflow採用ksonnet進行軟件包管理和部署的,與其它的應用採用Helm的機制有較大的不一樣。從2018年設立至今,kubeflow項目發展迅速,目前爲0.4.1版本,與以前版本的變化比較大,原來的一些安裝和使用方法(參考《Kubeflow 使用指南》)須要進行調整。這裏主要記錄了使用kubeflow 0.4.1版本的過程。linux
獲取 ksonnet的最新版本(目前爲0.13.1),腳本以下:git
echo "" echo "============================================================" echo "cd ~/openthings" cd ~/openthings echo "" #https://github.com/ksonnet/ksonnet/releases/download/v0.13.1/ks_0.13.1_linux_amd64.tar.gz echo "wget ksonnet 0.13.1 and untar......" echo "" wget -c https://github.com/ksonnet/ksonnet/releases/download/v0.13.1/ks_0.13.1_linux_amd64.tar.gz tar -vxf ks_0.13.1_linux_amd64.tar.gz cd ks_0.13.1_linux_amd64 echo "" echo "Copy ks to /usr/local/bin......" sudo cp ks /usr/local/bin echo "" echo "============================================================" echo "Please visit https://my.oschina.net/u/2306127/blog/1808582" echo "============================================================" echo ""
獲取kubeflow版本:github
export KUBEFLOW_SRC=/home/supermap/openthings/kubeflow-src mkdir ${KUBEFLOW_SRC} cd ${KUBEFLOW_SRC} export KUBEFLOW_TAG=v0.4.1 curl https://raw.githubusercontent.com/kubeflow/kubeflow/${KUBEFLOW_TAG}/scripts/download.sh | bash
ksonnet是一個通用的軟件包管理工具(參考《ksonnet 使用教程 》)。下一步,經過ksonnet爲kubeflow建立一個初始項目,而後在裏面添加相關的軟件包。docker
export KUBEFLOW_SRC=/home/supermap/openthings/kubeflow-src export KFAPP=kubeflow export KUBEFLOW_DOCKER_REGISTRY=registry.aliyuncs.com ${KUBEFLOW_SRC}/scripts/kfctl.sh init ${KFAPP} --platform none cd ${KFAPP} ${KUBEFLOW_SRC}/scripts/kfctl.sh generate k8s ${KUBEFLOW_SRC}/scripts/kfctl.sh apply k8s
推薦的方法如上,但我在使用時老是報錯,沒有成功地運行起來。api
而後改爲手動方式,不使用kfctl的腳本。瀏覽器
ks init my-kubeflow cd my-kubeflow VERSION=v0.4.1 ks registry add kubeflow github.com/kubeflow/kubeflow/tree/${VERSION}/kubeflow ks pkg install kubeflow/jupyter@${VERSION} ks pkg install kubeflow/tf-serving@${VERSION} ks pkg install kubeflow/tf-training@${VERSION}
添加過程當中,會出現github訪問的rate limit問題,參考《git訪問github的rate limit問題解決》。bash
設置當前環境的namespace,對應於kubernetes集羣中的命名空間:app
NAMESPACE=kubeflow kubectl create namespace ${NAMESPACE} ks env set ${KF_ENV} --namespace ${NAMESPACE}
查看一下當前的環境:框架
ks env list
建立k8s配置,以jupyter爲例。curl
ks generate jupyter jupyter --name=jupyter
應用k8s配置,將jupyterhub部署到kubernetes集羣中,命名空間爲kubeflow。
ks apply ${KF_ENV} -c jupyter
查看一下kubernetes集羣的部署狀況:
kubectl get all -n kubeflow
輸出結果爲:
NAME READY STATUS RESTARTS AGE pod/jupyter-0 1/1 Running 0 69m NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service/jupyter-0 ClusterIP None <none> 8000/TCP 69m service/jupyter-lb LoadBalancer 10.103.161.57 10.1.1.13 80:31822/TCP 69m NAME READY AGE statefulset.apps/jupyter 1/1 69m
jupyter-lb service的訪問,須要將其設爲NodePort或者LoadBalancer。
kubectl edit svc/service/jupyter-lb -n kubeflow
修改裏面的服務類型,我這裏安裝了MetalLB,因此使用LoadBalancer模式。
缺省狀況下,工做鏡像使用supermap-workspace爲存儲pvc的名稱,其中supermap爲個人登陸用戶名。
我這裏計劃使用GlusterFS分佈式存儲系統做爲存儲服務。
首先,建立一個endpoint,對應於多個gluster。將下面內容保存爲yaml,修改後經過kubectl apply -f 執行:
apiVersion: v1 kind: Endpoints metadata: name: glusterfs-gvzr00 namespace: kubeflow subsets: - addresses: - ip: 10.1.1.193 - ip: 10.1.1.234 - ip: 10.1.1.205 - ip: 10.1.1.112 ports: - port: 10000 protocol: TCP
而後,建立一個pv(物理存儲卷)。將下面內容保存爲yaml,修改後經過kubectl apply -f 執行:
apiVersion: v1 kind: PersistentVolume metadata: name: kubeflow-supermap namespace: kubeflow spec: capacity: storage: 8000Gi accessModes: - ReadWriteMany glusterfs: endpoints: "glusterfs-gvzr00" path: "gvzr00" readOnly: false
而後,建立一個pvc(物理存儲卷請求)。將下面內容保存爲yaml,修改後經過kubectl apply -f 執行:
kind: PersistentVolumeClaim apiVersion: v1 metadata: name: supermap-workspace namespace: kubeflow spec: accessModes: - ReadWriteMany resources: requests: storage: 4000Gi
檢查一下,pvc是否已經bound成功。
JupyterHub中選擇Start Server,選擇鏡像爲gcr.io/kubeflow-images-public/tensorflow-1.12.0-notebook-cpu:v0.4.0。
但該鏡像不可下載,能夠從其它地方下載,腳本以下:
## 添加Tag for registry.cn-hangzhou.aliyuncs.com/openthings MY_REGISTRY=registry.cn-hangzhou.aliyuncs.com/openthings MY_IMAGE_CPU=tensorflow-1.12.0-notebook-cpu:v0.4.0 MY_IMAGE_GPU=tensorflow-1.12.0-notebook-gpu:v0.4.0 ## Push鏡像 ## Tag to original docker iamges name. echo "" echo "1. tensorflow-1.12.0-notebook-cpu" echo "PULL: ${MY_REGISTRY}/kubeflow-images-public-${MY_IMAGE_CPU}" docker pull ${MY_REGISTRY}/kubeflow-images-public-${MY_IMAGE_CPU} docker tag ${MY_REGISTRY}/kubeflow-images-public-${MY_IMAGE_CPU} gcr.io/kubeflow-images-public/${MY_IMAGE_CPU} echo "" echo "2. tensorflow-1.12.0-notebook-gpu" echo "PULL: ${MY_REGISTRY}/kubeflow-images-public-${MY_IMAGE_GPU}" docker pull ${MY_REGISTRY}/kubeflow-images-public-${MY_IMAGE_GPU} docker tag ${MY_REGISTRY}/kubeflow-images-public-${MY_IMAGE_GPU} gcr.io/kubeflow-images-public/${MY_IMAGE_GPU} echo "" echo "FINISHED." echo ""
下載,基礎資源已經準備好。
若是工做Pod被分配到其它節點,就在該節點運行上面的腳本獲取鏡像,必需要對應。
打開瀏覽器,輸入 http://10.1.1.13:80,而後輸入用戶名爲supermap和本身的密碼,就能夠進入jupyterhub系統了。
點擊 Start server啓動本身的工做臺。
在啓動工做pod時,遇到不斷重啓的問題,查看日誌顯示無寫入權限。
首先,檢查GlusterFS的ACL訪問權限,以下:
supermap@podc01:~/gvzr00$ getfacl /home/supermap/gvzr00 getfacl: 從絕對路徑名尾部去除" / "字符。 # file: home/supermap/gvzr00 # owner: root # group: root user::rwx group::r-x other::r-x
修改GlusterFS權限設置,步驟以下:
mkdir /home/supermap/gvzr00 sudo mount -t glusterfs 10.1.1.201:/gvzr00 /home/supermap/gvzr00
sudo setfacl -m o::rwx /home/supermap/gvzr00
supermap@podc01:~/gvzr00$ getfacl /home/supermap/gvzr00 getfacl: 從絕對路徑名尾部去除" / "字符。 # file: home/supermap/gvzr00 # owner: root # group: root user::rwx group::r-x other::rwx
若是還有其它的存儲訪問權限問題,解決線索以下: