vm.gowatana.jp

NEOにほんごVMware(仮)

Kubeflow を Standalone TKG 2.4 にインストールしてみる。(クリスマス編)

これは、vExperts Advent Calendar 2023 の1日めの投稿です。
今回は、Tanzu Kubernetes Grid(TKG)に Kubeflow をインストールしてみます。

adventar.org

 

今回の内容です。

 

はじめに

vSphere むけの Kubeflow ディストリビューションとして、vSphere Machine Learning Extension とよばれる Tanzu Package(Carvel のパッケージ)として公開されています。

 

ただしこれは、インストール手順などを確認すると基本的には vSphere with Tanzu 上での Tanzu Kubernetes Grid Service で利用される想定のようです。

 

しかしながら VMware カスタムな Kubeflow がどのようなものか自宅でもためしてみたいので、少しだけ構成のハードルをさげて Standalone TKG(vSphere with Tanzu なしの TKG)にインストールしてみます。ちなみに GPU もありません・・・

 

1. 今回の環境

まずは、すでに準備 / 構築してある環境についてです。

 

1-1. 利用するソフトウェア

利用するソフトウェアとバージョンは下記のようになっています。自宅にある既存検証環境を利用しているため、vSphere と ALB はすこし古めです。

  • vSphere 7.0 U3(vCenter Server 7.0 U3 / ESXi 7.0 U3)
  • NSX Advanced Load Balancer 22.1.3
  • Tanzu Kubernetes Grid 2.4.0
    • Kubernetes 1.25.13
      (TKR: Tanzu Kubernetes Release v1.25.13+vmware.1-tkg.1)
  • Tanzu CLI 1.1.0 ※ TKG Bootstrap マシンにインストール済。
  • Kubeflow 1.7.0

 

1-2. Kubernetes クラスタまわりの環境

Kubeflow は、Kubernetes にインストールするものなので、今回は、下記のように TKG 2.4.0 の環境を構築してあります。TKG 構築で必要になるロードバランサには、NSX ALB(旧 Avi)を利用しています。

 

TKG の操作や Kubeflow のインストールの作業マシンとして、TKG 構築時に用意した Bootstrap マシンを流用しています。

 

2. TKG Workload Cluster の作成

まずは、Kubeflow をインストール Kubernetes クラスタとして、TKG の Workload Cluster を作成します。

 

2-1. Workload Cluster 用 OVA のデプロイ

VMware Customer Connect の TKG 2.4 のダウンロード ページ から下記の OVA ファイルをダウンロードします。

  • photon-3-kube-v1.25.13+vmware.1-tkg.1-90474fbeb493aec5c7f4911529f71225.ova

 

そして下記の名前で vCenter Server のインベントリへにインポートします。

  • photon-3-kube-v1.25.13+vmware.1

 

インボートが完了したら、仮想マシン テンプレートに変換しておきます。

 

2-2. Workload Cluster を定義した YAML の用意

Workload Cluster の YAML ファイルを作成します。これは、以前に作成した Workload Cluster の YAML ファイルを編集して作成します。

 

tkg24wc01_avi_v1.25.yml

  • クラスタの名前は tkg24wc01 にします。
  • 24、137行目: Kubernetes のバージョンは v1.25.13 です。
  • 75、145行目: Control Plane / Worker は、どちらも仮想マシン 1台です。
  • 91~92行目: Kube API Server の HAProvider LB として、NSX ALB を利用します。
  • 95~101行目: vCenter インベントリ オブジェクトは事前に作成しておきます。
  • 107行目: SSH の公開鍵を指定します。
  • 117~119行目: Worker ノードのリソースを、Kubeflow のシステム要件にあわせています。

gist.github.com

 

2-3. Workload Cluster の作成(Tanzu CLI)

Tanzu CLI で、Workload Cluster を作成します。仮想マシンが作成されて Kubernetes クラスタになるまで、ひたすら待ちます。

