Kubeflow更新升級到0.4.1

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

二、初始化kubeflow項目

ksonnet是一個通用的軟件包管理工具(參考《ksonnet 使用教程 》)。下一步,經過ksonnet爲kubeflow建立一個初始項目,而後在裏面添加相關的軟件包。docker

  • 系統文檔方法,使用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

推薦的方法如上,但我在使用時老是報錯,沒有成功地運行起來。api

而後改爲手動方式,不使用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問題解決》。bash

設置當前環境的namespace,對應於kubernetes集羣中的命名空間:app

NAMESPACE=kubeflow
kubectl create namespace ${NAMESPACE}
ks env set ${KF_ENV} --namespace ${NAMESPACE}
  • 注意,其中的KF_ENV爲ksonnet定義的部署環境,這裏直接設爲default。

三、生成Kubernetes的配置和部署

查看一下當前的環境:框架

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服務訪問

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的工做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啓動本身的工做臺。

七、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

若是還有其它的存儲訪問權限問題,解決線索以下:

八、更多參考

相關文章
相關標籤/搜索