Azure に Kubeflow をデプロイする 

Azure の AKS (Azure Kubernetes Service) で Kubeflow をデプロイするメモです。AKSは、Kubeflowのマニュフェストそのまま動きますので、メモを残すほどでもないのかもしれませんが、何かの役に立つかもしれないので残しておきます。

# Kubeflowデプロイのためのコマンドを準備
Kubeflowデプロイに使用するコマンドは以下の3つです。
<dl>
  <dt>az</dt>
  <dd>Azureをコントロールするためのコマンドです。今回はkubectlがAKSに接続するためのクレデンシャル取得などに使用しています。</dd>
  <dt>kubectl</dt>
  <dd>Kubernetesをコントロールするためのコマンドです。AKSによって取得した~/.kube/configを使ってAKSにアクセスします。</dd>
  <dt>kfctl</dt>
  <dd>Kubeflowをコントロールするためのコマンドです。</dd>
</dl>
今回は Kubeflow のデプロイに Azure Cloud Shell を使用します。Windows10 を使用している人は、Windows Terminal から、Azure Cloud Shell (Bash) の使用をお勧めします。

https://devblogs.microsoft.com/commandline/the-azure-cloud-shell-connector-in-windows-terminal/

Azure Cloud Shell には、az, kubectl コマンドはインストール済ですので、kfctl だけ以下のページから取得してインストールします。
https://github.com/kubeflow/kfctl/releases/

```bash:AzureCloudShell
$ mkdir -p ~/bundle/bin
$ curl -OL https://github.com/kubeflow/kfctl/releases/download/v1.1.0/kfctl_v1.1.0-0-g9a3621e_linux.tar.gz
$ tar xvfz kfctl_v1.1.0-0-g9a3621e_linux.tar.gz
$ mv kfctl ~/bundle/bin/
```

# AKSを作成する
ポータルから作成してみます。今回はノードに Standard_D4S_v3 を2台としました。（Standard_DS2_v2 を3台でもデプロイでできましたが、実験フェーズでは、まとったメモリやストレージを使いたいこともあると思うので、大きめのノードを選んだ方が良いかもしれません）
![Screen Shot 2020-08-16 at 10.17.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32580/38d0d7dc-b58c-83cc-9df5-61c1f0e4ecdf.png)

AKSが作成されたら、作成したAKSのクレデンシャルを取得します。

```bash:AzureCloudShell
$ az aks get-credentials -n kentacl -g kentakf-rg
```

これで kubectl からコントロールできるようになりましたので、ノードを確認してみます。

```bash:AzureCloudShell
$ kubectl get node
NAME                                STATUS   ROLES   AGE   VERSION
aks-agentpool-22403156-vmss000000   Ready    agent   11m   v1.16.13
aks-agentpool-22403156-vmss000001   Ready    agent   11m   v1.16.13
```
# Kubeflowのデプロイ
Kubeflowのデプロイに入ります。まずは、作業用のディレクトリを作成します。

```bash:AzureCloudShell
$ mkdir kf11
```

kfctlでGithubに置いてあるKubeflow 1.1のマニフェストをApplyすることによりデプロイを実行します。
作業用のディレクトリ移動して、

```bash:AzureCloudShell
$ cd kf11
$ pwd
/home/kenta/kf11
```

kfctlでデプロイします。

```bash:AzureCloudShell
$ kfctl apply -V -f "https://raw.githubusercontent.com/kubeflow/manifests/v1.1-branch/kfdef/kfctl_k8s_istio.v1.0.2.yaml"
```

デプロイが完了したら以下のようになりPodが立ち上がります。

