🏇

KubeflowをGCPにデプロイしてみる

2021/01/01に公開

概要

ローカル環境にMultipass(MicroK8s) on MacでKubeflow環境構築してみたが
NotebookとArtifact Storeが表示されずに涙したので😫
もはやGCPにデプロイしていろいろ遊んでみることにする

基本的に以下ドキュメントの通りに実行していくだけ
3日もしたら確実に忘れそうなので、自分なりの理解をメモしてく
https://www.kubeflow.org/docs/gke/deploy/management-setup/

GCPで実施

ざっくり書くと以下5つを実施する感じ

  1. GCPの必要なAPI周りの有効化
  2. OAuthのClientID取得 for IAP
  3. Managementクラスタ作成
  4. Kubeflowクラスタ作成
  5. Kubeflow UIアクセス準備

GCPの必要なAPI周りの有効化

$ gcloud services enable \
  compute.googleapis.com \
  container.googleapis.com \
  iam.googleapis.com \
  servicemanagement.googleapis.com \
  cloudresourcemanager.googleapis.com \
  ml.googleapis.com \
  meshconfig.googleapis.com \
  cloudbuild.googleapis.com
$
$ PROJECT_ID=<gcp project id>
$
$ curl --request POST \
  --header "Authorization: Bearer $(gcloud auth print-access-token)" \
  --data '' \
  https://meshconfig.googleapis.com/v1alpha1/projects/${PROJECT_ID}:initialize

認証のためのOAuthの設定

OAuth同意画面作成