$ tanzu cluster create -f tkg24wc01_avi_v1.25.yml
Validating configuration...
cluster class based input file detected, getting tkr version from input yaml
input TKR Version: v1.25.13+vmware.1-tkg.1
TKR Version v1.25.13+vmware.1-tkg.1, Kubernetes Version v1.25.13+vmware.1-tkg.1 configured
Warning: Pinniped configuration not found; Authentication via Pinniped will not be set up in this cluster. If you wish to set up Pinniped after the cluster is created, please refer to the documentation.
Skip checking VIP overlap when the VIP is empty. Cluster's endpoint VIP will be allocated by NSX ALB IPAM.
creating workload cluster 'tkg24wc01'...
waiting for cluster to be initialized...
[zero or multiple KCP objects found for the given cluster, 0 tkg24wc01 default, no MachineDeployment objects found for the given cluster]
cluster control plane is still being initialized: ScalingUp
waiting for cluster nodes to be available...
unable to get the autoscaler deployment, maybe it is not exist
waiting for addons core packages installation...

Workload cluster 'tkg24wc01' created

 

Workload Cluster が作成されたことを確認しておきます。

$ tanzu cluster list
  NAME       NAMESPACE  STATUS   CONTROLPLANE  WORKERS  KUBERNETES         ROLES   PLAN  TKR
  tkg24wc01  default    running  1/1           1/1      v1.25.13+vmware.1  < none >  dev   v1.25.13---vmware.1-tkg.1

 

kubectl で Workload Cluster に接続できるように、kubeconfig を取得します。
保存されるコンテキストは、次のようになっています。

  • <クラスタ>-admin@<クラスタ名>
$ tanzu cluster kubeconfig get tkg24wc01 --admin
Credentials of cluster 'tkg24wc01' have been saved
You can now access the cluster by running 'kubectl config use-context tkg24wc01-admin@tkg24wc01'

 

Workload Cluster を操作できるように、コンテキストに切り替えます。

$ kubectl config use-context tkg24wc01-admin@tkg24wc01
Switched to context "tkg24wc01-admin@tkg24wc01".

 

Workload Cluster にアクセスできるようになったことを確認しておきます。

$ kubectl get nodes
NAME                                          STATUS   ROLES           AGE     VERSION
tkg24wc01-md-0-vsxdj-5d6dc4c69bx96ckx-8x5dm   Ready    <none>          3m25s   v1.25.13+vmware.1
tkg24wc01-tvc9v-hzn74                         Ready    control-plane   6m19s   v1.25.13+vmware.1

 

3. Tanzu Package での Kubeflow インストール

Tanzu CLI で、Kubeflow パッケージをインストールします。

 

3-1. パッケージ リポジトリの追加

Tanzu Package のリポジトリを追加します。追加先の Namespace も一緒に作成しています。

$ tanzu package repository add kubeflow-carvel-repo --namespace carvel-kubeflow --url projects.registry.vmware.com/kubeflow/kubeflow-carvel-repo --create-namespace

 

これでリポジトリが追加されました。

$ tanzu package available list --namespace carvel-kubeflow

  NAME                                 DISPLAY-NAME
  kubeflow.community.tanzu.vmware.com  kubeflow

 

この 2023/12/1 時点での kubeflow パッケージの最新版は、v1.7.0 です。

$ tanzu package available list --namespace carvel-kubeflow kubeflow.community.tanzu.vmware.com

  NAME                                 VERSION  RELEASED-AT
  kubeflow.community.tanzu.vmware.com  1.6.0    -
  kubeflow.community.tanzu.vmware.com  1.6.1    -
  kubeflow.community.tanzu.vmware.com  1.7.0    -

 

Kubeflow v1.7.0 のパッケージ情報です。

demo-01@lab-tkg-02 [ ~ ]$ tanzu package available get --namespace carvel-kubeflow kubeflow.community.tanzu.vmware.com/1.7.0

