在kubernetes集群上使用ks搭建kubeflow

安装ks:

$ wget https://github.com/ksonnet/ksonnet/releases/download/v0.9.2/ks_0.9.2_linux_amd64.tar.gz

$ tar xvf ks_0.11.0_linux_amd64.tar.gz

$ sudo cp ks_0.11.0_linux_amd64/ks /usr/local/bin/

$ ks version

ksonnet version: 0.11.0

 

初始化ks应用程序目录:

$ ks init my_kubeflow

 

安装kubeflow套件到ks应用程序

$ cd my_kubeflow

$ export GITHUB_TOKEN=99510f2ccf40e496d1e97dbec9f31cb16770b884

#$ ks registry add kubeflow github.com/kubeflow/kubeflow/tree/master/kubeflow

$ks registry add kubeflow github.com/katacoda/kubeflow-ksonnet/tree/master/kubeflow

$ ks pkg install kubeflow/argo

$ ks pkg install kubeflow/core

$ ks pkg install kubeflow/seldon

$ ks pkg install kubeflow/tf-serving

 

另外一种安装方式,指定版本:

$ cd my_kubeflow

$ ks registry add kubeflow github.com/kubeflow/kubeflow/tree/master/kubeflow

$ VERSION=v0.1.2

$ ks pkg install kubeflow/core@${VERSION}

$ ks pkg install kubeflow/tf-serving@${VERSION}

$ ks pkg install kubeflow/tf-job@${VERSION}

 

另外一种安装方式,指定0.4.1版本:

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}

 

ks apply ${KF_ENV} -c jupyter

 

然后建立 Kubeflow 核心组件,该组件包含 JupyterHub 和 TensorFlow job controller:

kubectl create namespace kubeflow

kubectl create clusterrolebinding tf-admin --clusterrole=cluster-admin --serviceaccount=default:tf-job-operator

ks env add kubeflow

ks env set kubeflow --namespace kubeflow

ks env list

ks generate kubeflow-core kubeflow-core --name=kubeflow-core --namespace=kubeflow

 

ks apply kubeflow -c kubeflow-core

PODNAME=`kubectl get pods --namespace=kubeflow --selector="app=tf-hub" --output=template --template="{{with index .items 0}}{{.metadata.name}}{{end}}"`

 

此时转入后台执行,但是可以发现很多pod状态不对:

在kubernetes集群上使用ks搭建kubeflow_第1张图片

可以通过:

kubectl -n kubeflow describe pod pod_name查看pod的状态:

在kubernetes集群上使用ks搭建kubeflow_第2张图片

可以发现出错在image的获取上,根本原因还是GFW的问题。

 

手动下载ambassador镜像:

Docker pull quay.io/datawire/ambassador:0.30.1

docker tag svendowideit/ambassador quay.io/datawire/ambassador:0.30.1

 

下载tf-operator镜像:

docker pull quelle/tf_operator:v0.2.0

通过kubectl -n kubeflow edit pod tf-job-dashboard-87bb756b7-tj6v6查看yaml文件里面用到的tf-operator镜像的信息

然后通过:

docker tag quelle/tf_operator:v0.2.0 gcr.io/kubeflow-images-public/tf_operator:v0.2.0

匹配对应的版本

 

下载jupyterhub-k8s镜像:

docker pull lcax200000/jupyterhub-k8s:v20180531-3bb991b1

 

docker tag lcax200000/jupyterhub-k8s: :v20180531-3bb991b1gcr.io/kubeflow/jupyterhub-k8s:v20180531-3bb991b1

同样使用docker tag命令改变镜像的版本信息,匹配yaml文件里面指定的版本信息

 

下载centraldashboard镜像:

Docker pull lowyard/centraldashboard:v0.2.1

Docker tag  lowyard/centraldashboard:v0.2.1  gcr.io/kubeflow-images-public/centraldashboard:v0.2.1

 

最终的状态:

 

在kubernetes集群上使用ks搭建kubeflow_第3张图片

在启动过程中有时会遇到ambassador服务一致处于crash状态,这个跟网络有关,通过

kubectl logs --namespace=kubeflow ambassador-68954d75f4-l5zzs -c ambassador命令查看log输出可以得到以下信息,主要是该服务无法访问kubernaut.io 的443端口,与当前网络有关,解决方法:

1) 执行 iptables -P FORWARD ACCEPT,并可通过ping kubernaut.io 和telnet kubernaut.io 443检查网络

2)wget https://kubernaut.io/scout

3)在coredns的yaml文件中加入对ip 和 hostname的静态解析

kubectl edit configmap coredns -n kube-system

修改完成后重启coredns pod

