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
若是还有其它的存储访问权限问题,解决线索以下: