NUC で Single Node OpenShift を触ってみよう

Red Hat が提供するエンタープライズなコンテナ・プラットフォーム「OpenShift」がシングルノードに対応したようです。

www.redhat.com

そうとなれば試してみたい欲求が抑えられませんよね?

というわけで要件を満たす機器を選定するところから SNO (Single Node OpenShift) を導入してみました。

ハードウェア要件

SNO をインストールするには以下のスペックが必要です。

f:id:nnstt1:20211126224542p:plain
SNO ハードウェア要件 *1

普通(?) の OpenShift だとコントロールプレーンで 4 コア/16 GB、コンピュートノードで 2 コア/8 GB が最小要件となっているので、一台辺りのスペックは高くなってしまいます。 一台でコントロールプレーンとコンピュートノードの役割を担うのでそこら辺は仕方ないですね。

f:id:nnstt1:20211126223927p:plain
OpenShift 最小要件 *2

cloud.redhat.com

機器選定

上記のハードウェア要件を満たす機器を探しました。 すでに ASRock DeskMini A300 というベアボーンを導入しているのですが、今回は別の機器を検討しました。(新しいものが欲しかったので!)

DeskMini 導入時の記事はこちら。 nnstt1.hatenablog.com

結論から言うと、第 11 世代 i5-1135G7 を搭載した NUC11PAHi5 を選びました。 www.amazon.co.jp

選定基準ですが、メモリとストレージは置いといて、まずは CPU コア数をベースに考えました。 自宅ラボで有名な NUC のスペックを確認してみると、都合よくハードウェア要件を満たすモデルがありました。

11 世代 NUC には CPU が異なる 3 モデルがありますが、一番お手頃な NUC11PAHi3 (Core i3-1115G4) は 2 コア 4 スレッドのため要件を満たしません。 NUC11PAHi5 (i5-1135G7) と NUC11PAHi7 (i7-1165G7) は 4 コア 8 スレッドで要件を満たしています。

あとはお財布との相談で、NUC11PAHi5 となりました(5000 兆円あったら NUC11PAHi7 にしてた)。

最近は Minisforum というメーカーが面白そうなベアボーンを出していたのでそちらも検討したのですが、Windows 搭載モデルが多く「OS 入れ替えるのに Windows 分の費用も上乗せされてるんだよなぁ…」とか考えてるうちに候補から外れてしまいました。

NUC11PAHi5 の最大搭載可能メモリ 64 GB と、SNO のハードウェア要件を十分に満たせます。 DeskMini が 32 GB で検証環境としてはギリギリなこともあり、一気に 64 GB にしようかと思ったのですが、ここでもお財布のストップがかかって 32 GB メモリを 1 枚にしました。 いずれ 2 枚目買って 64 GB にするんだ…。

www.amazon.co.jp

ちなみに、この記事を書いている日はアマゾンのブラックフライデー初日です。 上記メモリが安くなってないかなぁと覗いたら値上がりしてました。なんでや

ストレージは家の中で転がっていた 256 GB の SSD にしました。 m.2 の空きがあるので、いずれストレージが不足してきたら拡張する予定です。

あとは NUC には電源ケーブルが付属しないということで、アマゾンの売れ筋から見繕いました。

www.amazon.co.jp

以上が SNO を構築するために用意したハードウェアになります。

インストール

機器の準備ができたので、早速 SNO のインストールをおこないます。 SNO に関する公式ドキュメントは以下になります。

access.redhat.com

他の環境に OpenShift をインストールするのと比べてかなりページ数が少ないのが気になりますね…。

とは言え必要十分な情報は記載されているので、ドキュメント読みながらやればこの投稿は必要ないくらい簡単にインストールできますが、この投稿を意味あるものにするためにドキュメントの手順に合わせてインストール時のスクショを載せていきましょう。

SNO 用 DNS レコード登録

唯一のソフトウェア的な要件として、SNO が利用する DNS レコードの事前登録があります。

f:id:nnstt1:20211126235623p:plain
必要な DNS レコード

