0%

Kubeflow v0.7 - Multi-user, auth-enabled 部署教學

Kubeflow

介紹

Kubeflow是一個開源軟體,致力於提供使用者於Kubernetes上快速便捷的部署與管理ML Workflow。從最開始可以整合Jupyterhub做單機訓練、或是利用tf-operator管理分散式訓練,到最近加入Pipeline功能來整合前面資料處理與後續的模型服務,功能性與規模可以說在這一兩年快速成長,版本也從2018年5月發行的0.1版推進到2019年11月的0.7版,並且預計於明年1月正式推出1.0版。

0.7版更新與介紹

而在0.7版最重要的功能即是搭配Istio加入的使用者認證權限管理。此功能讓一個Kubeflow的可以讓多人使用,並透過Group的概念在多個使用者間共享資源與權限,旨在成為一個通用全方位的AI平台。

使用者認證與權限管理由Arrikto團隊實現與維護。

部署教學

環境準備

此部署可以在雲端環境抑或是裸機環境,並沒有限制。請確保部署前Kubernetes集群正常運作。

下載安裝檔案

Kubeflow目前透過子專案kfctl來發布與安裝Kubeflow

  1. 下載 kfctl v0.7.0 發布版本 Kubeflow releases page
  2. 解壓縮
    tar -xvf kfctl_<release tag>_<platform>.tar.gz

  3. 設定環境變數,方便後續部署。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    # 以利後需使用kfctl指令
    export PATH=$PATH:"<path-to-kfctl>"

    # 部署將會使用這個設定檔
    export CONFIG_URI="https://raw.githubusercontent.com/kubeflow/manifests/dc04ff600cee722d93cf80d413aa73ddd8387f1f/kfdef/kfctl_existing_arrikto.0.7.0.yaml"

    # Kubeflow安裝過程生成的設定檔存放的資料夾名,可以設定成`my-kubeflow`或是`kf-test`
    export KF_NAME=<your choice of name for the Kubeflow deployment>

    # 放置Kubeflow專案的資料夾路徑
    export BASE_DIR=<path to a base directory>

    # 此次部署Kubeflow的的完整路徑
    export KF_DIR=${BASE_DIR}/${KF_NAME}

安裝 Kubeflow

使用官方的kfctl即可方便的一個指令部署。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 來到Kubeflow專案底下
mkdir -p ${KF_DIR}
cd ${KF_DIR}

# 下載預設的設定檔
wget -O kfctl_existing_arrikto.yaml $CONFIG_URI
export CONFIG_FILE=${KF_DIR}/kfctl_existing_arrikto.yaml

# 預設的登錄帳號密碼為admin@kubeflow.org:12341234
# 可以透過更改設定檔設定
vim $CONFIG_FILE

# 解壓縮後的執行檔可能為kfctl-darwin,可以自行修改名字為kfctl,方便指令輸入
kfctl apply -V -f ${CONFIG_FILE}

等候大約幾分鐘後,即會看到以下部署成功的字樣

1
INFO[0154] Applied the configuration Successfully!       filename="cmd/apply.go:72"

可以檢查所有kubeflow namespace底下的pod來確認是否部署成功。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
$ kubectl get po -n kubeflow
NAME READY STATUS RESTARTS AGE
admission-webhook-deployment-6cf94887bf-t4zpv 1/1 Running 0 10h
application-controller-stateful-set-0 1/1 Running 0 10h
argo-ui-7fd48cdc66-dt6mf 1/1 Running 0 10h
centraldashboard-64c4cb4c6-fp6z8 1/1 Running 0 10h
jupyter-web-app-deployment-5f9bbcb94b-pvn67 1/1 Running 0 10h
katib-controller-5645cb8675-kk86l 1/1 Running 1 10h
katib-db-57d7c5b64b-x6qxp 1/1 Running 0 10h
katib-manager-5679669f96-vvf92 1/1 Running 1 10h
katib-ui-68c6747887-2fbjw 1/1 Running 0 10h
metadata-db-7f78b5fbf8-cfngw 1/1 Running 0 10h
metadata-deployment-6d47b67dcd-lzcng 1/1 Running 0 10h
metadata-deployment-6d47b67dcd-rzdlv 1/1 Running 2 10h
metadata-envoy-deployment-75d958657-nb9cg 1/1 Running 0 10h
metadata-grpc-deployment-9d79d848-csnmj 1/1 Running 4 10h
metadata-grpc-deployment-9d79d848-zkm7z 1/1 Running 3 10h
metadata-ui-547b468655-7l9m2 1/1 Running 0 10h
minio-d96d4f4cf-9tml2 1/1 Running 0 10h
ml-pipeline-86cf8589b9-662mq 1/1 Running 0 10h
ml-pipeline-ml-pipeline-visualizationserver-d494fcb84-g9kdr 1/1 Running 0 10h
ml-pipeline-persistenceagent-5c4d6c5b54-qfjm6 1/1 Running 0 10h
ml-pipeline-scheduledworkflow-7fbfb9c745-7tbcj 1/1 Running 0 10h
ml-pipeline-ui-55cd89c8fc-gf8sc 1/1 Running 0 10h
ml-pipeline-viewer-controller-deployment-68c746f8d5-hvzrs 1/1 Running 0 10h
mysql-74578b646b-tbsmk 1/1 Running 0 10h
notebook-controller-deployment-6f45dbcd6d-k6jrw 1/1 Running 0 10h
profiles-deployment-6f7ddff899-n4hwh 2/2 Running 0 10h
pytorch-operator-7fcb66d589-xb7bp 1/1 Running 0 10h
seldon-operator-controller-manager-0 1/1 Running 1 10h
spartakus-volunteer-ddc6fcd5f-pqs6z 1/1 Running 0 10h
tensorboard-55d9cd67bc-59nqx 0/1 Pending 0 10h
tf-job-operator-76dd589674-dkpqp 1/1 Running 0 10h
workflow-controller-645f7bd769-nznh4 1/1 Running 0 10h

