RancherとJetson Nanoを使ってKubernetesクラスタを構築する
やりたいこと
GWなので、軽量KubernetesをJetson NanoにインストールしてRancherで管理するような環境を作って遊んでみようと思う。
というのも、エッジ環境でKubernetesを動かす事例が最近色々ある。
意外なところで言うと、アメリカの新型爆撃機(B-21)に組み込まれているらしい。
爆撃機とかいう極端な世界でも利用されてしているのだし、エッジでk8sを動かす事例は今後も増えていくと思う。じゃあ、導入するのは結構だけど、クラスターのアップグレードといった管理はどうするの?となる。
そこで、k8sクラスタの管理ツールであるRancherを使って、クラスタのアップグレードとかアプリの配信とかを、どのくらい簡単にできるのか色々試しながら遊んでみようと思う。
今回は、環境構築編。
準備するもの
- Jetson Nano一式
- Jetson Nano本体(今回は家に転がっていた A02)と電源
- microSDXC (Samsung EVO Plus 64GB)
- 有線のキーボードと有線のマウス
- HDMIがあるモニター
- 必要ならジャンパーピン
- 有線LAN環境が無いなら Wi-Fiドングル(https://www.yodobashi.com/product-detail/100000001004242372/ がいいと思う)
- DockerをインストールしたPC (M1 Macを使用)
- SDカードリーダ
SDカードの準備
これをやらないと始まらないので、
を参考にブート可能なSDカードを用意する。
DLしてきたOSのイメージは JetPack 4.6.1
。これをEtcherを使ってSDに書き込んでいく。
これはボタンを押すだけなので簡単。
Jetson Nanoのセットアップ
Jetson Nanoのセットアップ方法は、
- Jetson Nanoにディスプレイを繋いで作業する一番シンプルな方法
- もう一台のPCを用意してHeadlessモードで作業する
の2通りがある。
ここでは、普通にディスプレイを繋いで作業することにする。
Jetsonの電源を入れる前に、モニターやキーボードを接続しておく。ネットワークに関しては、LANケーブルでやるのが一番楽だが、Wi-FiのUSBドングルを持っているなら、それを繋いでネットに繋ぐことも可能。
電源を入れ、ライセンスの許諾やユーザーアカウントの設定等をすれば、ひとまず準備完了となる。(必要なら日本語化も別途行う)
SDに書き込んだOSイメージは当然のことながら最新の状態ではないので、
$ sudo apt update && sudo apt dist-upgrade
$ sudo apt install --fix-broken -o Dpkg::Options::="--force-overwrite"
でOSを最新の状態に更新しておく。これには時間がかかるので気長に待つ。
後々使うので、更新が完了したら sudo apt install -y curl
で curl
をインストールしておく。
k3sでGPU利用可能にするための下準備
Jetson Nanoにk3sをインストールすることは簡単だけど、GPUを使えるようにするのは結構面倒臭い。なぜなら、SDカードに書き込んだイメージにプリインストールされている nvidia-container-toolkit
のバージョンは 1.7
で、 後々 k3sでGPUを利用できるようにするために必要な NVIDIA Device Plugin
はより上のバージョンをターゲットにしている。そのため、このままではk3sでGPUを使えない。
そこで、nvidia-container-toolkit
のバージョンアップを行う。ついでに、NVIDIA Device Plugin
のインストールの準備も一緒に行う。
toolkitのバージョンアップコマンドは以下の通り。
$ distribution=$(. /etc/os-release;echo $ID$VERSION_ID) \
&& curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg \
&& curl -s -L https://nvidia.github.io/libnvidia-container/experimental/$distribution/libnvidia-container.list | \
sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g' | \
sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list
これを実行したら
sudo apt update && sudo apt upgrade -y
を行い再起動する。
$ sudo dpkg -l nvidia-container-toolkit
を実行すれば、バージョンを更新できているのを確認できるはず。
次にNVIDIA Device Plugin
のインストールの準備として /etc/docker/daemon.json
を修正する。
内容としてはこの通り
{
"default-runtime": "nvidia",
"runtimes": {
"nvidia": {
"path": "/usr/bin/nvidia-container-runtime",
"runtimeArgs": []
}
}
}
変更を反映するために
$ sudo systemctl restart docker
を実行する。
Rancherの準備
Rancherは、Rancher Labsと言うところが開発しているKubernetesクラスタ管理ツールで、簡単に言えば、複数のKubernetesクラスタを一括管理するためのOSSツール。Enterprise利用するならサポートライセンス契約してねって感じらしい。
Rancherの導入だが、コンテナイメージが配布されているので、今回はそれを落として利用する。
普通に配布されているコンテナイメージを起動させられればいいので、Docker for MacをインストールしたM1 Macで作業を行う。コマンドとしては以下の通り。
$ docker run -d --restart=unless-stopped -p 8080:80 -p 8443:443 --privileged rancher/rancher
あとは、 localhost:8080
または localhost:8443
をブラウザで開けばOK。
表示されている指示に従い、コンテナのログからパスワードを見つけてログインする。
パスワード設定・ライセンス許諾の画面が表示されるので画面の指示に従い入力する。次に進むとWelcome画面が表示される。
次に、 左上のハンバーガーメニューから Global Setting
> settings
> server-url
を開いて URLを localhost
から 自分のMacのIPアドレスに書き換える。
これでひとまずRancherの準備完了。
k3sのインストール
Rancherだけでk3sをJetsonにインストールすることもできるが、コンテナランタイムをDockerに設定する方法がイマイチ分からなかったので、k3sのインストールコマンドを Jetson上で叩いてインストールする。
$ curl -sfL https://get.k3s.io | INSTALL_K3S_VERSION=v1.24.13+k3s1 sh -s - --docker
後々、k3sのバージョンアップ等もやってみたいので、インストールするバージョンを最新版ではなく少し前の v1.24.13
に指定してある。
インストールが完了すれば、以下のコマンドを叩いて Podの起動確認ができる
$ sudo kubectl get pods -A
k3s on JetsonをRancherに登録する
では次に、k3sをインストールしたJetsonをRancherに登録する。
構成済みクラスタを登録するには Import Existing
をクリックする。
すると以下のような画面に遷移するので、Import any Kubernetes cluster
にある Generic
を選択。
名前を設定し Create
をクリックすると以下のような画面に遷移するはず。
中段に書いてある、一旦 curl
でマニフェストを落としてきて kubectl
に渡すやつをJetson上で叩く。
ここで注意が必要なのは、 kubectl
の前に sudo
をつける点。
うまく設定できると以下のような画面を表示できるようになるはず。
これで Jetson Nanoにインストールしたk3sを Mac上に用意した Rancherで管理できるようになった。
次回は簡単なデモアプリを書いて遊んでみようと思う。
Discussion