```bash:AzureCloudShell
$ kubectl get pods --all-namespaces -o wide
NAMESPACE         NAME                                                           READY   STATUS      RESTARTS   AGE     IP            NODE                                NOMINATED NODE   READINESS GATES
cert-manager      cert-manager-cainjector-c578b68fc-blclk                        1/1     Running     0          174m    10.244.1.13   aks-agentpool-22403156-vmss000001   <none>           <none>
cert-manager      cert-manager-fcc6cd946-9tf9s                                   1/1     Running     0          174m    10.244.0.18   aks-agentpool-22403156-vmss000000   <none>           <none>
cert-manager      cert-manager-webhook-657b94c676-n4xrb                          1/1     Running     1          174m    10.244.1.14   aks-agentpool-22403156-vmss000001   <none>           <none>
istio-system      cluster-local-gateway-78f6cbff8d-8p78r                         1/1     Running     0          175m    10.244.0.13   aks-agentpool-22403156-vmss000000   <none>           <none>
istio-system      grafana-68bcfd88b6-lmfv6                                       1/1     Running     0          175m    10.244.1.5    aks-agentpool-22403156-vmss000001   <none>           <none>
istio-system      istio-citadel-7dd6877d4d-fj4nk                                 1/1     Running     0          175m    10.244.1.6    aks-agentpool-22403156-vmss000001   <none>           <none>
istio-system      istio-cleanup-secrets-1.1.6-74hfs                              0/1     Completed   0          175m    10.244.1.12   aks-agentpool-22403156-vmss000001   <none>           <none>
istio-system      istio-egressgateway-7c888bd9b9-fvrbh                           1/1     Running     0          175m    10.244.1.7    aks-agentpool-22403156-vmss000001   <none>           <none>
istio-system      istio-egressgateway-7c888bd9b9-mm28x                           1/1     Running     0          172m    10.244.0.33   aks-agentpool-22403156-vmss000000   <none>           <none>
istio-system      istio-galley-5bc58d7c89-gqkj7                                  1/1     Running     0          175m    10.244.0.19   aks-agentpool-22403156-vmss000000   <none>           <none>
istio-system      istio-grafana-post-install-1.1.6-dk4zh                         0/1     Completed   0          175m    10.244.1.11   aks-agentpool-22403156-vmss000001   <none>           <none>
istio-system      istio-ingressgateway-866fb99878-qv2x5                          1/1     Running     0          175m    10.244.0.9    aks-agentpool-22403156-vmss000000   <none>           <none>
istio-system      istio-pilot-67f9bd57b-7x7kp                                    2/2     Running     0          175m    10.244.0.10   aks-agentpool-22403156-vmss000000   <none>           <none>
istio-system      istio-policy-749ff546dd-vt6r6                                  2/2     Running     3          175m    10.244.0.11   aks-agentpool-22403156-vmss000000   <none>           <none>
istio-system      istio-security-post-install-1.1.6-56x76                        0/1     Completed   0          175m    10.244.1.10   aks-agentpool-22403156-vmss000001   <none>           <none>
istio-system      istio-sidecar-injector-cc5ddbc7-75vbp                          1/1     Running     0          175m    10.244.0.17   aks-agentpool-22403156-vmss000000   <none>           <none>
istio-system      istio-telemetry-6f6d8db656-frz7b                               2/2     Running     2          175m    10.244.1.8    aks-agentpool-22403156-vmss000001   <none>           <none>
istio-system      istio-tracing-84cbc6bc8-qp8hp                                  1/1     Running     0          175m    10.244.0.12   aks-agentpool-22403156-vmss000000   <none>           <none>
istio-system      kfserving-ingressgateway-6b469d64d-7lptq                       1/1     Running     0          175m    10.244.0.14   aks-agentpool-22403156-vmss000000   <none>           <none>
istio-system      kfserving-ingressgateway-6b469d64d-qcl4p                       1/1     Running     0          172m    10.244.1.40   aks-agentpool-22403156-vmss000001   <none>           <none>
istio-system      kiali-7879b57b46-pcdpx                                         1/1     Running     0          175m    10.244.1.9    aks-agentpool-22403156-vmss000001   <none>           <none>
istio-system      prometheus-744f885d74-2gm9x                                    1/1     Running     0          175m    10.244.0.16   aks-agentpool-22403156-vmss000000   <none>           <none>
knative-serving   activator-58595c998d-mb77d                                     2/2     Running     0          173m    10.244.1.24   aks-agentpool-22403156-vmss000001   <none>           <none>
knative-serving   autoscaler-7ffb4cf7d7-7w7sw                                    2/2     Running     2          173m    10.244.0.28   aks-agentpool-22403156-vmss000000   <none>           <none>
knative-serving   autoscaler-hpa-686b99f459-tnggg                                1/1     Running     0          173m    10.244.0.27   aks-agentpool-22403156-vmss000000   <none>           <none>
knative-serving   controller-c6d7f946-drxwf                                      1/1     Running     0          173m    10.244.0.26   aks-agentpool-22403156-vmss000000   <none>           <none>
knative-serving   networking-istio-ff8674ddf-brkgd                               1/1     Running     0          173m    10.244.1.25   aks-agentpool-22403156-vmss000001   <none>           <none>
knative-serving   webhook-6d99c5dbbf-x9zgd                                       1/1     Running     0          173m    10.244.0.29   aks-agentpool-22403156-vmss000000   <none>           <none>
kube-system       coredns-869cb84759-c67ht                                       1/1     Running     0          3h11m   10.244.1.3    aks-agentpool-22403156-vmss000001   <none>           <none>
kube-system       coredns-869cb84759-jvjzm                                       1/1     Running     0          3h13m   10.244.0.2    aks-agentpool-22403156-vmss000000   <none>           <none>
kube-system       coredns-autoscaler-5b867494f-tv8bw                             1/1     Running     0          3h13m   10.244.0.6    aks-agentpool-22403156-vmss000000   <none>           <none>
kube-system       dashboard-metrics-scraper-566c858889-2pwjb                     1/1     Running     0          3h13m   10.244.0.7    aks-agentpool-22403156-vmss000000   <none>           <none>
kube-system       kube-proxy-m7dwp                                               1/1     Running     0          3h11m   10.240.0.5    aks-agentpool-22403156-vmss000001   <none>           <none>
kube-system       kube-proxy-nnclh                                               1/1     Running     0          3h11m   10.240.0.4    aks-agentpool-22403156-vmss000000   <none>           <none>
kube-system       kubernetes-dashboard-7f7d6bbd7f-ld9vj                          1/1     Running     0          3h13m   10.244.0.4    aks-agentpool-22403156-vmss000000   <none>           <none>
kube-system       metrics-server-6cd7558856-zbczc                                1/1     Running     0          3h13m   10.244.0.3    aks-agentpool-22403156-vmss000000   <none>           <none>
kube-system       omsagent-jbczq                                                 1/1     Running     1          3h11m   10.244.1.2    aks-agentpool-22403156-vmss000001   <none>           <none>
kube-system       omsagent-rcjwq                                                 1/1     Running     1          3h11m   10.244.0.5    aks-agentpool-22403156-vmss000000   <none>           <none>
kube-system       omsagent-rs-7fd48788c5-247pw                                   1/1     Running     1          3h13m   10.244.1.4    aks-agentpool-22403156-vmss000001   <none>           <none>
kube-system       tunnelfront-748b54cdb-qnkcc                                    2/2     Running     0          3h13m   10.244.0.8    aks-agentpool-22403156-vmss000000   <none>           <none>
kubeflow          admission-webhook-bootstrap-stateful-set-0                     1/1     Running     0          174m    10.244.1.17   aks-agentpool-22403156-vmss000001   <none>           <none>
kubeflow          admission-webhook-deployment-59bc556b94-5w2vx                  1/1     Running     0          173m    10.244.0.24   aks-agentpool-22403156-vmss000000   <none>           <none>
kubeflow          application-controller-stateful-set-0                          1/1     Running     0          175m    10.244.0.15   aks-agentpool-22403156-vmss000000   <none>           <none>
kubeflow          argo-ui-5f845464d7-2zgsv                                       1/1     Running     0          174m    10.244.1.15   aks-agentpool-22403156-vmss000001   <none>           <none>
kubeflow          centraldashboard-d5c6d6bf-tqqtk                                1/1     Running     0          174m    10.244.1.18   aks-agentpool-22403156-vmss000001   <none>           <none>
kubeflow          jupyter-web-app-deployment-544b7d5684-mmtbd                    1/1     Running     0          173m    10.244.1.19   aks-agentpool-22403156-vmss000001   <none>           <none>
kubeflow          katib-controller-6b87947df8-njhx6                              1/1     Running     1          172m    10.244.1.28   aks-agentpool-22403156-vmss000001   <none>           <none>
kubeflow          katib-db-manager-54b64f99b-5bbdw                               1/1     Running     0          172m    10.244.1.29   aks-agentpool-22403156-vmss000001   <none>           <none>
kubeflow          katib-mysql-74747879d7-n68p5                                   1/1     Running     0          172m    10.244.0.35   aks-agentpool-22403156-vmss000000   <none>           <none>
kubeflow          katib-ui-76f84754b6-qcnsb                                      1/1     Running     0          172m    10.244.1.30   aks-agentpool-22403156-vmss000001   <none>           <none>
kubeflow          kfserving-controller-manager-0                                 2/2     Running     1          173m    10.244.1.27   aks-agentpool-22403156-vmss000001   <none>           <none>
kubeflow          metacontroller-0                                               1/1     Running     0          174m    10.244.0.20   aks-agentpool-22403156-vmss000000   <none>           <none>
kubeflow          metadata-db-79d6cf9d94-slc4l                                   1/1     Running     0          173m    10.244.0.34   aks-agentpool-22403156-vmss000000   <none>           <none>
kubeflow          metadata-deployment-5dd4c9d4cf-mqkp9                           1/1     Running     0          173m    10.244.1.22   aks-agentpool-22403156-vmss000001   <none>           <none>
kubeflow          metadata-envoy-deployment-5b9f9466d9-p6j4w                     1/1     Running     0          173m    10.244.1.21   aks-agentpool-22403156-vmss000001   <none>           <none>
kubeflow          metadata-grpc-deployment-74f69954dc-vls7q                      1/1     Running     5          173m    10.244.0.22   aks-agentpool-22403156-vmss000000   <none>           <none>
kubeflow          metadata-ui-8968fc7d9-dqj4x                                    1/1     Running     0          173m    10.244.0.23   aks-agentpool-22403156-vmss000000   <none>           <none>
kubeflow          minio-6b88d6499f-f5d49                                         1/1     Running     0          172m    10.244.1.43   aks-agentpool-22403156-vmss000001   <none>           <none>
kubeflow          ml-pipeline-698bcdd747-x67mq                                   1/1     Running     0          172m    10.244.1.31   aks-agentpool-22403156-vmss000001   <none>           <none>
kubeflow          ml-pipeline-ml-pipeline-visualizationserver-675656df79-tgjwm   1/1     Running     0          172m    10.244.1.35   aks-agentpool-22403156-vmss000001   <none>           <none>
kubeflow          ml-pipeline-persistenceagent-7785884886-gqwwm                  1/1     Running     1          172m    10.244.1.32   aks-agentpool-22403156-vmss000001   <none>           <none>
kubeflow          ml-pipeline-scheduledworkflow-7b4cb5d959-cxtlp                 1/1     Running     0          172m    10.244.0.32   aks-agentpool-22403156-vmss000000   <none>           <none>
kubeflow          ml-pipeline-ui-5fbd94b9fb-rrfgn                                1/1     Running     0          172m    10.244.1.33   aks-agentpool-22403156-vmss000001   <none>           <none>
kubeflow          ml-pipeline-viewer-controller-deployment-69fccfff8c-f86bc      1/1     Running     0          172m    10.244.1.34   aks-agentpool-22403156-vmss000001   <none>           <none>
kubeflow          mysql-7994454666-z6c6c                                         1/1     Running     0          172m    10.244.1.44   aks-agentpool-22403156-vmss000001   <none>           <none>
kubeflow          notebook-controller-deployment-576589db9d-77ftt                1/1     Running     0          173m    10.244.0.25   aks-agentpool-22403156-vmss000000   <none>           <none>
kubeflow          profiles-deployment-874649f89-mzjjs                            2/2     Running     0          172m    10.244.1.36   aks-agentpool-22403156-vmss000001   <none>           <none>
kubeflow          pytorch-operator-666dd4cd49-psfxz                              1/1     Running     0          173m    10.244.1.23   aks-agentpool-22403156-vmss000001   <none>           <none>
kubeflow          seldon-controller-manager-5d96986d47-w69c9                     1/1     Running     0          172m    10.244.1.38   aks-agentpool-22403156-vmss000001   <none>           <none>
kubeflow          spark-operatorcrd-cleanup-db5nj                                0/2     Completed   0          173m    10.244.1.20   aks-agentpool-22403156-vmss000001   <none>           <none>
kubeflow          spark-operatorsparkoperator-7c484c6859-qv8lz                   1/1     Running     0          173m    10.244.0.21   aks-agentpool-22403156-vmss000000   <none>           <none>
kubeflow          spartakus-volunteer-7465bcbdc-94tmr                            1/1     Running     0          173m    10.244.0.30   aks-agentpool-22403156-vmss000000   <none>           <none>
kubeflow          tensorboard-6549cd78c9-xkbdr                                   1/1     Running     0          173m    10.244.0.31   aks-agentpool-22403156-vmss000000   <none>           <none>
kubeflow          tf-job-operator-7574b968b5-6pgml                               1/1     Running     0          173m    10.244.1.26   aks-agentpool-22403156-vmss000001   <none>           <none>
kubeflow          workflow-controller-6db95548dd-lcjjs                           1/1     Running     0          174m    10.244.1.16   aks-agentpool-22403156-vmss000001   <none>           <none>
```

