- Tinkerbellを使ってIntel NUCにUbuntu 20.04 LTSをインストールします。
-
Target Server
- LANケーブルのポートがあり、NVMe対応M.2 SSDが刺さっているPC
- SATA, SASストレージでもできますが、後述するhardware.yamlの修正が必要です
- 検証機には、第七世代のIntel NUCを使用しました
- 既にOSがインストールしてあった場合、全部消えるのでご注意ください
- LANケーブルのポートがあり、NVMe対応M.2 SSDが刺さっているPC
-
Tinkerbell Stack Server
- Tinkerbellをk3dで動かします
- PXE Boot用のDHCPサーバーとしても振舞います
-
Bastion Host
- 操作用の踏み台サーバーです
-
Router
- フレッツ光のレンタルルーターです
-
Switch
- スイッチハブです
- Dockerのインストール
- DockerをTinkerbell Stack Serverにあらかじめインストールしてください
https://github.com/k3d-io/k3d#requirements
- DockerをTinkerbell Stack Serverにあらかじめインストールしてください
基本的にTinkerbell Stack Server上で作業します。
- Tinkerbellを動かすための土台としてk3dを動かします
k3d cluster create --network host --no-lb --k3s-arg "--disable=traefik,servicelb" --k3s-arg "--kube-apiserver-arg=feature-gates=MixedProtocolLBService=true" --host-pid-mode
- sandboxリポジトリのコマンドを参考にしています
Note
- k3dはDocker上でk3s(Rancherが開発している軽量なkubernetesディストリビューション)を動かすためのラッパーです。k3dを動かす際に各種オプションを忘れないでください。
--no-lb --k3s-arg "--disable=traefik,servicelb"
- CNI(kubernetesのネットワークを支えるコンポーネント。k3dではデフォルトでtraefikがCNIとして入ってます)やネットワークサービスを無効化します。
- 代わりにTinkerbellではmacvlan network driverを利用して、ホストと同じIP空間にあるIPアドレスを割り当てます。
--network host --host-pid-mode
- 同じくmacvlanを使うために必要な設定です。
--k3s-arg "--kube-apiserver-arg=feature-gates=MixedProtocolLBService=true"
- Kubernetes上のLoad Balancerに対して、同じポートで異なるプロトコル(UDP、TCP)に対応できるようにします。
- 元々β機能だったのでフィーチャーフラグの設定として必要でしたが、Kubernetes 1.26でGAになったのでそのうち要らなくなると思います。
- Tinkerbellのchartリポジトリを
git clone
しますgit clone https://github.com/tinkerbell/charts.git
- テンプレートファイル
values.yaml
を自分の環境に合わせて変更します。cd chart/tinkerbell
- README.mdのガイダンスに従ってください
- テンプレートファイルで通常設定する箇所
stack.loadBalancerIP
: Tinker Stack ServerのIPアドレスを設定します。stack.relay.sourceInterface
: Tinker Stack ServerのNIC(ネットワーク名)を設定します。boots.remoteIp
: PXE Boot用DHCPサーバーのIPアドレスです。コメントにあるようにサブネットの範囲内で未使用のIPアドレスを割り振ってください。boots.tinkServer
: tink serverコンポーネント用のIPアドレスです。stack.loadBalancerIP
と同じ値にしてください。boots.osieBase
: hookと呼ばれるOSイメージを配布するためのIPアドレスです。stack.loadBalancerIP
と同じ値にしてください。
Note
stack.relay.sourceInterface
(NIC)の修正を忘れないでください。
これを間違えるとインストール対象のサーバーからTinkerbellのDHCPサーバーに到達できないため、PXE Bootが成功しません。
おじさんはeth0と思い込んでいました...今どきはこういう名前なんですね。
- Tinkerbellスタックをインストールします
-
# charts/tinkerbellフォルダ配下で... # stack/Chart.lockファイルを更新します helm dependency build stack/ # PodのCIDRを設定します trusted_proxies=$(kubectl get nodes -o jsonpath='{.items[*].spec.podCIDR}' | tr ' ' ',') # Tinkerbellスタックをインストールします helm install stack-release stack/ --create-namespace --namespace tink-system --wait --set "boots.trustedProxies=${trusted_proxies}" --set "hegel.trustedProxies=${trusted_proxies}"
-
Note
helm install
実行後、しばらく時間がかかるのでターミナルで別タブを開き、 次の確認コマンドを実行します
- Tinkerbellスタックが起動したか検証します
- 全てのpodが動作しているか確認します:
kubectl get pods -n tink-system
values.yaml
で指定したIPアドレスがEXTERNAL-IP
カラムに設定されているかtink-stack
のサービスリソースを確認します:kubectl get svc -n tink-system
- podがすべて
running
の状態になっていてもIPアドレスが既存のデバイスと被っている場合、pending
のまま変わりません。その場合はvalues.yaml
を再修正してhelm uninstall stack-release -n tink-system
後、再度インストールしてください。
- podがすべて
- 全てのpodが動作しているか確認します:
- Ubuntu 20.04 (Focal)
.img
ファイルをダウンロード、変換、ファイルサーバー上に公開しますgit clone https://github.com/tinkerbell/sandbox.git
&&kubectl apply -n tink-system -f ~/sandbox/deploy/stack/helm/manifests/ubuntu-download.yaml
- これにより、FocalファイルがTinkerbellスタックのウェブサーバー経由で利用可能となり、template.yamlファイルで使用することができます。
wget http://${EXTERNAL-IP}:8080/focal-server-cloudimg-amd64.raw.gz
でファイルがDLできることを確認してください。EXTERNAL-IPにはvalues.yaml
で指定したTinkerbellスタックサーバーのIPアドレス(例では192.168.1.13)が入ります- 他のOSをインストールしたい場合、
ubuntu-download.yaml
を調べてもいいし、Tinkerbellのドキュメントを読むことで、このダウンロードと変換を手動で実行する手順を確認することができます。
- 3つのCRDs(hardware, template, workflow)を自分の環境に合わせてカスタマイズします
- TinkリポジトリにCRDの例があります。
- もし
quay.io/tinkerbell-actions/image2disk:v1.0.0
を使用するならIMG_URL: "http://EXTERNAL-IP:8080/focal-server-cloudimg-amd64.raw.gz"
という環境変数をtemplate.yaml
に追加してください workflow.yaml
が正しいtemplateRef
およびhardwareRef CRD
の名前を参照し、device_1
がターゲットマシンのMACアドレスと一致していることを確認してください。hardware.yaml
、template.yaml
ならびにworkflow.yaml
ファイルの例を下に載せます。
- ターゲットのサーバーをPXE Bootモードで起動して、DHCPサーバーを検索中の状態にします
- 即座にTinkerbell CRDsをクラスタにapplyします
-
kubectl apply -f hardware.yaml kubectl apply -f template.yaml kubectl apply -f workflow.yaml
-
Note sandboxリポジトリのsandbox->deploy->stack->helm->manifestsをベースに手直しした例を添付します。
2~3番の流れですが、Tinkerbell CRDsをクラスタにapplyした後でサーバーをPXE Bootモードで起動するとOSのインストールが安定しなかったため、この手順にしています。
- ワークフローの状態を見ます
kubectl get workflow -n tink-system --watch
- ワークフローの状態が
STATE_SUCCESS
になったら再度ターゲットのサーバーをリブートします。 - サーバーにログインします。SSHでコンソール画面にアクセスできます。
Note OSインストール後、単純に再起動するとまたPXE Bootの画面になるため、起動中にF2を連打してUEFIの画面を立ち上げて、Bootの優先度をストレージに変更するとうまくいきます。
プロビジョニングの間、ターゲットのサーバーの画面はLinuxKitの起動後、表示が変わらず、スタックしているのかインストールがうまくいっているのか判別がつきません。
gettyによりターミナルの操作ができるため、 dockerコマンドを使ってtink-workerのコンテナのログを直接見ると良いでしょう。
具体的にはdocker ps
でtink-worker
コンテナのIDを確認し、docker logs -f ${tink-workerのコンテナID}
でログを出力することで電子の妖精が働いている様子を見ることができます。