OAuth同意画面で必要な情報を入力して作成

  • UserType
    • 内部
  • アプリ名
    • 適当な名前
  • ユーザーサポートメール
    • Googleアカウントのメールアドレス
  • 承認済みドメイン
    • <project id>.cloud.goog
    • (なぜかドキュメントがgoogなのでそのまま設定w
  • デベロッパーの連絡先情報
    • 適当なメールアドレス

scopeは特に設定せず

認証情報を作成

OAuth Client IDで必要な情報を入力して作成

  • アプリケーションの種類
    • ウェブアプリケーション
  • 名前
    • 適当な名前
  • 承認済みのリダイレクトURI
    • https://iap.googleapis.com/v1/oauth/clientIds/<OAuth Client ID>.apps.googleusercontent.com:handleRedirect
      • 作成したClientIDを入力

Managementクラスタの作成

kptというKubernetesのマニフェスト管理ツールを利用して環境を構築していく感じ
kpt pkg get [GitHub Repository] [target local directory]みたいに実行するとGitHub上にpushされたディレクトリをパッケージとして取り込むことができる

kpt cfg set -R . [key] [value]みたいに指定すると
取り込んできたパッケージの変数に値をセットできるので
自分が適用したいGCPのproject_id等々セットして各自の環境が出来上がるみたい

あとはMakefileが用意されてるので
指示されるがままに実行していけばGKEクラスタ他必要な情報が作成されます
(裏ではAnthosのコマンドラインとかも動いてるみたい

$ # gcloud関連のコマンドインストール
$ gcloud components install kubectl kpt anthoscli beta
$ gcloud components update
$
$ # Kustomizeインストール
$ curl -s "https://raw.githubusercontent.com/kubernetes-sigs/kustomize/master/hack/install_kustomize.sh"  | bash
$ sudo mv ./kustomize /usr/local/bin/kustomize
$
$ # 以降処理を進めるために変数をセット
$ MGMT_PROJECT=<GCP project id>
$ ## Kubeflow管理したいリポジトリ指定するとmanagementディレクトリが作成されてそこで各種ファイルが管理される
$ MGMT_DIR=<GitHubの指定したいリポジトリ>
$ MGMT_NAME=<適当な名前>
$ LOCATION=<適当なzone指定>
$
$ # managementクラスタデプロイのためのkptパッケージ取得
$ kpt pkg get https://github.com/kubeflow/gcp-blueprints.git/management@v1.2.0 "${MGMT_DIR}"
$ cd "${MGMT_DIR}/management"
$ make get-pkg
$
$ # 自分の環境の変数セット
$ kpt cfg set -R . name "${MGMT_NAME}"
$ kpt cfg set -R . gcloud.core.project "${MGMT_PROJECT}"
$ kpt cfg set -R . location "${LOCATION}"
$
$ # GKE作成
$ make apply-cluster
$
$ # kubectl context 作成。クラスタを切り替えることができるみたい
$ make create-context
$
$ # K8sからGCPリソースに接続が可能なCloud Config Connectorを適用
$ make apply-kcc
$
$ # ./instance/managed-project/iam.yamlにある通りOwner roleが適用される
$ MGMT_PROJECT=<gcp project id>
$ kpt cfg set ./instance managed-project "${MANAGED_PROJECT}"
$ gcloud beta anthos apply ./instance/managed-project/iam.yaml

これで、MGMT_NAMEでセットした名前のGKEクラスタが出来上がってる!

丁寧に説明書いてありますが
./upstreamディレクトリに各リソースの型が入ってて
./instanceディレクトリに変数等セットされた各環境毎の実際の情報が入ってて
./buildディレクトリにはhydrateで実行前の検証したファイルが生成されるみたい

Kubeflowクラスタの作成

まだいまいちManagement用クラスタとKubeflow用クラスタの用途がよくわかってないけど
次はKubeflow用のクラスタを作成する!

途中のステップで必要なのでAnthos Service Meshを手順に従ってインストール

そんで以下コマンドを実施

# 必要な環境変数の設定
$ KF_NAME=<managementとは違うkubeflow用のクラスタ名指定>
$ KF_PROJECT=<GCP project id>
$ KF_DIR=<GitHubの指定したいリポジトリ>
$ MGMT_NAME=<作成したManagementクラスタの名前>
$ MGMTCTXT="${MGMT_NAME}"
$ 
$ gcloud auth login
$
$ # kubeflowクラスタデプロイのためのkptパッケージ取得
$ kpt pkg get https://github.com/kubeflow/gcp-blueprints.git/kubeflow@v1.2.0 "${KF_DIR}"
$ cd "${KF_DIR}/kubeflow"
$
$ make get-pkg
$ 
$ # Makefile内の.PHONY: set-valuesで
$ # <xxx>に記載された箇所を必要な情報で書き換え
$
$ kubectl config use-context "${MGMTCTXT}"
$ kubectl create namespace "${KF_PROJECT}"
$ kubectl config set-context --current --namespace "${KF_PROJECT}"
$ kubectl config set-context --current --namespace "${KF_PROJECT}"
$
$ export CLIENT_ID=<作成したOAuthのCLIENT_ID>
$ export CLIENT_SECRET=<作成したOAuthのCLIENT_SECRET>
$ make set-values
$
$ # クラスタをデプロイ。ここしばらく時間かかる
$ make apply

k8s上にちゃんとpodやservice作成されているか確認

$ # ZONE設定した記憶がないので設定
$ ZONE=asia-northeast1-a
$ gcloud container clusters get-credentials "${KF_NAME}" --zone "${ZONE}" --project "${KF_PROJECT}"
$
$ kubectl -n kubeflow get all

Kubeflow UIにアクセス

以下の通りKubeflowのUIにアクセスできる権限を付与して
表示されたホストにアクセスする(SSLとDNS反映されるまで30分くらいかかるのでしばらくはgoogleの404ページが表示されたまま)
http://kubeflow-test.endpoints.<gcp project id>.cloud.goog

# アクセス許可したいアカウントのメールアドレスを指定
# (ちゃんとやる場合メールアドレスのグループ指定したい
$ gcloud projects add-iam-policy-binding "${KF_PROJECT}" --member=user:<EMAIL> --role=roles/iap.httpsResourceAccessor
$ kubectl -n istio-system get ingress
NAME            HOSTS                                                 ADDRESS         PORTS   AGE
envoy-ingress   kubeflow-test.endpoints.<gcp project id>.cloud.goog   xxx   80      8h

URLにアクセスするとこんな感じでIAPちゃんと動いて認証効いてそう

ローカルでは表示されなかったNotebookもちゃんと表示されてる🏋️

しかし、Artifact Store(metadata)が表示されない・・・これいかに🤔

まとめ

基本Makefileを実行してるだけなので、裏側で動いてるk8sのリソースを適切に理解できてない感が全開ですが
とりあえず遊び場ができたので、次は作成したKubeflow ClusterをPrivate GKEにして
ついにNotebookで遊んだりPipelineとか組んでいきたい🕹

Discussion