ytooyamaのブログ

サーバ構築とか、仕事で発見したこととか、趣味のこととかを書いています。

k3sでJupyter Notebookを動かしてみる

昨日はmcrok8sを使ったので、今回はk3sを使って同じようなことをしてみました。

ytooyama.hatenadiary.jp

先に結果を書いておくと、問題なく動きました。

k3sの初期セットアップ

バイナリーを使ったセットアップは、だいたい次のような感じ。 注意するのはwgetでとってくるk3sバイナリー。アーキテクチャーに注意。アーキテクチャーがファイル名についていないk3sはamd64用です。k3s Releasesから、最新を取ってくればだいたい良い感じです。

# wget https://github.com/rancher/k3s/releases/download/v1.18.8%2Bk3s1/k3s
# chmod +x k3s
# mv k3s /usr/local/bin
# bash
# k3s server &
# k3s kubectl get node
NAME                STATUS   ROLES    AGE   VERSION
youhei-virtualbox   Ready    master   12m   v1.18.8+k3s1

PVC要求の発行

PVC要求のためのYAMLを作成

まずはStoarge Classを確認する。このバージョンでは local-path という名前で呼べば良いようだ。

root@youhei-virtualbox:~# k3s kubectl get sc
NAME                   PROVISIONER             RECLAIMPOLICY   VOLUMEBINDINGMODE      ALLOWVOLUMEEXPANSION   AGE
local-path (default)   rancher.io/local-path   Delete          WaitForFirstConsumer   false                  28m

YAMLファイルのstorageClassNameを local-path に変更する。他は一緒で良さそう。

---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  labels:
    app: myclaim
  name: myclaim
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 1Gi
  storageClassName: local-path

PVC要求の実施

実行すると次のような出力がある。 要約すると、「'WaitForFirstConsumer'は、バインドする前に最初のコンシューマーが作成されるのを待っています」。

root@youhei-virtualbox:~# k3s kubectl create -f jupyter-pvc.yaml
I0820 09:52:44.890052    3676 event.go:278] Event(v1.ObjectReference{Kind:"PersistentVolumeClaim", Namespace:"default", Name:"myclaim", UID:"fe5dc0bf-77c9-4433-9982-684056d763b4", APIVersion:"v1", ResourceVersion:"650", FieldPath:""}): type: 'Normal' reason: 'WaitForFirstConsumer' waiting for first consumer to be created before binding
persistentvolumeclaim/myclaim created

ずっと同じメッセージが表示される。PVC要求の結果が表示されるがPendingになっている。

root@youhei-virtualbox:~# k3s kubectl get -f jupyter-pvc.yaml
I0820 09:53:08.240975    3676 event.go:278] Event(v1.ObjectReference{Kind:"PersistentVolumeClaim", Namespace:"default", Name:"myclaim", UID:"fe5dc0bf-77c9-4433-9982-684056d763b4", APIVersion:"v1", ResourceVersion:"650", FieldPath:""}): type: 'Normal' reason: 'WaitForFirstConsumer' waiting for first consumer to be created before binding
I0820 09:53:23.241527    3676 event.go:278] Event(v1.ObjectReference{Kind:"PersistentVolumeClaim", Namespace:"default", Name:"myclaim", UID:"fe5dc0bf-77c9-4433-9982-684056d763b4", APIVersion:"v1", ResourceVersion:"650", FieldPath:""}): type: 'Normal' reason: 'WaitForFirstConsumer' waiting for first consumer to be created before binding
I0820 09:53:38.241561    3676 event.go:278] Event(v1.ObjectReference{Kind:"PersistentVolumeClaim", Namespace:"default", Name:"myclaim", UID:"fe5dc0bf-77c9-4433-9982-684056d763b4", APIVersion:"v1", ResourceVersion:"650", FieldPath:""}): type: 'Normal' reason: 'WaitForFirstConsumer' waiting for first consumer to be created before binding

NAME      STATUS    VOLUME   CAPACITY   ACCESS MODES   STORAGECLASS   AGE
myclaim   Pending   

k3sデフォルトのlocal-pathは「WaitForFirstConsumer」を設定されているため。

root@youhei-virtualbox:~# k3s kubectl get sc
NAME                   PROVISIONER             RECLAIMPOLICY   VOLUMEBINDINGMODE      ALLOWVOLUMEEXPANSION   AGE
local-path (default)   rancher.io/local-path   Delete          WaitForFirstConsumer   false                  28m

「WaitForFirstConsumer」については以下に説明がある。

kubernetes.io

というわけで、気にせずPodを作成する。

root@youhei-virtualbox:~# k3s kubectl create -f jupyter-pod.yaml
service/jupyter2 created
pod/jupyter2 created

Podは作成されたようだ。当然ながら、PVもPVCも作られている。

root@youhei-virtualbox:~# k3s kubectl get po -w
NAME       READY   STATUS              RESTARTS   AGE
jupyter2   0/1     ContainerCreating   0          33s
...
jupyter2   1/1     Running             0          93s

root@youhei-virtualbox:~# k3s kubectl get pvc
NAME      STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   AGE
myclaim   Bound    pvc-fe5dc0bf-77c9-4433-9982-684056d763b4   1Gi        RWO            local-path     5m12s

root@youhei-virtualbox:~# k3s kubectl get pv
NAME                                       CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM             STORAGECLASS   REASON   AGE
pvc-fe5dc0bf-77c9-4433-9982-684056d763b4   1Gi        RWO            Delete           Bound    default/myclaim   local-path              3m49s

Podを確認する。前回同様、/jupyter としてボリュームがマウントされたのが確認できる。

root@youhei-virtualbox:~# k3s kubectl get -f jupyter-pod.yaml 
NAME               TYPE       CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
service/jupyter2   NodePort   10.43.102.178   <none>        80:31062/TCP   8m13s

NAME           READY   STATUS    RESTARTS   AGE
pod/jupyter2   1/1     Running   0          8m13s

root@youhei-virtualbox:~# k3s kubectl exec -it jupyter2 -- df -h
Filesystem      Size  Used Avail Use% Mounted on
overlay          32G  8.0G   22G  27% /
tmpfs            64M     0   64M   0% /dev
tmpfs           2.0G     0  2.0G   0% /sys/fs/cgroup
/dev/sda1        32G  8.0G   22G  27% /jupyter
shm              64M     0   64M   0% /dev/shm
tmpfs           2.0G   12K  2.0G   1% /run/secrets/kubernetes.io/serviceaccount
tmpfs           2.0G     0  2.0G   0% /proc/acpi
tmpfs           2.0G     0  2.0G   0% /proc/scsi
tmpfs           2.0G     0  2.0G   0% /sys/firmware

このブログサイトはJavaScriptを使っていますが、読み込んでいるJavaScriptは全てはてなが提供しているものであり、筆者が設置しているものではありません。