CodeReady Containers で Kubeflow
CodeReady Containers (以下 CRC)で Kubeflow を走らせた時のメモ.
詰まったところ
1. kfctl コマンドどこで実行するか
2. metadata-db が Error→CrashLoopBackOff を繰り返し,起動しない
前提となる CRC 構成は,以下の通り(以前の記事).
Kubeflow の公式ページに,OpenShift で Kubeflow をインストールするやり方が掲載されている.(バージョンは古いけれど)
詰まってしまったのは,kfctl コマンドのバイナリが,macOS 用と Linux 用しか提供されていないので,Hyper-V の Windows ホストでは実行できないこと.
そこで,以前の記事で,CRC Node の隣に構築した NFS サーバー(Linux)に kfctl を導入してインストールを行った.
kfctl のインストール
上記 GitHub リポジトリから,kfctl_v1.1.0-0-g9a3621e_linux.tar.gz をコピー
$ wget https://github.com/kubeflow/kfctl/releases/download/v1.1.0/kfctl_v1.1.0-0-g9a3621e_linux.tar.gz
$ zcat kfctl_v1.1.0-0-g9a3621e_linux.tar.gz | tar xpvf -
kfctl バイナリを PATH の通ったディレクトリにコピーする.
oc コマンドのインストール
oc コマンドで Pod の状態など確認するので同じくインストールしておく.
に従って,openshift-client-linux.tar.gz をダウンロード,展開し,同じく PATH の通ったディレクトリにコピーする.
kubeconfig ファイルの導入
oc コマンドも kfctl コマンドも,稼働している CRC 用に,~/.kube/config ファイルを用意しておかないと,動作しない.
Hyper-V ホストで,C:\User\<ユーザー名>\.crc\machines\crc フォルダに kubeconfig というファイルがあるので,これを NFS サーバーの ~/.kube/config にコピーする.
また,この環境特有の事情だが,CRC Node の IP アドレスは NFS サーバー上で稼働する dhcpd によって付与されており,これが今回 192.168.255.9 だったので,NFS サーバー上の /etc/hosts に以下のエントリを追記する
192.168.255.9 api.crc.testing
以上を実施して,oc コマンドが稼働することをチェックしておく.
$ oc status
In project default on server https://api.crc.testing:6443
svc/openshift - kubernetes.default.svc.cluster.local
svc/kubernetes - 172.25.0.1:443 -> 6443
View details with 'oc describe <resource>/<name>' or list everything with 'oc get all'.
インストール
あとは件の手順通り,
$ git clone https://github.com/opendatahub-io/manifests.git
Cloning into 'manifests'...
remote: Enumerating objects: 9521, done.
remote: Total 9521 (delta 0), reused 0 (delta 0), pack-reused 9521
Receiving objects: 100% (9521/9521), 37.45 MiB | 4.53 MiB/s, done.
Resolving deltas: 100% (5973/5973), done.
$ cd manifests
$ sed -i 's#uri: .*#uri: '$PWD'#' ./kfdef/kfctl_openshift.yaml
$ export KF_DIR=~/kubeflow
$ mkdir -p ${KF_DIR}
$ cp ./kfdef/kfctl_openshift.yaml ${KF_DIR}
$ cd ${KF_DIR}
$ kfctl build --file=kfctl_openshift.yaml
$ kfctl apply --file=kfctl_openshift.yaml
securitycontextconstraints.security.openshift.io/kubeflow-anyuid-istio created
securitycontextconstraints.security.openshift.io/kubeflow-anyuid-kubeflow created
customresourcedefinition.apiextensions.k8s.io/adapters.config.istio.io created
(中略)
certificate.cert-manager.io/seldon-serving-cert created
issuer.cert-manager.io/seldon-selfsigned-issuer created
validatingwebhookconfiguration.admissionregistration.k8s.io/seldon-validating-webhook-configuration-kubeflow created
$
最後のコマンドは,何回か途中で
WARN[0042] Encountered error applying application cert-manager: (kubeflow.error): Code 500 with message: Apply.Run : error when creating "/tmp/kout700586586": Internal error occurred: failed calling webhook "webhook.cert-manager.io": the server is currently unable to handle the request filename="kustomize/kustomize.go:266"
WARN[0042] Will retry in 3 seconds. filename="kustomize/kustomize.go:267"
を繰り返し吐き出すが,完了.あとは,oc get pods -n kubeflow を実行して,状況を観察する.
$ oc get pods -n kubeflow
NAME READY STATUS RESTARTS AGE
argo-ui-644f649c9-d7xxd 1/1 Running 0 5m3s
centraldashboard-558c95597c-t2hb5 1/1 Running 0 5m2s
jupyter-web-app-deployment-7b49bddb86-s9rsx 0/1 ContainerCreating 0 3m14s
katib-controller-9cd8f9954-6grb4 0/1 ContainerCreating 0 3m9s
katib-db-manager-686dc45fc4-b9zsp 0/1 Running 0 3m9s
katib-mysql-5c7dcc6786-rqzmn 0/1 ContainerCreating 0 3m9s
katib-ui-6b755b9b64-zqxjg 0/1 ImagePullBackOff 0 3m9s
metadata-db-5f47dddd-js72v 0/1 ContainerCreating 0 3m13s
metadata-deployment-6fc8c96c97-bwq92 0/1 ContainerCreating 0 3m13s
metadata-envoy-deployment-867944c487-fdh5p 0/1 ContainerCreating 0 3m13s
metadata-grpc-deployment-b77d5cbfc-rfp78 0/1 ContainerCreating 0 3m13s
metadata-ui-68559cb5-z2srg 0/1 ContainerCreating 0 3m13s
minio-69fdb867f6-2bzwx 1/1 Running 0 3m8s
ml-pipeline-7bcb855d98-8rztx 0/1 ContainerCreating 0 3m8s
ml-pipeline-ml-pipeline-visualizationserver-795c698fbc-tp697 0/1 ContainerCreating 0 3m6s
ml-pipeline-persistenceagent-7b6d46c56d-d59dn 1/1 Running 0 3m8s
ml-pipeline-scheduledworkflow-dccddd78b-ttbhz 1/1 Running 0 3m6s
ml-pipeline-ui-68b8dc5cc7-xjtnm 0/1 ContainerCreating 0 3m7s
ml-pipeline-viewer-controller-deployment-746fccc648-x542z 0/1 ContainerCreating 0 3m7s
mysql-84598487dc-cwg7t 0/1 ContainerCreating 0 3m8s
notebook-controller-deployment-66657bd44f-k9fwk 0/1 ImagePullBackOff 0 3m12s
profiles-deployment-7b8d9f6d55-wf4mv 1/2 ErrImagePull 0 3m5s
pytorch-operator-db6f8889c-wpfrq 0/1 ContainerCreating 0 3m11s
seldon-controller-manager-fdcb95c69-l7rn9 1/1 Running 0 3m3s
tensorboard-9b4c44f45-l8xnx 0/1 ImagePullBackOff 0 3m11s
tf-job-operator-5bd67976d5-9w8dt 0/1 ContainerCreating 0 3m10s
workflow-controller-8495bc6f5b-x7p48 1/1 Running 0 5m3s
このまま放置すると kubeflow namespace の Pod は全て Running 状態になるはずだが,metadata-db だけはどうしても上がらない.当該 Pod のログを確認してみると,
$ oc logs metadata-db-5f47dddd-js72v -n kubeflow
mkdir: cannot create directory '/var/lib/mysql': Permission denied
とのこと.oc describe pods metadata-db -n kubeflow で確認してみると,
Mounts:
/var/lib/mysql from metadata-mysql (rw)
/var/run/secrets/kubernetes.io/serviceaccount from metadatadb-token-44lw4 (ro)
metadata-mysql PVC を使用している模様.
$ oc get pvc -n kubeflow
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
katib-mysql Bound pv0019 100Gi RWO,ROX,RWX 26m
metadata-mysql Bound pv0004 100Gi RWO,ROX,RWX 26m
minio-pv-claim Bound pv0006 100Gi RWO,ROX,RWX 26m
mysql-pv-claim Bound pv0025 100Gi RWO,ROX,RWX 26m
現在,pv0004 にバインドされているようだ.
metadata-db 問題 - CRC Node 操作で対処
CRC Node(CoreOS)に SSH ログインできる.Hyper-V ホストで,C:\User\<ユーザー名>\.crc\machines\crc フォルダに id_rsa ファイルがあるので,これを NFS サーバーにコピーし,当該ファイルを SSH 秘密鍵に指定して CRC Node の IP に core ユーザーでアクセス
$ ssh -i <鍵フォルダ>/id_rsa core@192.168.255.9
core ユーザーは,パスワードなしで sudo 可能.以下,PVC 周りを調査すると,
[core@crc-nsk8x-master-0 ~]$ sudo -s
[root@crc-nsk8x-master-0 core]# ls -l /var/mnt/pv-data/
total 4
drwxrwx---. 2 root root 6 Jul 12 05:55 pv0001
drwxrwx---. 2 root root 6 Jul 12 05:55 pv0002
drwxrwx---. 2 root root 6 Jul 12 05:55 pv0003
drwxrwx---. 3 root root 21 Aug 4 00:39 pv0004
drwxrwx---. 2 root root 6 Jul 12 05:55 pv0005
drwxrwx---. 3 root root 19 Aug 4 00:36 pv0006
drwxrwx---. 2 root root 6 Jul 12 05:55 pv0007
drwxrwx---. 2 root root 6 Jul 12 05:55 pv0008
drwxrwx---. 2 root root 6 Jul 12 05:55 pv0009
drwxrwx---. 2 root root 6 Jul 12 05:55 pv0010
drwxrwx---. 2 root root 6 Jul 12 05:55 pv0011
drwxrwx---. 2 root root 6 Jul 12 05:55 pv0012
drwxrwx---. 2 root root 6 Jul 12 05:55 pv0013
drwxrwx---. 2 root root 6 Jul 12 05:55 pv0014
drwxrwx---. 2 root root 6 Jul 12 05:55 pv0015
drwxrwx---. 2 root root 6 Jul 12 05:55 pv0016
drwxrwx---. 2 root root 6 Jul 12 05:55 pv0017
drwxrwx---. 2 root root 6 Jul 12 05:55 pv0018
drwxrwx---. 7 root root 4096 Aug 4 00:41 pv0019
drwxrwx---. 2 root root 6 Jul 12 05:55 pv0020
drwxrwx---. 2 root root 6 Jul 12 05:55 pv0021
drwxrwx---. 2 root root 6 Jul 12 05:55 pv0022
drwxrwx---. 2 root root 6 Jul 12 05:55 pv0023
drwxrwx---. 2 root root 6 Jul 12 05:55 pv0024
drwxrwx---. 5 root root 132 Aug 4 00:42 pv0025
drwxrwx---. 2 root root 6 Jul 12 05:55 pv0026
drwxrwx---. 2 root root 6 Jul 12 05:55 pv0027
drwxrwx---. 2 root root 6 Jul 12 05:55 pv0028
drwxrwx---. 2 root root 6 Jul 12 05:55 pv0029
drwxrwx---. 2 root root 6 Jul 12 05:55 pv0030
[root@crc-nsk8x-master-0 core]#
となっているので,あまりよくわからないまま,
# chmod o+rwx /var/mnt/pv-data/pv0004
としてみると,Running になった!
$ oc get pods -n kubeflow
NAME READY STATUS RESTARTS AGE
argo-ui-644f649c9-d7xxd 1/1 Running 0 49m
centraldashboard-558c95597c-t2hb5 1/1 Running 0 49m
jupyter-web-app-deployment-7b49bddb86-s9rsx 1/1 Running 0 47m
katib-controller-9cd8f9954-6grb4 1/1 Running 1 47m
katib-db-manager-686dc45fc4-b9zsp 1/1 Running 3 47m
katib-mysql-5c7dcc6786-rqzmn 1/1 Running 0 47m
katib-ui-6b755b9b64-zqxjg 1/1 Running 0 47m
metadata-db-5f47dddd-js72v 1/1 Running 13 47m
metadata-deployment-6fc8c96c97-bwq92 0/1 Running 0 47m
metadata-envoy-deployment-867944c487-fdh5p 1/1 Running 0 47m
metadata-grpc-deployment-b77d5cbfc-rfp78 1/1 Running 9 47m
metadata-ui-68559cb5-z2srg 1/1 Running 0 47m
minio-69fdb867f6-2bzwx 1/1 Running 0 47m
ml-pipeline-7bcb855d98-8rztx 1/1 Running 0 47m
ml-pipeline-ml-pipeline-visualizationserver-795c698fbc-tp697 1/1 Running 0 47m
ml-pipeline-persistenceagent-7b6d46c56d-d59dn 1/1 Running 2 47m
ml-pipeline-scheduledworkflow-dccddd78b-ttbhz 1/1 Running 0 47m
ml-pipeline-ui-68b8dc5cc7-xjtnm 1/1 Running 0 47m
ml-pipeline-viewer-controller-deployment-746fccc648-x542z 1/1 Running 0 47m
mysql-84598487dc-cwg7t 1/1 Running 0 47m
notebook-controller-deployment-66657bd44f-k9fwk 1/1 Running 0 47m
profiles-deployment-7b8d9f6d55-wf4mv 2/2 Running 0 47m
pytorch-operator-db6f8889c-wpfrq 1/1 Running 0 47m
seldon-controller-manager-fdcb95c69-l7rn9 1/1 Running 0 47m
tensorboard-9b4c44f45-l8xnx 1/1 Running 0 47m
tf-job-operator-5bd67976d5-9w8dt 1/1 Running 0 47m
workflow-controller-8495bc6f5b-x7p48 1/1 Running 0 49m
Kubeflow GUI へのアクセス
$ oc get routes -n istio-system istio-ingressgateway -o jsonpath='http://{.spec.host}/'
を実行して,
http://istio-ingressgateway-istio-system.apps-crc.testing/
を得たので,Hyper-V ホスト上の Edge ブラウザでこれにアクセスしたところ,イけた.