自宅ラボでは PowerDNS を使って DNS サーバを構築しており、そこに上記のレコードを静的登録しました。

検出 ISO 生成

Red Hat Hybrid Cloud Console *3Install OpenShift with the Assisted Installer というページから「検出 ISO」を作成します。

ベアメタルへの OpenShift インストールには IPI (Installer-provisioned infrastructure) と UPI (User-provisioned infrastructure) の 2 通りの方法があったのですが、新しく Assisted Bare Metal Installer が登場したようです(テックプレビュー段階でした)。

f:id:nnstt1:20211127002923p:plain
Assisted Bare Metal Installer

検出 ISO は Hybrid Cloud Console からノードを検出できるようにするためのイメージで、USB メモリなどに焼いて SNO をインストールする機器にぶっ刺して使います。

それでは Assisted Installer のページで SNO のインストールをおこなっていきます。

f:id:nnstt1:20211127003330p:plain
Cluster details(入力前)

まずはクラスタの情報として Cluster nameBase domain を入力します。 Base domain は前項で登録した DNS レコードと合わせてください。

そして Install single node OpenShift (SNO) にチェックを入れます。 チェックを入れると「SNO は高可用性ないですよー」「SNO にはノード追加できませんよー」という注意書きが表示されます。

f:id:nnstt1:20211127000705p:plain
Cluster details(入力後)

また、OpenShift version で選択できるバージョンも限定されます。 SNO をチェック入れてると上記画像のとおり 4.8.12 と 4.9.0 が選択できましたが、チェックを外すと 4.6.16 も選択可能となりました。(2021/11/9 時点)

f:id:nnstt1:20211127005912p:plain
Install single node OpenShift をチェックしなかった場合のバージョン

4.7 はどこいったんだ?という疑問はひとまずスルーして、クラスタの情報を入力したら「Next」です。 次ページの「Generate Discovery ISO」から検出 ISO のイメージをダウンロードできます。

f:id:nnstt1:20211127004042p:plain
Host discovery

「Generate Discovery ISO」をクリックするとポップアップが表示されます。 ここでは「フル」と「最小」のどちらのイメージをダウンロードするか選択し、SNO にアクセスするための SSH 公開鍵を登録します。 今回は「フルイメージ」を選択しました。

f:id:nnstt1:20211127004113p:plain
Generate Discovery ISO

ポップアップの「Generate Discovery ISO」をクリックすると準備中となり、

f:id:nnstt1:20211127004719p:plain
Discovery image is being prepared

しばらく待つとダウンロード可能になります。

f:id:nnstt1:20211127004907p:plain
Discovery ISO is ready to download

URL を見るとイメージは S3 に格納されているようです(AWS 詳しくないので合ってるか不安…)。 「Download Discovery ISO」をクリックして検出 ISO をダウンロードします。 検出 ISO のサイズは約 1 GB (今回は 987 MB) でした。

ダウンロードしたイメージを USB メモリなどに焼きます。 今回は Raspberry Pi Imager を使いましたが、問題なく SNO ノードで起動することができました。

USB メディアを使用したインストール

検出 ISO の準備ができたら、NUC に USB メモリを刺して電源を入れます。 USB からブートする設定になっていれば、Hybrid Cloud Console 上に検出されたノードの情報が表示されます。 検出直後は Hostname と Status の項目が警告になっています。

f:id:nnstt1:20211127010927p:plain
Information and warnings

Hostname は「localhost」が使えないということらしいので変更します。

f:id:nnstt1:20211127011059p:plain
Hostname is not valid

f:id:nnstt1:20211127011259p:plain
Edit Host

Hostname を変更すると Status の警告も無くなりました。

f:id:nnstt1:20211127011442p:plain
Status ready

最後にネットワークの設定をおこないます。 SNO のネットワークは User-Managed Networking しか選択できない状態となっています。

f:id:nnstt1:20211127011716p:plain
Networking(サブネット選択前)