NAME:                         kubeflow.community.tanzu.vmware.com
DISPLAY-NAME:                 kubeflow
CATEGORIES:                   - machine learning
- MLOps
SHORT-DESCRIPTION:            The Machine Learning Toolkit for Kubernetes
LONG-DESCRIPTION:             The Machine Learning Toolkit for Kubernetes
PROVIDER:                     VMware
MAINTAINERS:                  - name: Jinheng Xu
SUPPORT-DESCRIPTION:
VERSION:                      1.7.0
RELEASED-AT:                  -
MIN-CAPACITY-REQUIREMENTS:
RELEASE-NOTES:                Kubeflow 1.7.0 https://github.com/kubeflow/manifests/releases/tag/v1.7.0
LICENSES:                     Apache 2.0

 

3-2. Kubeflow のインストール

Kubeflow のパラメータを記載した YAML ファイルを作成します。

  • TKG では NSX ALB を利用しているので Service リソースの ServiceType は LoadBalancer にします。
  • IP アドレスはあえて未指定にして、NSX ALB の IP プールから払い出します。
cat << EOF > config.yaml
service_type: "LoadBalancer"
IP_address: ""
CD_REGISTRATION_FLOW: True
EOF

 

そして、tanzu package install コマンドでインストールします。

$ tanzu package install kubeflow --namespace carvel-kubeflow --package kubeflow.community.tanzu.vmware.com --version 1.7.0 --values-file config.yaml

 

ちなみに TKG 2.4 で利用できる最新 Kubernetes のバージョンは v1.27 ですが、autoscaling/v2beta2 API が廃止されているため下記のようなエラーで失敗してしまいます。そのため、今回はあえて API が廃止されていない v1.25 で Workload Cluster を作成しています。

6:26:05AM: packageinstall/kubeflow (packaging.carvel.dev/v1alpha1) namespace: carvel-kubeflow: ReconcileFailed
Error: packageinstall/kubeflow (packaging.carvel.dev/v1alpha1) namespace: carvel-kubeflow: Reconciling: kapp: Error: Expected to find kind 'autoscaling/v2beta2/HorizontalPodAutoscaler', but did not:
- Kubernetes API server did not have matching apiVersion + kind
- No matching CRD was found in given configuration. Reconcile failed: Error (see .status.usefulErrorMessage for details)

 

処理が完了したら、インストールが成功していることを確認しておきます。

$ tanzu package installed list --namespace carvel-kubeflow

  NAME      PACKAGE-NAME                         PACKAGE-VERSION  STATUS
  kubeflow  kubeflow.community.tanzu.vmware.com  1.7.0            Reconcile succeeded

 

インストール完了までに時間がかかるので、失敗するようであればタイムアウトを伸ばしたりするはずです。

$ kubectl get apps -n carvel-kubeflow
NAME       DESCRIPTION           SINCE-DEPLOY   AGE
kubeflow   Reconcile succeeded   35m            35m

 

3-3. kubeflow Web UI へのログイン

kubeflow の Web UI にログインするため、LB の VIP(EXTERNAL-IP)を確認しておきます。ちなみに、この IP(VIP)アドレスは NSX ALB の Virtual Service によって提供されています。

$ kubectl get svc -n istio-system istio-ingressgateway
NAME                   TYPE           CLUSTER-IP       EXTERNAL-IP      PORT(S)                                                                      AGE
istio-ingressgateway   LoadBalancer   100.67.165.127   192.168.61.224   15021:32054/TCP,80:32532/TCP,443:32155/TCP,31400:32474/TCP,15443:30396/TCP   37m

 

istio-ingressgateway サービスの IP アドレスに Web ブラウザからアクセスすると、Dex によるログイン画面が表示されます。

デフォルトで作成される、下記のユーザアカウントでログインします。

  • ユーザー: user@example.com
  • パスワード: 12341234

 

「Start Setup」をクリックします。

 

Namespace を作成します。これは、Kubernetes の Namespace です。

  • Namespace: demo-01

 

VMware の vm マークがある Kubeflow にログインできました。

 

4. 使い始めてみる(Notebook 作成)

まずは、Python コードを書きつつ試行錯誤ができる「Notebook」から使い始めてみます。

 

4-0. CSRF エラーの暫定対処

