ローカルのKubernetesでRayクラスター作成

# 概要
ローカルのKubernetes上、すなわちMinikubeで作成したKubernetesクラスター上にRay clusterをデプロイして、Ray cluster上でJupyter notebookが利用できる環境を構築する。

# 参考

https://docs.ray.io/en/latest/cluster/kubernetes.html

# 前提
- Windows 10 Home
- WSLのUbuntuディストリビューション(Ubuntu20.04)がインストール済み
    - Ubuntu18.04だと最新のRayがインストールできないので20.04を利用する
- AWSのIAMユーザアカウント作成済み（アクセスキーとシークレットキーが手元にある）
- Docker-desktopをインストール済み

# 手順
## 1. Rayインストール

```bash
$ sudo apt-get update
$ sudo apt-get install python3
$ sudo apt install python3-pip
$ pip3 install -U "ray[default]" boto3
```

ここでWSLを再起動する。

## 2. helmインストール

```bash
$ curl -O https://raw.githubusercontent.com/helm/helm/master/scripts/get-helm-3
$ bash ./get-helm-3
$ helm version
```

'helm version'でバージョンが確認できれば正常にインストールされている。


## 3. Ray Helm Chartをダウンロード

```bash
$ git clone https://github.com/ray-project/ray.git
```

## 4. minikubeインストール & 起動

```bash
$ curl -Lo minikube https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64
$ chmod +x minikube
$ sudo install minikube /usr/local/bin/
$ minikube start --driver=docker
```

## 5. Rayクラスターの起動

```bash
$ cd ray/deploy/charts
$ helm -n ray install example-cluster --create-namespace ./ray
```

インストールしたリソースを見ていく。

```bash
# カスタムリソースrayClusterのステータスを確認
$ kubectl -n ray get rayCluster
NAME              STATUS    RESTARTS   AGE
example-cluster   Running   0          53s

# PodとしてRay Head nodeとRay Worker nodeがデプロイされていることを確認
# Head nodeが1つ、Worker nodeが2つ
# Pod個数を変更するには、~/ray/deploy/charts/ray/values.yamlのminWorkersとmaxWorkersの設定値を変更する
$ kubectl -n ray get pods
NAME                                    READY   STATUS    RESTARTS   AGE
example-cluster-ray-head-type-5926k     1/1     Running   0          57s
example-cluster-ray-worker-type-8gbwx   1/1     Running   0          40s
example-cluster-ray-worker-type-l6cvx   1/1     Running   0          40s

# Head nodeを公開するためのService (ClusterIP)
$ kubectl -n ray get service
NAME                       TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)                       AGE
example-cluster-ray-head   ClusterIP   10.8.11.17   <none>        10001/TCP,8265/TCP,8000/TCP   115s

# The operator deployment.
# By default, the deployment is launched in namespace "default".
$ kubectl get deployment ray-operator
NAME           READY   UP-TO-DATE   AVAILABLE   AGE
ray-operator   1/1     1            1           3m1s

# The single pod of the operator deployment.
$ kubectl get pod -l cluster.ray.io/component=operator
NAME                            READY   STATUS    RESTARTS   AGE
ray-operator-84f5d57b7f-xkvtm   1/1     Running   0          3m35

# The Custom Resource Definition defining a RayCluster.
$ kubectl get crd rayclusters.cluster.ray.io
NAME                         CREATED AT
rayclusters.cluster.ray.io   2021-05-14T18:44:02
```

## 6. Jupyter notebookの起動

```bash
$ kubectl -n ray exec -it service/example-cluster-ray-head -- bash
$ pip3 install notebook
$ jupyter notebook --ip=* --no-browser --port 8000
```

別のUbuntuを開く。

```bash
$ kubectl -n ray port-forward service/example-cluster-ray-head 8000:8000
```

## 7.ブラウザでJupyter notebookにアクセス

ブラウザで以下にアクセスする。Jupyter notebook起動時に表示されたtokenを入力してJupyter notebookにログインする。

```
http://localhost:8000/
```

あとはJupyter notebookを使ってRayを試すことができます。


## 8. 削除

使い終わったら削除を忘れずに。

```bash
# まずカスタムリソースrayClusterの「example-cluster」を削除
$ kubectl -n ray delete raycluster example-cluster

# 次に「example-cluster」をアンインストール
$ helm -n ray uninstall example-cluster
release "example-cluster" uninstalled

# 最後にネームスペースrayを削除
$ kubectl delete namespace ray
namespace "ray" deleted
```