Available subnets に SNO ノードが利用できるサブネットが表示されます。 今回は自宅ラボ用ネットワーク 192.168.1.0/24 に繋いでいたのですが、その情報も取得されてプルダウンに表示されていました。

サブネットを選択すると Status が Ready となり、ネットワーク関連の情報も表示されました。

f:id:nnstt1:20211127012655p:plain
Networking(サブネット選択後)

最後に設定内容をレビューして問題なければ、いよいよ SNO がインストールされます。

f:id:nnstt1:20211127013217p:plain
Review and create

インストール進行状況も Hybrid Cloud Console から確認できます。

f:id:nnstt1:20211127013435p:plain
Installation progress

今回のインストールでは途中でインストールが停止してしまいました。 インストール途中に NUC が再起動されたのですが、「BIOS のブートを USB 起動に設定」かつ「USB メモリ挿しっぱなし」という状況だったため、検出 ISO が再度起動してしまったことが原因でした。 上記のどちらかを対処すればインストールが再開します。

f:id:nnstt1:20211127013657p:plain
Pending user action

無事にインストール完了しました!

f:id:nnstt1:20211127014213p:plain
インストール成功

これで NUC 一台で OpenShift を稼働させることができました。 あとは kubeconfig をダウンロードしてクラスタに繋いだり、コンソールにアクセスして GUI で Operator を入れたり、OpenShift ならでは検証ができるようになります。

その他

OpenShift の評価版

Red Hat Developer Suite」という Red Hat 製品のいくつかを無料で使える素晴らしいサブスクリプションがあります。

www.redhat.com

上記のページで OpenShift も対象っぽい記載があるので「太っ腹じゃん!」と思いながら今回の SNO 構築を決めたのですが、どうやら OpenShift は対象外のようで評価版という形で SNO は使うことになりました。

評価版と言っても期間は 60 日間で、クラスタを再インストールしたら再度 60 日に巻き戻ったので遊ぶ分には十分かなという感じです。

kubeadmin のパスワード

インストールで作成される管理ユーザ「kubeadmin」で oc login しようとしたのですが、パスワードがなかなか見つかりませんでした。

Hybrid Cloud Console のクラスタページの「Installation progress」の左にある > マークをクリックすると…

f:id:nnstt1:20211127021838p:plain
パスワードの場所

こんなところに隠れていました。

f:id:nnstt1:20211127022007p:plain
パスワードの場所

結構探したよ…。

ルート証明書

インストール直後のコンソールにブラウザでアクセスしても、証明書エラーとなりログイン画面にすら辿り着けませんでした。

f:id:nnstt1:20211127020744p:plain
ingress-operator 発行の証明書

SNO のページではないですが、OpenShift のドキュメントにルート証明書を変更する手順はありました。 しかし今回はそのままのルート証明書でアクセスするようにしました。

oc get secret router-ca -n openshift-ingress-operator -o jsonpath='{.data.tls\.crt}' | base64 -d > router-ca.crt というコマンドで証明書を抽出して、クライアント PC にインストールしました。 これでコンソールにもアクセスできるようになりました。

所感

自分が初めて OpenShift を触ったのは 4.2 くらいのときで、やれブートストラップノードが必要だの、やれ Ignition がどうだのと、勉強にはなったのですが中々つらい気持ちもありました。

それに比べて SNO (Single Node OpenShift) のインストールはとても簡単でした(Assisted Installer のおかげ?)。 もっとヒィヒィ言いながらインストールさせてくれてもよかったのに…って気持ちも湧きそうなくらいです。

わざわざ NUC で OpenShift 用意して自宅でなにするよって疑問も残ってますが、kubeadm で作ったクラスタと比較しながら Kubernetes の勉強に使えればよいですね。

SNO の中で各コンポーネントがどのように動いているか等は改めて投稿したいと思います。

何はともあれ、OpenShift を気軽に触れる環境が自宅にあるというのはとても精神衛生上よろしいので、ぜひこれを読んだ人も SNO やってみてはどうでしょう。

f:id:nnstt1:20211127025833p:plain