GCPでのKubeflowセットアップ

KubeflowをGCP上でセットアップしていく。
公式ドキュメントが充実しているので、それに沿っていく。

基本的な流れ

  1. GCPプロジェクトの準備
  2. 作業に必要なCLIツールなどの準備
  3. Cloud IAPのセットアップ
  4. Kubeflowのデプロイ

GCPプロジェクトの準備

GCPを扱う上で基本的な作業なのでここでは割愛。
一応公式ドキュメントにも 説明されたページがあるので、必要に応じて参照。

重要なのは

  • 上記ドキュメントに列挙されているAPIを有効化しておく
  • 無料枠ではKubeflowはできないので、有料アカウントでやる

くらいか。

作業に必要なCLIツールなどの準備

Kubeflowが用意しているUIから ポチポチしながらKubeflowを構築する手順もあるが
手でポチポチするのは面倒なので、 CLIを用いた構築手順をやっていく。

kubectl

Macではバイナリをcurlでダウンロードするか、Homebrewで入れられる。
どちらの方法でもOK。最新版を入れておく。
参考: macOSへkubectlをインストールする

gcloud

gcloudコマンドは最新にしておく。

$ gcloud components update

kfctl

Macだと Githubのアーカイブからdarwin版を選んで以下で入れる。

$ wget https://github.com/kubeflow/kfctl/releases/download/v1.0.2/kfctl_v1.0.2-0-ga476281_darwin.tar.gz
$ tar -xvf kfctl_v1.0.2_<platform>.tar.gz

Cloud IAPのセットアップ

GCPでKubeflowを使う時は IAPの利用が推奨されている。
使わなくてもイケるっぽいが、いくら検証目的でも認証なしは怖いのでやっておく。
ちなみにBasic認証はKubeflow v1.0では Deprecatedになってる

Set up OAuth for Cloud IAPを参考にセットアップする。

デプロイ

gcloudの設定

gcloudコマンドを最初に使うときにやっておく必要がある。
要は使用するGCPプロジェクトのGoogleアカウント認証を済ませておく。

$ gcloud auth login
$ gcloud auth application-default login

環境変数など準備

デプロイ手順に必要な環境変数を定義しておく。もちろん実行時に直打ちでもOK。
CLIENT_IDCLIENT_SECRETは、GCPコンソールのAPIs & Services -> Credentialsから取得できる。

export CLIENT_ID=<設定したOAuthのクライアントID>
export CLIENT_SECRET=<設定したOAuthのクライアントシークレット>

export PROJECT=<使用するGCPプロジェクトID>
export ZONE=asia-east1-a # ここの手順だとK80が使えるゾーンを指定する必要がある模様

export KF_NAME="kf-test"
export BASE_DIR=<作業ディレクトリのパス>
export KF_DIR=${BASE_DIR}/${KF_NAME}
export PATH=$PATH:<kfctlをダウンロードしたディレクトリのパス>

export CONFIG_URI="https://raw.githubusercontent.com/kubeflow/manifests/v1.0-branch/kfdef/kfctl_gcp_iap.v1.0.2.yaml"

gcloudコマンドが見に行く先のPROJECTなどもセットしておく

$ gcloud config set project ${PROJECT}    
$ gcloud config set compute/zone ${ZONE}

デプロイ作業

GCPの場合は Deployment Manager(AWSのCloud Formationみたいなもの)を利用する。
デプロイが途中でエラーになったとき、deploymentが残っていて再実行ができないときがあるので、その場合はdeploymentを削除してから再実行すると良い。

mkdir -p ${KF_DIR}
cd ${KF_DIR}
kfctl apply -V -f ${CONFIG_URI}

上記だけでOK。10分くらい待つ。
成功すればGKE上にKubeflowがデプロイされている。

いろいろ確認

GKEのクラスタ

GKEの認証情報を取得。

$ gcloud container clusters get-credentials ${KF_NAME} --zone ${ZONE} --project ${PROJECT}

kubeflow というネームスペースのGKEクラスタをすべて取得。

$ kubectl -n kubeflow get all

NAME                                                               READY   STATUS      RESTARTS   AGE
pod/admission-webhook-bootstrap-stateful-set-0                     1/1     Running     0          6m55s
pod/admission-webhook-deployment-64cb96ddbf-2gp87                  1/1     Running     0          6m31s
pod/application-controller-stateful-set-0                          1/1     Running     0          7m56s
pod/argo-ui-778676df64-jrsgb                                       1/1     Running     0          6m58s
pod/centraldashboard-f8d4bdf96-d6dbc                               1/1     Running     0          6m57s
pod/cloud-endpoints-controller-7764d66f9b-hmwp7                    1/1     Running     0          6m

...以下略...

150行ぐらい出力される。まぁまぁ大きなマイクロサービス。

KubeflowのUI

ブラウザから以下にアクセスすれば、KubeflowのダッシュボードUIにアクセスできるはず。
SSLとDNSのプロビジョニングに時間がかかるようで、20分くらい待ってからアクセスするといいみたい。

https://<KF_NAME>.endpoints.<project-id>.cloud.goog/

ちなみに一旦デプロイされたKubeflowを削除し、再度同じ名前で上記デプロイを繰り返すと
このUIへのアクセス時にDNS解決できない旨のエラー(DNS_PROBE_FINISHED_NXDOMAIN)が出た。
根本的な解決方法は見つけられていない(同じドメインに対して異なるIPが割り当てられてコケている?)が、異なるKF_NAMEで再実行するとうまくいった。

削除

デプロイしたKubeflowリソースを削除するには以下。
参考: Delete using CLI

$ export CONFIG_FILE=${KF_DIR}/kfctl_gcp_iap.v1.0.2.yaml
kfctl delete -f ${CONFIG_FILE} --delete_storage

上記はストレージリソースも削除するはずだが、自分がやったときはDeployment Managerでストレージが残ってしまっていた。

mukiudo
mukiudo
Software Engineer