Kubeflow更新升级到0.4.1

原创
2019/01/28 11:06
阅读数 1.6K

Kubeflow是面向Kubernetes集群基础设施的机器学习服务组件。kubeflow采用ksonnet进行软件包管理和部署的,与其它的应用采用Helm的机制有较大的不同。从2018年设立至今,kubeflow项目发展迅速,目前为0.4.1版本,与之前版本的变化比较大,原来的一些安装和使用方法(参考《Kubeflow 使用指南》)需要进行调整。这里主要记录了使用kubeflow 0.4.1版本的过程。

1、准备工作

获取 ksonnet的最新版本(目前为0.13.1),脚本如下:

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版本:

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

2、初始化kubeflow项目

ksonnet是一个通用的软件包管理工具(参考《ksonnet 使用教程 》)。下一步,通过ksonnet为kubeflow创建一个初始项目,然后在里面添加相关的软件包。

  • 系统文档方法,使用kfctl脚本。
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

推荐的方法如上,但我在使用时总是报错,没有成功地运行起来。

然后改成手动方式,不使用kfctl的脚本。

  • 直接初始化My kubeflow,添加pkg。
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}
  • 注意,原来低版本的core已经没有了。查看完整的包列表使用命令 ks pkg list

添加过程中,会出现github访问的rate limit问题,参考《git访问github的rate limit问题解决》。

设置当前环境的namespace,对应于kubernetes集群中的命名空间:

NAMESPACE=kubeflow
kubectl create namespace ${NAMESPACE}
ks env set ${KF_ENV} --namespace ${NAMESPACE}
  • 注意,其中的KF_ENV为ksonnet定义的部署环境,这里直接设为default。

3、生成Kubernetes的配置和部署

查看一下当前的环境:

ks env list

创建k8s配置,以jupyter为例。

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

4、Jupyter服务访问

jupyter-lb service的访问,需要将其设为NodePort或者LoadBalancer。

kubectl edit svc/service/jupyter-lb -n kubeflow

修改里面的服务类型,我这里安装了MetalLB,所以使用LoadBalancer模式。

5、存储的访问

缺省情况下,工作镜像使用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成功。

6、启动JupyterHub的工作Pod

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启动自己的工作台。

7、GlusterFS访问的权限问题

在启动工作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
  • 改变访问权限。
    • 我这里授予所有用户的读写执行权限,生产环境根据需要进行设置。
    • 下面的o::rwx中,o代表其他用户(没有明确用户名的),rwx为读写执行权限。
sudo setfacl -m o::rwx /home/supermap/gvzr00
  • 查看权限。注意other的权限从r-x变为了rwx。
supermap@podc01:~/gvzr00$ getfacl /home/supermap/gvzr00
getfacl: 从绝对路径名尾部去除" / "字符。
# file: home/supermap/gvzr00
# owner: root
# group: root
user::rwx
group::r-x
other::rwx

如果还有其它的存储访问权限问题,解决线索如下:

8、更多参考

展开阅读全文
打赏
1
0 收藏
分享
加载中
openthings博主

引用来自“laomao28”的评论

谢谢您的”Kubeflow更新升级到0.4.1“的分享。我跟随您的文章去初始化My kubeflow,添加pkg。当执行以下命令时安装tf-job时总是返回“404 Not Found []”。 ks pkg list 没有查到 tf-job pkg。请教您是如何成功安装tf-job pkg?

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

GET https://api.github.com/repos/kubeflow/kubeflow/contents/kubeflow/tf-job/parts.yaml?ref=797bcb7407a589bacc35b9624120f51f36a83468: 404 Not Found
您好:确认了下,应该是tf-training,因为从原来的文章复制过来,修改时漏掉了,抱歉,上文已经改正。原来的tf-job在0.4.1版本的pkg库中也由其他模块代替了,感谢指出!
2019/01/31 10:17
回复
举报
谢谢您的”Kubeflow更新升级到0.4.1“的分享。我跟随您的文章去初始化My kubeflow,添加pkg。当执行以下命令时安装tf-job时总是返回“404 Not Found []”。 ks pkg list 没有查到 tf-job pkg。请教您是如何成功安装tf-job pkg?

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

GET https://api.github.com/repos/kubeflow/kubeflow/contents/kubeflow/tf-job/parts.yaml?ref=797bcb7407a589bacc35b9624120f51f36a83468: 404 Not Found
2019/01/31 06:32
回复
举报
更多评论
打赏
2 评论
0 收藏
1
分享
返回顶部
顶部