# Kubeflowにアクセスする
Webブラウザが使えるローカルコンピュータからkubectlのポートフォワードを使ってKubeflowにアクセスしてみます。まずは、AKSのクレデンシャルを取得するためにも、以下のURLを参考にAzure CLIをインストールします。

https://docs.microsoft.com/ja-jp/cli/azure/install-azure-cli?view=azure-cli-latest

次にkubectlをインストールします。以下のコマンドにより、Azure CLIからkubectlをインストールすることもできます。

```bash:Local
az aks install-cli
```

kubectlのポートフォワードを実行します。これにより、ローカルコンピュータの8080ポートからKubeflowにアクセスできます。

```bash:Local
$ kubectl port-forward svc/istio-ingressgateway -n istio-system 8080:80
```

Webブラウザを立ち上げて以下のURLにアクセスします。

http://localhost:8080

![Screen Shot 2020-08-16 at 13.51.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32580/c5ce5a9e-b558-a70a-bf2e-24dc45db9dd3.png)

名前空間を設定します。この名前空間は、Kubernetesの名前空間にもなります。

![Screen Shot 2020-08-16 at 13.52.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32580/a4221af0-c861-4770-e898-e78295651040.png)

![Screen Shot 2020-08-16 at 13.53.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32580/f99edd77-776d-3755-1310-b589376baf48.png)

