オンプレGitLabにMicroK8s接続してGitLabのJupyterHubを使う

毎度、ググっても出てこない小ネタを取り扱っております。
本記事は個人的な見解であり、筆者の所属するいかなる団体にも関係ございません。

# 0. はじめに

GitLabには、いくつかのJupyterに関連する機能があります。.ipynbのJupyterNotebookを表示([Jupyter Notebook Files](https://docs.gitlab.com/ee/user/project/repository/jupyter_notebooks/))したり、
Kubernetesを連携したらJupyterHubを動かす[Jupyter Hub as a GitLab Managed App](https://docs.gitlab.com/ee/user/clusters/applications.html#jupyterhub)があります。
KuberbernetesをGitLabに連携すると[Jupyter HubのRunbookを実行できる機能](https://docs.gitlab.com/ee/user/project/clusters/runbooks/)もあります
そのJupyterHubでは[Jupyter Git integration](https://docs.gitlab.com/ee/user/clusters/applications.html#jupyter-git-integration)でGitと連携できます。
DevOps runbooksをRubix/Nurtchによるライブラリで利用することができます。

以下の2回の記事でオンプレGitLabにKubernetesであるMicroK8sを接続しましたので、そのKubernetes上でJupyterHubを動かしてみます。

オンプレGitLabにMicroK8s接続してGitLabのAuto DevOpsを体験する(前半) - Qiita
https://qiita.com/ynott/items/f3651e9f3d46b1f088ee

オンプレGitLabにMicroK8s接続してGitLabのAuto DevOpsを体験する(後半) - Qiita
https://qiita.com/ynott/items/46d4b2926afec0d788f2


https://www.youtube.com/watch?v=Q_OqHIIUPjE

# 1. JupyterHubを動かす

GitLabをKubernetes連携してあれば、インストールは簡単です。

Kubernetes連携」から「該当クラスター」をクリックして、アプリケーションをクリックして
`JupyterHub`でインストールボタンを押します。以下はインストール途中の画面です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15176/6144358e-f1c2-ef9a-367d-6a88b22b0cd9.png)


インストールできると以下のようになります。
インストールには約4分～5分程度かかります。

```
$ kubectl get all -n gitlab-managed-apps
NAME                                                       READY   STATUS    RESTARTS   AGE
pod/ingress-nginx-ingress-default-backend-c9b59c85-vvm9f   1/1     Running   0          17m
pod/ingress-nginx-ingress-controller-75686bdf76-gcqdr      2/2     Running   0          17m
pod/continuous-image-puller-99vtb                          1/1     Running   0          5m6s
pod/proxy-949ff9478-rv7qq                                  1/1     Running   0          5m6s
pod/user-scheduler-d6bd9d4dc-bvgjk                         1/1     Running   0          5m6s
pod/user-scheduler-d6bd9d4dc-4tmw9                         1/1     Running   0          5m6s
pod/hub-5f64bf79bf-g699m                                   1/1     Running   0          5m6s

NAME                                            TYPE           CLUSTER-IP       EXTERNAL-IP     PORT(S)                      AGE
service/ingress-nginx-ingress-default-backend   ClusterIP      10.152.183.240   <none>          80/TCP                       17m
service/ingress-nginx-ingress-controller        LoadBalancer   10.152.183.45    192.168.10.30   80:31012/TCP,443:31903/TCP   17m
service/proxy-public                            ClusterIP      10.152.183.143   <none>          443/TCP,80/TCP               5m7s
service/hub                                     ClusterIP      10.152.183.167   <none>          8081/TCP                     5m7s
service/proxy-api                               ClusterIP      10.152.183.64    <none>          8001/TCP                     5m7s

NAME                                     DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR   AGE
daemonset.apps/continuous-image-puller   1         1         1       1            1           <none>          5m6s

NAME                                                    READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/ingress-nginx-ingress-default-backend   1/1     1            1           17m
deployment.apps/ingress-nginx-ingress-controller        1/1     1            1           17m
deployment.apps/proxy                                   1/1     1            1           5m6s
deployment.apps/user-scheduler                          2/2     2            2           5m6s
deployment.apps/hub                                     1/1     1            1           5m6s

NAME                                                             DESIRED   CURRENT   READY   AGE
replicaset.apps/ingress-nginx-ingress-default-backend-c9b59c85   1         1         1       17m
replicaset.apps/ingress-nginx-ingress-controller-75686bdf76      1         1         1       17m
replicaset.apps/proxy-949ff9478                                  1         1         1       5m6s
replicaset.apps/user-scheduler-d6bd9d4dc                         2         2         2       5m6s
replicaset.apps/hub-5f64bf79bf                                   1         1         1       5m6s

NAME                                READY   AGE
statefulset.apps/user-placeholder   0/0     5m6s
``` 

# 2. JupyterHubを開いて動作確認

JupyterHubに接続するには、`Jupyter のホスト名`の下の`Jupyter.hogehoge.nip.io`をブラウザーで開きます。

以下の`Sign in with GitLab`が出てくるのでクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15176/15cd721b-98de-0bd3-89f3-e53919b3864a.png)

GitLabへログインしていなければ、ログイン画面が出てくるのでログインします。
(GitLabへログインしている場合は、すぐに以下のページに切り替わります)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15176/5de40d6a-e0e1-9485-0e2b-eaa538ad51e6.png)

最初のみJupyterへの接続確認が行われます。`Authorize`をクリックします。
以下のようなログ画面が出て、

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15176/ac556d7e-f7bf-e656-4a23-5c4b1bc50a4d.png)

JupyterHubが起動します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15176/7100d98a-eab4-f59a-404d-b96675bbe217.png)


# 3. RunBookを開く

左ペインの`DevOps-Runbook-Demo`をクリックして`Nurtch-DevOps-Demo.ipynb`をクリックして開きます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15176/1b0bac87-5fdc-d8d1-195d-e77721baf369.png)

RunBookのデモを体験できます。
実際に動かしているデモ画像がYoutubeにありますので、参考にしてみてください。

https://www.youtube.com/watch?v=Q_OqHIIUPjE

# 4. Gitリポジトリーを開く

ここでデプロイされたJupyterHubは、Git連携できるようになっているのでGitリポジトリーをJupyterHubで開いて
変更があればそれをGitリポジトリーにPushし直すことも出来ます。

![image.png](https://docs.gitlab.com/ee/user/clusters/img/jupyter-git-extension.gif)

こちらもDemoがYoutubeにあります。
GitLab repository integration for JupyterHub - Demo - YouTube
https://www.youtube.com/watch?v=ruhCdixHMQI

GitLab Managed Apps | GitLab
https://docs.gitlab.com/ee/user/clusters/applications.html#jupyter-git-integration

# 5. まとめ

これから一層Jupyterは利用が進むと思います。これは、AIのような分野のみならずRunBookのようなサーバーメンテナンスをするのに
便利なプラットフォームとして利用されていくでしょう。

RunBookは、CUIターミナルでのサーバー操作と自動化したCI/CDでのサーバー操作の中間のような操作感です。
もっと利用が増えればいいなと思います。