機械学習とか

kubernetes上に開発環境を構築する

経緯

5月から新しい職場が増え,それに伴い開発環境もガラリと変わりました. Google cloud platform上にデータ基盤があるので,それに合わせ開発環境も同じ環境に置くことになりました.

Dockerfileの用意

何時も通りjupyter-labで作業をしたいので,それ関連のDockerfileを用意しDockerHubに上げて置きます.
今回用意したDockerfileは以下の通りです.

FROM nvidia/cuda:8.0-cudnn5-runtime-ubuntu16.04

MAINTAINER TrsNium

RUN rm /bin/sh && ln -s /bin/bash /bin/sh

ENV HOME  /root

RUN apt-get -y update
RUN apt-get -y upgrade
RUN apt-get -y install git libssl-dev build-essential libsqlite3-dev libhdf5-dev libbz2-dev lsof make zlib1g-dev libreadline-dev libsqlite3-dev wget curl llvm libncurses5-dev libncursesw5-dev libpng-dev libgtk2.0-0

RUN git clone https://github.com/pyenv/pyenv.git ~/.pyenv
RUN echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bashrc
RUN echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bashrc
RUN echo -e 'if command -v pyenv 1>/dev/null 2>&1; then\n  eval "$(pyenv init -)"\nfi' >> ~/.bashrc

ENV PYENV_ROOT $HOME/.pyenv
ENV PATH $PYENV_ROOT/shims:$PYENV_ROOT/bin:$PATH

RUN pyenv install anaconda3-4.1.0
RUN pyenv global anaconda3-4.1.0
RUN pyenv rehash

COPY requirements.txt $HOME/
RUN cat $HOME/requirements.txt | xargs -n 1 pip install
RUN jupyter notebook --generate-config
RUN echo -e "c.NotebookApp.ip ='*'\nc.NotebookApp.port = 8888" > $HOME/.jupyter/jupyter_notebook_config.py

RUN conda install -c https://conda.binstar.org/jjhelmus opencv

WORKDIR $HOME

CMD jupyter-lab --allow-root 

これをビルドしDockerhubに置いておきます.
ちなみにnividia/cuda:8のイメージを使っていますが,kubernetes上でgpuを使う方法がまだわかっていないので追い追い追記していこうと思います.

GCP kubernetes engine を使っていく

https://console.cloud.google.com/kubernetesに移りクラスタを作成していきます.
作成できると,このようになると思います.馬刺しが食べたかったのでクラスタ名はbasashiにしました. f:id:yakuta55:20180524110128p:plain

次にhttps://console.cloud.google.com/compute/に移りVMインスタンスを編集します.
ここで追加ディスクの欄で新しい空のディスクを追加してください.
今回ディスクの名前はjupyter-lab-diskにしました. f:id:yakuta55:20180524110603p:plain
追加ディスクを設ける理由はデータの永続化をするためです.

vmインスタンスに接続し,以下のコマンドを実行するとディスクが追加されているのがわかると思います.

$ sudo fdisk -l
Disk /dev/sda: 100 GiB, 107374182400 bytes, 209715200 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
Disklabel type: gpt
Disk identifier: 5C6DBC8F-C18C-7843-953A-94BC745657F8
Device       Start       End   Sectors  Size Type
/dev/sda1  8704000 209715166 201011167 95.9G Microsoft basic data
/dev/sda2    20480     53247     32768   16M ChromeOS kernel
/dev/sda3  4509696   8703999   4194304    2G ChromeOS root fs
/dev/sda4    53248     86015     32768   16M ChromeOS kernel
/dev/sda5   315392   4509695   4194304    2G ChromeOS root fs
/dev/sda6    16448     16448         1  512B ChromeOS kernel
/dev/sda7    16449     16449         1  512B ChromeOS root fs
/dev/sda8    86016    118783     32768   16M Microsoft basic data
/dev/sda9    16450     16450         1  512B ChromeOS reserved
/dev/sda10   16451     16451         1  512B ChromeOS reserved
/dev/sda11      64     16447     16384    8M BIOS boot
/dev/sda12  249856    315391     65536   32M EFI System
Partition 7 does not start on physical sector boundary.
Partition 9 does not start on physical sector boundary.
Partition 10 does not start on physical sector boundary.
Partition table entries are not in disk order.
Disk /dev/dm-0: 1.2 GiB, 1300234240 bytes, 317440 sectors
Units: sectors of 1 * 4096 = 4096 bytes
Sector size (logical/physical): 4096 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
Disk /dev/sdb: 500 GiB, 536870912000 bytes, 1048576000 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes

追加されたディスクをext4でフォーマットします.

mkfs -t ext4 /dev/sdb

次にhttps://console.cloud.google.com/kubernetes/に移り,クラスタに接続,deploymentについて記述していきます.

$touch deployment.yaml
$vi deployment.yaml
apiVersion: apps/v1beta1
kind: Deployment
metadata:
  name: jupyter-lab-deployment
  labels:
    app: jupyter-lab
spec:
  replicas: 1
  selector:
    matchLabels:
      app: jupyter-lab
  template:
    metadata:
      labels:
        app: jupyter-lab
    spec:
      containers:
      - name: jupyter-lab
        image: [DOCKER_HUM_USER_NAME]/[REPOSITORY]
        ports:
        - containerPort:  [PORT]
        volumeMounts:
        - mountPath: [MOUNT_PATH]
          name: jupyter-lab-volume
      volumes:
      - name: jupyter-lab-volume
        gcePersistentDisk:
            pdName: jupyter-lab-disk
            fsType: ext4

deploymentに関するyamlファイルを作成できたら,deployment,serviceを作成しjupyter labにアクセスできるようにします.
またjupyter-labにアクセスするためのtokenの確認もします.

$kubectl create -f deployment.yaml
#jupyter-labの動いてるpodの確認
$kubectl get pods
#tokenの確認
$kubectl logs POD名
$kubectl expose deployment jupyter-lab-deployment --type "LoadBalancer"
$kubectl get services
NAME                     TYPE           CLUSTER-IP      EXTERNAL-IP      PORT(S)          AGE
jupyter-lab-deployment   LoadBalancer   hoge   honya   8888:30315/TCP   1d

ブラウザにhttp://EXTERNAL_IP:PORT/labでjupyter labにアクセスできると思います.