Mac meets SUSE Edge:EIBを用いたLinux、K3s、Rancherのデプロイ
エッジコンピューティングは多大な可能性を秘めている一方で、特有の課題も抱えています。センサー、鉄道、リテール、スマートファクトリーなど、接続が不安定で帯域幅が限られていることが多く、信頼性の高いデータ転送やリモート管理が困難であるためです。エッジデプロイメントは規模が大きく、分散型であるため、管理と保守が非常に複雑になり、リモート管理機能が求められます。
SUSE Edgeチームは、ユーザーがOS、Kubernetes、アプリケーション、ネットワーク設定を含む単一のself-bootstrapping imageを作成し、任意の数のエッジノードに展開できるようにするEdge Image Builder(EIB)を開発しました。マシンは独立して起動し、RPM、Kubernetes、SUSE製品、エンドユーザーアプリケーションをインストールし、サービス提供の準備が整います。このイメージは、低帯域幅接続やエアギャップ環境で使用できます。
このブログでは、SUSE Linux Micro、K3s、Rancher Primeを組み合わせたEIBを使用してSUSE Edge管理クラスタをデプロイする手順をステップバイステップで解説します。軽量でコンテナに最適化されたOSと、リソース効率の高いKubernetesディストリビューションを、すべてRancher Primeで集中管理することで、エッジでのスケーラブルで堅牢なコンテナ化されたアプリケーションとインフラストラクチャのデプロイが可能になります。
必要なのはApple Silicon Macだけです。この管理クラスタを作成するために、別のサーバーは必要ありません。これは、EIBがARMアーキテクチャのイメージを構築できるからです。ここでは、Sonoma 14.4を実行しているMacBook Pro M3マシンを使用しました。Macをお持ちでなくてもご心配なく。EIBはx86マシン用のイメージを作成できます。
さらに、SUSEの製品はオープンソースであり、このガイドはSUSEサブスクリプションなしで実行できます。ただし、このガイドは学習/開発を目的としており、本番環境でのセットアップを意図したものではないことにご注意ください。
前提条件
- SUSE Linux Micro 6.0 Armイメージ (SL-Micro.aarch64-6.0-Base-SelfInstall-GM2.install.iso): こちらのリンクからダウンロードできます。SUSEアカウントでログインするか、新しいアカウントを作成してイメージをダウンロードしてください。必ずバージョン6.0、Arm (aarch64)を選択してください。
- UTMのインストール: 仮想マシンを実行するためにUTMをインストールします。
EIBを使用したイメージの構築
Edge Image Builderはコンテナとして実行されるため、非常に移植性が高く、大規模なインストールも不要です。これには、podmanなどのコンテナランタイムが必要です。Podmanは、MacOSのパッケージマネージャーであるHomebrewを通じてインストールできます。MacOS上のPodmanは、Linux上で実行する必要があるため、仮想マシンが必要です。ここでは、6 CPUと4GBメモリの仮想マシンを作成しますが、可能であれば10 CPUと8GBメモリを推奨します。
EIBの最新リリースバージョン1.1.0をプルします:
brew install podman
podman machine init --cpus 6 --memory 4096
podman machine start
podman pull registry.suse.com/edge/3.2/edge-image-builder:1.1.0
EIBには、特定の構造を持つイメージ定義ファイルとディレクトリが必要です。Gitディレクトリをcloneして、EIB構成をダウンロードします。ここでは、blog-rancher-3nodeディレクトリを使用します。
git clone https://github.com/jiwonhu/eib-lab.git
cd blog-rancher-3node/
EIB_DIR=$(pwd)
mkdir base-images
base-imagesディレクトリを作成し、SUSE Linux Microイメージをこのディレクトリに配置します。ディレクトリは次のようになります。
ファイルとディレクトリは次のとおりです:
- eib-config.yaml: EIBイメージ定義ファイル。
- custom:EIBでは、作ったシステム起動時、特別な設定用スクリプトを一緒に準備できます。その内の「99-alias.sh」というスクリプトは、システム上でkubectlという命令を使うために必要な設定を自動で行います。この設定用スクリプトを入れる場所は、あってもなくても大丈夫です。
- os-files:
- このディレクトリに配置されたファイルは、構築されたイメージのファイルシステムに自動的にコピーされます。SUSE Linux Micro 6.0ではrootユーザーのSSHアクセスが無効になっているため、便宜上、etc/ssh/sshd_configファイルを配置して有効にしています。このディレクトリはオプションです。
- kubernetes: イメージ定義ファイルには、k8s構成が含まれています。このディレクトリには、構築されたイメージに含めるための追加ファイルを追加できます。
- config:このディレクトリには、プロビジョニングされたKubernetesクラスタに適用されるK3s(またはRKE2)クラスタ構成ファイルが含まれています。yamlはすべてのコントロールプレーンノードに適用され、agent.yamlファイルはすべてのワーカーノードに適用されます。
- helm: EIBは、提供されていれば任意のhelmチャートをデプロイできます。helmディレクトリには、チャートにユーザー指定の構成を有効にするHelm values.yamlファイルが含まれており、クラスタに自動的に適用されます。
- manifests:K3sクラスタに適用されるKubernetesマニフェストが含まれています。SUSE Edgeは、ベアメタルマシン用のロードバランサとしてMetalLBを使用し、コントロールプレーンの高可用性を標準で保証します。マルチノードK3sクラスタには外部IPアドレスが必要であり、この例ではMetalLBで(192.168.64.14)を構成します。これは、MacからRancher GUIにアクセスするために必要です。
- network: 各ファイルには、特定のノードの目的のネットワーク構成が含まれています。3つのファイルがあり、このイメージが3ノードクラスタ用であることを示しています。
- node1.suse.com.yamlには、最初のマシンの(v)NICカードのMACアドレスが含まれています。ノードにこのMACアドレスがある場合、イメージはインターフェースに168.64.11 IPアドレスを割り当てます。この例では、node1は192.168.64.11、node2は192.168.64.12、node3は192.168.64.13を使用します。nm-configuratorと呼ばれるツールがノード上で使用され、MACアドレスに基づいて自身を一意に識別します。
さらに、kubernetes/helm/values/rancher.yamlファイルでは、Rancherにホスト名「rancher-192.168.64.14.sslip.io」(これにより、簡単に解決できるDNS名が有効になります)とパスワード「foobar」を割り当てます。後で、このホスト名とパスワードを使用してRancher GUIにアクセスします。本番環境ではこのパスワードを使用しないでください!
# kubernetes/helm/rancher.yaml
hostname: rancher-192.168.64.14.sslip.io
bootstrapPassword: "foobar"
replicas: 1
global.cattle.psp.enabled: "false"
それでは、イメージ定義ファイル(eib-config.yaml)を見ていきましょう。
apiVersion: 1.1
image:
imageType: iso
arch: aarch64
baseImage: SL-Micro.aarch64-6.0-Base-SelfInstall-GM2.install.iso
outputImageName: rancher-3node-aarch64-6.0.iso
operatingSystem:
isoConfiguration:
installDevice: /dev/vda
users:
- username: root
encryptedPassword: "$6$DIL3SYTayoaM13GP$zAfXEofZd154Wuuj.fMqJXKd2p8fieu75zLgta6dWz7rCHsxw0x4CcFjLH3V5Dy4sQKN9/VotNS9E37RYRTeD."
SUSE Linux MicroオペレーティングシステムはSUSE Edge Suiteの基盤であり、EIBはデフォルトのOSイメージにユーザー指定の構成を追加します。EIBは、ハードウェアに応じてself-installISOまたはRAWファイルイメージを受け取ることができます。例えば、組み込みEdgeデバイスに対してプロビジョニングする場合、ISOから起動するのではなく、SDカード/eMMCにRAWディスクイメージを書き込む可能性が高くなります。この例では、ISOイメージをベースイメージとして提供し、EIBは出力として「rancher-3node-aarch64-6.0.iso」という名前のイメージを作成します。
システム設定欄では、起動時の細かい設定ができます。例えば、起動時に実行する特別な命令や、使う時間帯、ユーザーの設定、ネット接続の設定などです。仮想マシンを動かす時、起動するための場所として「/dev/vda」を指定しました。これは、仮想的なディスクの事です。もし、実際の機械で使うなら、「/dev/sda」や「/dev/nvme0」といった実際のディスクを指定します。
userサブセクションでは、EIBにパスワード「root」を持つrootユーザーを作成するように指示します。本番環境ではこのパスワードを使用しないことをお勧めします。代わりに、OSのrootユーザーまたは新規ユーザーに対してSSHキーを指定できます。
この例では、簡略化のためRPMインストールは含まれていません。ただし、packagesサブセクションを指定することでRPMを含めることができます。これには、EIBがイメージを構築するための有効なSUSE Linux Microサブスクリプションコードが必要です。
Kubernetesの定義は次のとおりです。
kubernetes:
version: v1.31.4+k3s1
network:
apiHost: 192.168.64.10.sslip.io
apiVIP: 192.168.64.10
nodes:
- hostname: node1.suse.com
type: server
initializer: true
- hostname: node2.suse.com
type: agent
- hostname: node3.suse.com
type: agent
このイメージにK3s v1.31.4を含めるようにEIBに指示します。クラスタは、コントロールプレーンの仮想IPとして192.168.64.10を使用し、Kubernetes APIにアクセスするためのドメインアドレスとして192.168.64.10.sslip.ioを使用します。SSL証明書はこのホスト名を使用して構築されることに注意してください。
各ノードにはnodeX.suse.comというホスト名が付けられます。node1がクラスタ初期化ノードとして機能します。。これは、クラスタをブートストラップし、他のノードが事前に定義された仮想IPを介してクラスタに参加できるようにするサーバーノードです。
networkセクションとnodesセクションは、クラスタが単一ノードの場合、完全にオプションです。エッジノードがKubernetesを必要としない場合、kubernetesセクション自体をイメージ定義から省略できます。
イメージ定義の最後の部分は、アプリケーションまたはHelmチャート用です。
helm:
charts:
- name: cert-manager
version: 1.14.2
repositoryName: jetstack
targetNamespace: cert-manager
createNamespace: true
installationNamespace: kube-system
valuesFile: certmanager.yaml
- name: rancher
version: 2.10.1
repositoryName: rancher-prime
targetNamespace: cattle-system
createNamespace: true
installationNamespace: kube-system
valuesFile: rancher.yaml
repositories:
- name: jetstack
url: https://charts.jetstack.io
- name: rancher-prime
url: https://charts.rancher.com/server-charts/prime
帯域幅が制限された環境に対応するため、EIBは指定されたチャートとそれに関連するイメージをビルド時に自動的にダウンロードし、構築されたイメージに含めます。この例では、cert-managerとSUSE Rancher Prime v2.10.1をインストールします。EIBは、kubernetes/helm/valuesディレクトリにあるcertmanager.yamlとrancher.yamlをHelmチャートへの入力として使用します。
イメージを構築しましょう。EIBはMacがディレクトリに作成する.DS_Store隠しファイルを処理できないため、事前に削除します。私たちのマシンでは、イメージのビルドに7〜10分かかりました。イメージは同じフォルダに作成されます。
echo $EIB_DIR
find . -name ".DS_Store" -delete
podman run --privileged --rm -it -v $EIB_DIR:/eib registry.suse.com/edge/3.2/edge-image-builder:1.1.0 build --definition-file eib-config.yaml
出力は以下のようになります。
イメージビルドプロセスが失敗した場合は、ビルドログを確認すると役立ちます。ログは_buildディレクトリに保存されており、各イメージビルドにはタイムスタンプ付きの独自のサブディレクトリがあります。また、EIBディレクトリにFinderアプリケーションからアクセスする場合は、隠しファイルである.DS_Storeがすべて削除されていることを確認してください。
$ ls _build/
build-Feb10_12-32-23 cache
$ cd _build/build-Feb10_12-32-23
$ ls -alt
total 1344
-rw-r--r-- 1 jhu staff 35532 Feb 10 20:44 podman-system-service.log
-rw-r--r-- 1 jhu staff 4066 Feb 10 20:44 iso-build.log
-rw-r--r-- 1 jhu staff 2401 Feb 10 20:43 iso-extract.log
このイメージは、あなたのMacマシンが仮想ネットワークに192.168.64.0/24を使用することを前提としています。UTMは、192.168.200.0/24などの異なるサブネットを構成している可能性があります。これをチェックし、IPアドレスをあなたのサブネットに合わせて更新することをお勧めします。
$ sudo grep -A3 "Shared_Net_Address" /Library/Preferences/SystemConfiguration/com.apple.vmnet.plist
Shared_Net_Address
192.168.64.1
Shared_Net_Mask
255.255.255.0
上記のコマンドの出力に異なるサブネットが表示された場合は、これらのファイルを更新する必要があります。
- eib-config.yaml内のKubernetes VIP(apiVIPとapiHost)
- network/nodeX.suse.com.yaml内のノードIP
- kubernetes/manifests/ingress-ippool-l2adv.yaml内のIngress IP
- kubernetes/helm/values/rancher.yaml内のIngress IP
self-install imageのデプロイ
K3sクラスタとRancherをデプロイしましょう。これは簡単です。仮想マシンを作成するだけで、OS、K3s、Rancherが自動的に、そして無人でインストールされます。イメージはユーザーの介入なしに自己起動することを想定していることを覚えておいてください。
UTMアプリケーションを開き、新しい仮想マシンを作成します。
「仮想化」を選択し、次に「その他」を選択します。ブートデバイスとして「CD/DVDイメージ」を選択し、EIBが作成したイメージを選択します。
仮想マシンに8GBのメモリと4つのコアを割り当てます。次に、ストレージボリュームに30GBを割り当てます。
もう少しで完了です。「node1」などの名前をVMに付けます。「VM設定を開く」チェックボックスをオンにしてネットワークを構成し、VMを保存します。
「ネットワーク」タブに移動し、ネットワークモードとして「共有ネットワーク」を選択し、MACアドレス34:8A:B1:4B:16:E1 を割り当てます。これは、network/node1.suse.com.yamlファイルで定義されたMACアドレスと一致します。これにより、マシンは起動時に自身をnode1として自己識別できるようになり、事前定義されたネットワーク構成が割り当てられ、インターフェースにIPアドレス192.168.64.11が追加されます。同様に、2番目のVMは、目的のIPアドレスを取得するためにnode2.suse.com.yamlファイルからMACアドレスを使用する必要があります。
VMを起動します。VMは自動的に起動し、rootユーザーを構成し、RPMをインストールし、ネットワークインターフェースを構成します。その後、K3sとRancher Primeをインストールします。
VMが起動して実行されたら、rootユーザーとしてログインし、K3sとRancherのポッドの状態を確認できます。
Rancher GUIにアクセスしましょう。Webブラウザを開き、https://rancher-192.168.64.14.sslip.io/にアクセスします。先ほど割り当てたブートストラップパスワード「foobar」を入力し、エンドユーザーライセンス契約に同意します。
これでRancher Primeのデプロイが完了し、K3sクラスタ(「local」クラスタ)のステータスを確認できます。このクラスタは、他のSUSE Edge K3s/RKE2クラスタを管理するための管理クラスタとして機能することができます。
さらに詳しく知りたいですか?
単一のVMでK3sとRancherをデプロイしましたが、このEIB構成は3ノードクラスタをサポートしています。追加のVMをデプロイして、マルチノードクラスタを形成できます。
2番目と3番目のVMは読者のための演習です。network/nodeX.suse.com.yamlファイルからMACアドレスを後続のVMに割り当てるようにしてください。
まとめ
このブログ記事では、Edge Image Builderが単一のMac上でSUSE Linux Micro、K3s、およびRancher Primeのデプロイをいかに簡素化するかをデモンストレーションし、最小限の労力で完全なエッジソリューションを作成およびデプロイする能力を示しました。OS、Kubernetes、およびアプリケーションを自己起動型イメージにパッケージ化することにより、EIBはゼロタッチプロビジョニングを可能にします。このアプローチにより、エッジクラスタの迅速なプロビジョニングが可能になり、非常に貴重なツールとなっています。さらに、このチュートリアルを通じて、Macの利便性から、SUSEのエッジ製品のパワーを直接体験していただけましたら幸いです。
このブログ記事は、エッジ担当フィールドプロダクトマネージャーのJiwon Huが、エッジコンテナエンジニアのDanial Bekhitの貢献を得て執筆しました。
Related Articles
12月 02nd, 2024
SUSE認定の仮想化向けストレージ – シームレスな統合と信頼性を実現するエンタープライズ向けソリューション
5月 21st, 2024
SUSEコンテナ・セキュリティ・プラットフォームでKubernetes攻撃を阻止する方法
1月 31st, 2025
既存のハイブリッドITインフラストラクチャへのコンテナ管理プラットフォーム統合方法
6月 23rd, 2024