💻

RancherとJetson Nanoを使ってKubernetesクラスタを構築する

2023/04/30に公開

やりたいこと

GWなので、軽量KubernetesをJetson NanoにインストールしてRancherで管理するような環境を作って遊んでみようと思う。
というのも、エッジ環境でKubernetesを動かす事例が最近色々ある。
意外なところで言うと、アメリカの新型爆撃機(B-21)に組み込まれているらしい。

https://www.northropgrumman.com/what-we-do/air/b-21-raider/b-21-supporting-voices/

爆撃機とかいう極端な世界でも利用されてしているのだし、エッジでk8sを動かす事例は今後も増えていくと思う。じゃあ、導入するのは結構だけど、クラスターのアップグレードといった管理はどうするの?となる。

そこで、k8sクラスタの管理ツールであるRancherを使って、クラスタのアップグレードとかアプリの配信とかを、どのくらい簡単にできるのか色々試しながら遊んでみようと思う。

今回は、環境構築編。

https://www.rancher.co.jp/products/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カードの準備

これをやらないと始まらないので、

https://developer.nvidia.com/embedded/learn/get-started-jetson-nano-devkit#write

を参考にブート可能なSDカードを用意する。
DLしてきたOSのイメージは JetPack 4.6.1。これをEtcherを使ってSDに書き込んでいく。
これはボタンを押すだけなので簡単。

Jetson Nanoのセットアップ

Jetson Nanoのセットアップ方法は、

  1. Jetson Nanoにディスプレイを繋いで作業する一番シンプルな方法
  2. もう一台の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 curlcurl をインストールしておく。

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の導入だが、コンテナイメージが配布されているので、今回はそれを落として利用する。

https://hub.docker.com/r/rancher/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