在kubernetes集群上使用ks搭建kubeflow_第4张图片

4)如果都没问题可以尝试使用如下命令重启ambassador pod:

kubectl get pod ambassador -n kubeflow -o yaml | kubectl replace --force -f -

 

在kubernetes集群上使用ks搭建kubeflow_第5张图片

 

在kubernetes集群上使用ks搭建kubeflow_第6张图片

 

这时候可以使用cluster ui访问不同的服务,这里使用nodeport,把相应的端口映射到主机master上的特定端口:
$ kubectl -n kubeflow edit svc tf-hub-lb
...

在kubernetes集群上使用ks搭建kubeflow_第7张图片

 

通过nodeport把端口暴露给master端口,通过127.0.0.1:port访问

 

Tf-hub-lb服务:

访问mster_ip:30883即可访问tf-hub-lb服务

在kubernetes集群上使用ks搭建kubeflow_第8张图片

 

tf-job-dashboard服务访问:

访问mster_ip:31853即可访问tf-job-dashboard服务

 

在kubernetes集群上使用ks搭建kubeflow_第9张图片

 

Centraldashboard服务访问:

访问mster_ip:30177即可访问Centraldashboard服务

 

在kubernetes集群上使用ks搭建kubeflow_第10张图片

 

刪除kubeflow

kubectl delete namespace kubeflow -n kubeflow

 

至此,搭建工作完成

 

测试:

docker pull registry.aliyuncs.com/kubeflow-images-public/tensorflow-notebook-cpu

下载notebook镜像

kubectl port-forward svc/ambassador -n ${NAMESPACE} 8080:80

 

测试一:

利用TFjob测试tensorflow模型的训练:

创建tfjob的yaml文件,并通过改yaml生成对应的pod,该镜像主要做一个很简单的tensorflow程序:向量乘法,并输出结果:

#kubectl apply -f ~/example.yaml && kubectl get tfjob && kubectl get pods

在kubernetes集群上使用ks搭建kubeflow_第11张图片

手动下载gcr.io/tf-on-k8s-dogfood/tf_sample:dc944ff镜像:

#docker pull benni82/tf_sample:dc944ff

Docker tag benni82/tf_sample:dc944ff  gcr.io/tf-on-k8s-dogfood/tf_sample:dc944ff

Example.yaml:

在kubernetes集群上使用ks搭建kubeflow_第12张图片

 

通过下属命令查看上述实例的计算结果:

kubectl get pods --no-headers -o go-template --template '{{range .items}}{{.metadata.name}}{{"\n"}}{{end}}' | grep master | xargs kubectl logs -f

 

kubectl get pod coredns-78fcdf6894-wn78c -n kube-system -o yaml | kubectl replace --force -f -

 

测试二:

使用tensorflow-notebook-cpu编写代码执行,其实就是利用tensorflow-1.8.0-notebook-cpu:v0.2.1

Docker pull registry.aliyuncs.com/kubeflow-images-public/tensorflow-notebook-cpu

Docker tag registry.aliyuncs.com/kubeflow-images-public/tensorflow-notebook-cpu gcr.io/kubeflow-images-public/tensorflow-1.8.0-notebook-cpu:v0.2.1

启动jupyter notebook,notebook的运行需要kubernetes pv的支持,所以需要自己在集群中创建pv, 测试过程中我们使用nfs系统创建pv:

在kubernetes集群上使用ks搭建kubeflow_第13张图片

使用kubectl apply –f pv.yaml命令创建 名字为notebook-pv的pv存储,存储使用nfs系统, 存储目录在192.168.152.173主机下的/nfs-data/kubeflow-pv2/目录下:

在kubernetes集群上使用ks搭建kubeflow_第14张图片

 

点击提交按钮,在此过程中会下载notebook镜像,如果没有提前下载该过程会比较慢,下载完成后就会出现熟悉的jupyter界面了:

   在kubernetes集群上使用ks搭建kubeflow_第15张图片

现在我们就可以像在“单机版”里那样编写代码了。

每个Jupyter Notebook都运行在一个独立的Docker容器中,用户之间不会互相干扰,还可以通过New按钮创建一个Terminal

登陆到容器内部操作。

 

测试三:

Kubeflow提供了一个分布式训练的发起页面,在该页面填写训练名称、镜像地址、入口程序、所需资源和节点数等参数即可发起训练:

在kubernetes集群上使用ks搭建kubeflow_第16张图片

发起训练之后还可以通过Web页面查看运行状态,在这个页面中可以看到kubeflow通过镜像创建了一系列的容器,每个容器即为训练集群的一个节点

你可能感兴趣的:(linux,docker)