Kubernetes上にhelmでJupyterHubをデプロイする

マルチユーザなJupyter環境を実現するJupyterHubをデプロイしてみます。
helm3を使用します。
https://zero-to-jupyterhub.readthedocs.io/en/latest/

※kindで構築したクラスタで検証した内容になります。
ワイルドカードDNSを用いてアクセスできるようにするためこちらの記事を参考に事前設定をしています。
必要に応じて作業をしてください。
https://qiita.com/tar_xzvf/items/666ee87d8b84d2937e43

## 0. 事前準備
※こちらの記事で紹介しているクラスタを作成することで事前準備をすることができます。
https://qiita.com/tar_xzvf/items/666ee87d8b84d2937e43
- worker nodeが1つ以上あるKubernetesクラスタを作成
- ingressが使える状態

## 1. config.yamlファイルを作成する
必要最低限の設定をします。

※ secretToken には `openssl rand -hex 32` を実行して得られた値を入れます。

```yaml:config.yaml
proxy:
  secretToken: "<secretTokenを入力>"
singleuser:
  storage:
    capacity: 2Gi
ingress:
  enabled: true
  hosts:
    - hub.<IPアドレス>.nip.io
```

## 2. デプロイする
```
helm repo add jupyterhub https://jupyterhub.github.io/helm-chart/
helm repo update
kubectl create ns jhub
helm upgrade --install jhub jupyterhub/jupyterhub --namespace jhub --version=0.8.2 --values ./config.yaml
```

## 3. JupyterHubにログインし、Jupyter notebookを起動する
http:/hub.IPアドレス.nip.io にアクセスすることでJupyterHubのログインページが表示されることを確認します。

![jupyterhub.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58803/95f27b0f-ddb4-1cab-1ed4-938fb11d29ee.png)

適当なUsername/Passwordを入力します。
今回は`hub`をそれぞれに入力しSing Inをクリックします。
![jupyterhub2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58803/7848c904-f092-95b9-d6de-bd31941fc576.png)

ログイン後、Jupyter notebookが起動しはじめます。
![jupyterhub5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58803/ca1db284-f770-9b75-b0d9-687833d66de0.png)

起動しました。
![jupyterhub4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58803/3cc53122-4009-1c06-5cf0-fc44f1bcdf50.png)

## その他
Zero to JupyterHubでは様々な設定をすることができます。
個人的に設定を推奨する項目について以下で紹介します。

### 認証について
様々な認証方法を利用することができます。
中にはOAuthに対応したIdpを利用することができ、Githubの認証情報でログインすることができるようになります。
ケースに応じて適切な認証方法を設定されることをお勧めします。
https://jupyterhub.readthedocs.io/en/stable/reference/authenticators.html
https://zero-to-jupyterhub.readthedocs.io/en/latest/administrator/authentication.html#github

私の場合はKeycloakを利用しています。
JupyterHubとKeycloakの連携については後日別の記事で紹介する予定です。

デフォルトの挙動について、認証を何も設定していない場合は適当なUsername/Passwordを入力するだけで利用できてしまいます。
※この挙動が正しいのか分かりません...
余談ですが、JupyterHubをk8sではなく普通のサーバの上で直に動かした場合は、PAM認証になるためUnixユーザの認証情報でログインできます。

### DBの設定について
デフォルトでは、SQLiteが使用されます。
本番運用する際にはPostgreSQLをお勧めします。
https://jupyterhub.readthedocs.io/en/stable/reference/database.html

helmでの設定はこちらになります。
https://zero-to-jupyterhub.readthedocs.io/en/latest/reference/reference.html#hub-db

```yaml
hub:
  db:
    type: postgres
    url: postgresql://<db-username>:<db-password>@<db-hostname>:<db-port>/<db-name>
```

### JupyterLabが起動時に表示されるようにする
デフォルトでは、Jupyter notebookが起動します。
JupyterLabを起動したい場合は以下の設定をします。

```yaml
hub:
  extraConfig:
    myConfig: |
      c.KubeSpawner.default_url = '/lab'
```

## 今回の設定を全部入れた場合の設定ファイル

```yaml:config.yaml
proxy:
  secretToken: "<secretTokenを入力>"
singleuser:
  storage:
    capacity: 2Gi
hub:
  db:
    type: postgres
    url: postgresql://<db-username>:<db-password>@<db-hostname>:<db-port>/<db-name>
  extraConfig:
    myConfig: |
      c.KubeSpawner.default_url = '/lab'
ingress:
  enabled: true
  hosts:
    - hub.<IPアドレス>.nip.io
```

JupyterHubには様々な設定項目があるため、また別の機会に便利な設定や機能を紹介したいと思います。