文档章节

Kubeflow更新升级到0.4.1

openthings
 openthings
发布于 01/28 11:06
字数 1796
阅读 527
收藏 0

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、更多参考

© 著作权归作者所有

openthings
粉丝 322
博文 1134
码字总数 686058
作品 1
东城
架构师
私信 提问
加载中

评论(2)

openthings
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库中也由其他模块代替了,感谢指出!
l
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
AirFlow/NiFi/MLFlow/KubeFlow进展

大数据分析中,进行流程化的批处理是必不可少的。传统的大数据处理大部分是基于关系数据库系统,难以实现大规模扩展;主流的基于Hadoop/Spark体系总体性能较强,但使用复杂、扩展能力弱。大数...

openthings
06/21
330
0
elementary OS 0.4.1 发布,基于 Ubuntu 的桌面发行

elementary OS 0.4.1 发布了,这是该项目的“Loki”系列的首个更新。新版本基于 Ubuntu 16.04.2。有以下主要更新内容: Loki 所有的更新到目前为止,包括带来一个新的 Hardware Enablement ...

局长
2017/05/19
3.5K
5
Kubeflow等镜像部署到集群多节点

为了将Kubeflow(https://github.com/kubeflow/kubeflow)/Kubernetes等镜像放到本地集群部署或者更新,需要一系列的操作。如果集群的多个节点同时访问外部镜像服务,将带来较大的并发网络流...

openthings
2018/11/28
392
0
Java 开源博客——B3log Solo 0.4.1 正式版发布了!

Java 开源博客 —— B3LOG Solo 0.4.1 正式版发布了! 从 0.4.1 开始,B3log Solo 正式同时支持 GAE 平台与常规 Servlet 容器。 特性 基于标签的文章分类 Ping Google Blog Search Engine 博...

88250
2012/04/25
2.2K
8
Leanote 桌面客户端 V0.5 发布, 支持 Linux

Leanote桌面客户端 V0.5 发布, 支持Linux. 下载地址: http://app.leanote.com 0.4, 0.4.1版的朋友可以通过在线更新升级至0.5. 0.5的mac版将采用Electron构建, 之前使用NW构建的版本仍在维护,...

lifephp
2015/05/04
3.9K
10

没有更多内容

加载失败,请刷新页面

加载更多

Redis集群搭建

服务器资源 ip 账号 配置 操作系统 xxx.70 root/xxx 磁盘50G(/)+150G(/home)、内存16G、CPU 16core CentOS Linux release 7.2.1511 (Core) xxx.74 root/xxx 磁盘50G(/)+150G(/home)、......

jxlgzwh
3分钟前
0
0
avro

一、 ```我们已经接触过很多序列化框架(或者集成系统),比如protobuf、hessian、thrift等,它们各有优缺点以及各自的实用场景,Avro也是一个序列化框架,它的设计思想、编程模式都和thi...

hexiaoming123
4分钟前
0
0
QML TextInput的字体超出控件范围

本文链接:https://blog.csdn.net/chyuanrufeng/article/details/54691998 问题描述 :QML TextInput输入内容超过TextInput的大小 当输入过多的字符串时,会出现内容超过TextInput的大小,字...

shzwork
6分钟前
0
0
《Java 8 in Action》Chapter 10:用Optional取代null

1965年,英国一位名为Tony Hoare的计算机科学家在设计ALGOL W语言时提出了null引用的想法。ALGOL W是第一批在堆上分配记录的类型语言之一。Hoare选择null引用这种方式,“只是因为这种方法实...

HelloDeveloper
6分钟前
0
0
进击的 Java ,云原生时代的蜕变

作者| 易立 阿里云资深技术专家<br /> <br />导读:云原生时代的来临,与Java 开发者到底有什么联系?有人说,云原生压根不是为了 Java 存在的。然而,本文的作者却认为云原生时代,Java 依然...

阿里巴巴云原生
9分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部