こでで Kubeflow のデプロイは完了です。次は Kubeflow の Notebook Server を作成してみます。

# Notebook Server を作成する

Notebookを作成してみます。左上のメニューからNotebook Serversを選択します。

![Screen Shot 2020-08-16 at 13.53.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32580/3763cb5c-869c-8d62-3efd-a195e15854cb.png)

NEW SERVERからNotebookのサーバを作成します。

![Screen Shot 2020-08-16 at 13.53.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32580/553e93c0-dac9-62d2-cdbb-0708a5ef2651.png)

Nameは、KubernetesのPodの名前にもなります。ここでは、Tensorflow 2.1 CPUのイメージを使用しています。

![Screen Shot 2020-08-16 at 13.54.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32580/b7a6abe9-f10a-b30e-398b-c6ab413ea2e3.png)

作成されました。（表示されるのに時間がかかります）

![Screen Shot 2020-08-16 at 14.21.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32580/086ae58a-69f3-146c-8b6d-0de7ae8548fd.png)

kubectlのコマンドでもNotebookが立ち上がっている事を確認できます。

```bash:AzureCloudShell
$ kubectl get pods -n kubeflow-kenta -o wide
NAME               READY   STATUS    RESTARTS   AGE   IP            NODE                                NOMINATED NODE   READINESS GATES
kenta-notebook-0   2/2     Running   0          30m   10.244.0.38   aks-agentpool-22403156-vmss000000   <none>           <none>
```

Pythonで実験フェーズのコードを書く事ができます。

![Screen Shot 2020-08-16 at 14.23.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32580/2444e9da-4e28-2957-3d46-885b11059c1f.png)

# Kubeflowのアンインストール
KubeflowをアンインストールするにはAzure Cloud Shellで作成した作業ディレクトリで、以下のコマンドを使用します。

作業用ディレクトリに移動して、

```bash:AzureCloudShell
$ cd kf11/
$ pwd
/home/kenta/kf11
```

kfctlでアンインストールします。

```bash:AzureCloudShell
$ kfctl delete -f kfctl_k8s_istio.v1.0.2.yaml
```

アンインストールの経過は、別のターミナルやコマンドウインドウで、以下のコマンドから確認する事ができます。

```bash:AzureCloudShell
$ kubectl get pods --all-namespaces -o wide -w
```

# 最後に
これでメモは終了です。
今回は、以下のドキュメントを参考にしました。

https://www.kubeflow.org/docs/azure/deploy/

ではまたー。