因為v0.7.0版會同時部署istio,因此也可以檢查istio相關資源是否成功部署。

1
$ kubectl get po -n istio-system

使用Kubeflow

使用預設帳號密碼登入

首先透過port-forward來使用Kubeflow服務

1
2
# 透過localhost:8080連上
kubectl port-forward svc/istio-ingressgateway -n istio-system 8080:80

接著會出現以下畫面

使用帳號密碼 `admin@kubeflow.org:12341234`即可登入。

接著會出現下面兩個對話筐,都直接確認即可。第一次登入即會幫該使用者也就是 `admin@kubeflow.org創建他專屬的namespaceadmin`

至此Kubeflow即部署完成,可以從Dashboard使用各種服務包含Jupyter NotebookPipeline

多使用者情境

首先直接看Kubeflow官方的多使用者情境示意圖。

如同剛剛提到的,在第一次登入後即會創建該使用者的namespace。接著使用者的所有操作皆會被限制在該namespace中,包含創建的notebookpipeline都會在該namespace底下,與其他使用者隔離。

底下我們透過新增一個使用者來探索多使用者情境。

增加一個新使用者

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# 取得目前dex使用的設定檔
kubectl get configmap dex -n auth -o jsonpath='{.data.config\.yaml}' > dex-config.yaml

# 修改 dex-config.yaml
# 新增一個使用者,密碼必須使用bcrypt做hash,可以使用此網站: https://passwordhashing.com/BCrypt
# 也可以直接使用我這邊提供的做測試
# 帳號: demo@kubeflow.org 密碼:demo

vim dex-config.yaml
staticPasswords:
- email: admin@kubeflow.org
hash: $2y$12$ruoM7FqXrpVgaol44eRZW.4HWS8SAvg6KYVVSCIwKQPBmTpCm.EeO
username: admin
userID: 08a8684b-db88-4b73-90a9-3cd1661f5466
- email: demo@kubeflow.org
hash: $2b$10$uVAyiJKu.9fFICQOixELYu1VLvHnYmvLX.UMktzY0ImLqR5gz2qVC
username: demo

# 更新ConfigMap
kubectl create configmap dex --from-file=config.yaml=dex-config.yaml -n auth --dry-run -oyaml | kubectl apply -f -

# 更新dex這個pod來使用最新的ConfigMap
kubectl rollout status deployment dex -n auth

# 如果沒有效果,直接刪除namespace auth 底下的的dex pod,讓deployment重新啟動一個

多使用者隔離

kubernetes 資源隔離

開啟兩個視窗一個使用admin登入,另一個使用demo登入。首先在左上角可以選擇namespace,目前只能選擇自己的namespace。

  1. admin 開啟一個 notebook
  2. demo 開啟一個 notebook

可以發現兩個人只可以看到自己的notebook。

此時當demo這個帳號的視窗,
嘗試直接使用admin的url http://localhost:8080/_/jupyter/?ns=admin
查看admin的notebook會出現如下錯誤。

因為demo這個帳號並沒有存取admin資源的權限,也就是無法存取查看admin namespace底下的所有kubernetes資源。

kubernetes服務隔離

那如果demo這個帳號打算直接透過url連結admin剛剛創建的notebook?

會出現如上的示意圖顯示RBAC Denied,也就是說demo也不能連線使用admin namespace底下的服務。

共享資源

那如果我們希望像上面多使用者情境的示意圖中,有一個共享的資源該如何實作呢?

  1. 回到admin這個帳號的主頁
  2. 選擇左邊欄的 Manage Contributors
  3. 新增 Contributor demo@kubeflow.org

此時demo這個帳號可以共享與使用admin的資源與服務了。

  • demo帳號左上角可以選擇admin namespace,且可以查看admin的notebook了。
  • 另外我們在測試使用url使用admin notebook。

小結

以上就是 Kubeflow v0.7.0 多使用者情境,這個可以算是邁向v1.0前最重要的新加入功能,已經可以說是production ready了。本篇的部署方式是使用Dex與靜態檔案,而你也可以替換Dex的Backend串接第三方的認證管理,例如Google或是Github。

作為Kubeflow Member,也聊一下關於Kubeflow的未來規劃。目前基本的功能都可以說穩定且完整了,未來將朝向critical user journeys的完善,例如如何讓notebook開發模型到送上pipeline進行訓練的流程更為簡單。相關影片可以參考: https://www.youtube.com/watch?v=C9rJzTzVzvQ

另外,本人此次參與2019 KubeConNA也發現導入Kubeflow的公司越來越多了,除了直接使用外,也有許多團隊嘗試將Kubeflow結合內部的系統已滿組內部使用需求,例如: Uber、Spotify與Lyft等都有相關的演講可以參考。

因為Kubeflow實作使用者認證的方式是搭配Istio實作,算是一個通用且蠻有參考價值的做法,接下來兩篇將會詳解整個實作,提供大家一個在Kubernetes上實作多使用者隔離的方法。

連結

Kubeflow如何搭配Istio實作Multi-user認證與權限管理(上)
Kubeflow如何搭配Istio實作Multi-user認證與權限管理(下)