今回は HTTPS ではなく HTTP で構成されているため、このあとの Notebook 作成時などで CSRF エラーが発生してしまいます。ちなみに、これは他の機能でも発生しますが、ここでは Notebook だけ暫定対応しておきます。



kubectl edit で、機能を提供している deployment リソース(jupyter-web-app-deployment)の設定を修正します。

$ kubectl -n kubeflow edit deploy jupyter-web-app-deployment 

 

APP_SECURE_COOKIES を true → false に変更します。設定を保存すると、Pod は自動再作成されます。

※じつはこの設定は kapp-controller の Reconcile で戻されてしまうのですが、ひとまず暫定対処といことで先に進みます・・・

    spec:
      containers:
      - env:
        - name: APP_PREFIX
          value: /jupyter
        - name: UI
          value: default
        - name: USERID_HEADER
          value: kubeflow-userid
        - name: USERID_PREFIX
        - name: APP_SECURE_COOKIES
          value: "false" ★

 

エディタを終了すると、実際には、下記のようになります。

$ kubectl -n kubeflow edit deployments.apps jupyter-web-app-deployment
Warning: would violate PodSecurity "restricted:v1.24": allowPrivilegeEscalation != false (container "jupyter-web-app" must set securityContext.allowPrivilegeEscalation=false), unrestricted capabilities (container "jupyter-web-app" must set securityContext.capabilities.drop=["ALL"]), runAsNonRoot != true (pod or container "jupyter-web-app" must set securityContext.runAsNonRoot=true), seccompProfile (pod or container "jupyter-web-app" must set securityContext.seccompProfile.type to "RuntimeDefault" or "Localhost")
deployment.apps/jupyter-web-app-deployment edited

 

自動的に再作成された Pod に設定が反映されていることを確認します。

$ kubectl -n kubeflow get pod -l app=jupyter-web-app
NAME                                          READY   STATUS        RESTARTS   AGE
jupyter-web-app-deployment-77c4875dcc-lbtjz   2/2     Running       0          16s

 

あらたに起動された Pod には、設定変更が反映されています。

$ kubectl -n kubeflow get pod -l app=jupyter-web-app -o jsonpath="{.items[*].spec.containers[*].env[?(@.name=='APP_SECURE_COOKIES')]}" | more
{"name":"APP_SECURE_COOKIES","value":"false"}

 

4-1. Notebook の作成

今回は、ベーシックな Jupyter Notebook のコンテナを起動してみます。

「Notebooks」メニューを開いて、「New Notebook」をクリックします。

 

下記のように入力します。

  • Name: note-01
  • Custom Image: チェック ON
  • Custom Image:kubeflownotebookswg/jupyter:v1.8.0
    ※これは Docker Hub のコンテナ イメージを利用します。

画面を下にスクロールします。

 

「LAUNCH」をクリックします。

 

Notebook の作成が開始されるので、コンテナ イメージがダウンロード → 起動されるのを待ちます。

 

Notebook の作成が完了したら、「CONNECT」をクリックします。

 

Jupyther Nootbook の画面が開きました。「Python 3 (ipykernel)」をクリックします。

 

.ipynb ファイルが作成されて、Python コードやテキストを書き込めるようになります。

 

4-2. Python コードを実行してみる

今回は、下記のような Python コードを用意しました。

gist.github.com

 

セル(青い四角枠のあたり)に、下記のコードをはりつけて、Ctrl + Enter キーを押すと・・・

 

Python コードが実行できることが確認できました。

 

これで、機械学習ライブラリや MLOps 素振りの環境ができた(かもしれない)と思います。GPU 搭載 vSphere with Tanzu 環境募集中・・・

 

ちなみに、ちゃんと vSphere with Tanzu + GPU 環境でかつしっかりした手順については、masanara さんの投稿(下記)がおすすめです。

qiita.com

 

以上、Standalone TKG に Kubeflow の素振り環境を用意してみる話でした。

vExperts Advent Calendar 2023 の2日めは、sky_jokerxx さんよろしくお願いします。