はじめに
この記事は、お手軽な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
セットアップ
参考
上をがっちゃんこしただけ
VMセットアップ
proxmox(kvm)のおまじない。必要性があるかは微妙。
AMD系のCPUの場合。
CPU支援を入れないと動かないことはたまにある。
# /etc/pve/qemu-server/[1-9]+.conf
sed -i 's/cpu: kvm64/cpu: host,flags=+pcid;+virt-ssbd;+amd-ssbd;+aes/' ${対象VM}
VM上
Ubuntuの設定
# ファイルディスクリプタの問題が起きるので
# 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のセットアップ
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時間ほったらかしにしていたらいつの間にか出来ていた。
画面の前で待っていても終わらない。
# 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
設定
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する前に実行する。
sudo microk8s reset --destroy-storage
juju remove-k8s my-k8s
【不要だった】停止前のおまじない
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も使えるなんてやったね!
Pipeline
todo
良い感じにまとめる
確認
ちなみにVMのリソースは結構食われている
16/32Gでballooningデバイスにしているハズだけ、ballooningはだめだったらしい
$ 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