ぼくの考えたかんたんなK8s・Kubeflowのレシピ

# はじめに

この記事は、お手軽なKubeflow・K8s環境を構築する手順をまとめたものです。

シングルノード・オプションてんこ盛りでmicrok8sを構築し、kubeflowをデプロイして機械学習ガンガンにできる環境を作ります。

ほとんどコピペで難しくはないんだけど、再構築したいときに絶対忘れてるやつなので…

notさいきょうnot考えた。

## なぜやったし？

k0sクラスタもjupyterlab GPU環境(docker)もちょうど壊れたので

別にマルチノード構成してもStatefulsetは救えないし、GPU入りのクラスタをHAにするのは大変だとわかったので…

RKE,RKE2,k0s,k3sは使ったことあるから別なの使いたかった。
(とりあえずkubeadm使えよといわれそうだがおいておく)

## 環境
- proxmox VE 7.4(母艦)
- ubuntu 22.04(VM)
- RTX3060

# セットアップ

## 参考

https://charmed-kubeflow.io/docs/get-started-with-charmed-kubeflow

https://tech.virtualtech.jp/entry/2023/07/06/160310

https://qiita.com/kiwsdiv/items/3e8dac099cb27c7c4b01

上をがっちゃんこしただけ

## VMセットアップ

proxmox(kvm)のおまじない。必要性があるかは微妙。
AMD系のCPUの場合。
CPU支援を入れないと動かないことはたまにある。


~~~bash
# /etc/pve/qemu-server/[1-9]+.conf
sed -i 's/cpu: kvm64/cpu: host,flags=+pcid;+virt-ssbd;+amd-ssbd;+aes/' ${対象VM}
~~~

## VM上

### Ubuntuの設定

~~~bash
# ファイルディスクリプタの問題が起きるので
# sudo sysctl fs.inotify.max_user_instances=1280
# sudo sysctl fs.inotify.max_user_watches=655360
cat << EOF | sudo tee -a /etc/sysctl.conf
fs.inotify.max_user_instances=1280
fs.inotify.max_user_watches=655360
EOF

# nouveauを読まないように
cat << EOF | sudo tee -a /etc/modprobe.d/blacklist-nouveau.conf
blacklist nouveau
options nouveau modeset=0
EOF
sudo update-initramfs -u
sudo reboot

# nvidiaのドライバ入れる
# ドライバの確認は`ubuntu-drivers devices`
## レポジトリ登録
sudo add-apt-repository ppa:graphics-drivers/ppa

## 3060の例
sudo apt install nvidia-driver-535
sudo reboot
~~~

### microk8sのセットアップ

~~~bash
sudo snap install microk8s --classic --channel=1.26/stable
sudo usermod -a -G microk8s $USER
newgrp microk8s
sudo chown -f -R $USER ~/.kube

# 諸々有効化(アドレス圏は適当に決める)
microk8s enable \
    dns \
    hostpath-storage \
    ingress \
    dashboard \
    gpu \
    registry \
    metallb:192.168.60.10-192.168.60.250

# お好みでalias登録しておく
cat << "EOF" >> ~/.`basename $SHELL`rc
alias kubectl="microk8s kubectl"
# 補完
source <(kubectl completion `basename $SHELL`)
EOF
source ~/.`basename $SHELL`rc
~~~

### jujuのセットアップ

1~2時間ほったらかしにしていたらいつの間にか出来ていた。

画面の前で待っていても終わらない。

~~~bash
# install
sudo snap install juju --classic --channel=3.1/stable
mkdir -p ~/.local/share

# microk8s登録
microk8s config | juju add-k8s my-k8s --client
juju bootstrap my-k8s uk8sx

# kubeflow deploy
juju add-model kubeflow
juju deploy kubeflow --trust  --channel=1.8/stable

# deploy完了を気長にまつ
juju status --watch 5s
~~~

---

### 設定

https://charmed-kubeflow.io/docs/get-started-with-charmed-kubeflow#heading--configure-the-charmed-kubeflow-components

~~~bash
ADDR=`microk8s kubectl -n kubeflow get svc istio-ingressgateway-workload -o jsonpath='{.status.loadBalancer.ingress[0].ip}'`
juju config dex-auth public-url=http://${ADDR}.nip.io
juju config oidc-gatekeeper public-url=http://${ADDR}.nip.io

# 管理画面のデフォルトのアカウント設定
juju config dex-auth static-username=admin
juju config dex-auth static-password=admin

~~~
### おまけ


#### 滅びの呪文

microk8s stopする前に実行する。

~~~bash
sudo microk8s reset --destroy-storage
juju remove-k8s my-k8s
~~~

#### 【不要だった】~~停止前のおまじない~~
~~~bash
kubectl get statefulset -n kubeflow --no-headers \
    | cut -d' ' -f1 \
    | xargs -I{} microk8s kubectl scale -n kubeflow statefulset {} --replicas=0
    
kubectl get deploy -n kubeflow --no-headers \
    | cut -d' ' -f1 \
    | xargs -I{} microk8s kubectl scale -n kubeflow deploy {} --replicas=0
~~~
---
# 使ってみる

## Notebook

クリックひとつでnotebook環境作れて、GPUまでつかえちゃうって結構衝撃的

任意のイメージも使える。

VS CodeもRも使えるなんてやったね！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3472791/b634f346-17a3-4eb1-f726-3823b1e50178.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3472791/426938f1-62e6-5da8-11fa-c1aa0542f2ae.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3472791/4b3122bc-a12a-458e-cc1d-ac0cde0bfe04.png)

## Pipeline

todo
良い感じにまとめる

## 確認

ちなみにVMのリソースは結構食われている

16/32Gでballooningデバイスにしているハズだけ、ballooningはだめだったらしい

~~~bash
$ microk8s kubectl top node
NAME               CPU(cores)   CPU%   MEMORY(bytes)   MEMORY%   
ubuntumicrostack   1178m        9%     13577Mi         87%       
$ free -h
               total        used        free      shared  buff/cache   available
Mem:            15Gi        10Gi       358Mi       8.0Mi       4.8Gi       4.7Gi
Swap:             0B          0B          0B

$ kubectl  top pod -A --sort-by='memory' | head 
NAMESPACE                NAME                                                          CPU(cores)   MEMORY(bytes)   
work                     test-notebook-0                                               6m           2180Mi          
kubeflow                 kfp-db-0                                                      34m          936Mi           
kubeflow                 katib-db-0                                                    10m          821Mi           
controller-uk8sx         controller-0                                                  75m          818Mi           
kubeflow                 jupyter-ui-0                                                  2m           206Mi           
kubeflow                 tensorboards-web-app-0                                        2m           202Mi           
ingress                  nginx-ingress-microk8s-controller-4sbxk                       3m           177Mi           
kubeflow                 kubeflow-volumes-8546f5448b-brfp7                             1m           172Mi           
kubeflow                 knative-operator-0                                            12m          157Mi           
~~~