Rancher ElementalでVMware Workstation上にクラスタ作成を行う

#### はじめに
今回はRancherの拡張機能であるEementalを利用し、OSのインストールとkubernetesクラスタの作成を行っていきます。

#### Elementalとは？
RancherでのOSマネジメント機能であり、デバイスにElementalでビルドしたOSをインストールすることで、デバイスがRancher管理下に置かれます。
そこからkubernetesのプロビジョニング及びkubernetesのワークロードを開始できます。

#### Elementalの用途は？
SUSEが提供しているエッジ向けの機能になります。
エッジコンピューティングでは、通常のデータセンターでの運用とは異なり、分散環境での運用となります。
エッジでは以下のような難しさがあります。
- 各地でのセットアップが大変
- デバイスの管理台数が多い
- セキュリティ対応が難しい
- etc


Elementalを利用することにより、、マシンにあらかじめISOイメージを配置しておけば現地ではデバイスをネットワークにつないで電源を起動するだけ、Rancher管理下に置かれることになります。また、Rancher経由でkubernetesクラスタを構築し、Fleetとあわせて即座にアプリケーションのデプロイを行うことができます。これまでのエッジでの環境構築の大変さを大幅に軽減できます。

また、OSはSLE Micro for Rancherがベースとなっており、コンテナ/kubernetes向けに設計されており、イミュータブルな設計になっています。

#### 環境
```
Rancher v2.7.6
OS: ubuntu 22.04
エッジデバイス： VMware workstation Pro17で代用
ISO作成用VM: ubuntu22.04 (Docker 20.10インストール済み)
```
本来はエッジデバイスが必要ですが、今回は簡単に構築するためにVMware Workstationを利用します。ただし、ElementalのOS要件にTPM2.0が利用できる必要があるので、Pro版が必要になります。

#### 作業の流れ
今回は以下のような作業が必要になります。
1. Elementalの利用準備
1. エンドポイントの作成
1. iSOイメージの作成
1. VM構築
1. kubernetes構築


#### Elementalの利用準備
ElementalをRancherで利用するには以下の３つのステップが必要になります。
 - Rancher Extensionの有効化
 - Elemental install
 - Elemental Oparetor install

早速やっていきます。

左端のExtensionを選択し、EnableをクリックすることでRancher Extensionが有効化されます。
![rancher-extension.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2332364/a58c1103-b9c9-1132-b5fc-f2765a3508ce.png)

有効化したら、AvailableタブでElementalをインストールします。
![rancher-elemental-installing.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2332364/36f44ee0-c274-e487-826e-3e9791e88976.png)

installingでずっと画面上がロードしているように見えるかもしれませんが、実際にはすぐに完了しているので画面を更新してください。
すると、OS Managementの欄が左に追加されます。しかし、これだけでは使えません。Elemental Oparatorをインストールしないといけません。
![pre-elemental-op-installed.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2332364/377400e4-06d8-e1d5-6095-171489d32015.png)


Rancher Management Serverに接続し、以下のコマンドを打つことでインストールできます。
```:Rancher server
helm upgrade --create-namespace -n cattle-elemental-system --install elemental-operator-crds oci://registry.suse.com/rancher/elemental-operator-crds-chart
helm upgrade --create-namespace -n cattle-elemental-system --install elemental-operator oci://registry.suse.com/rancher/elemental-operator-chart
```

Elemental Oparetorがインストールされれば以下のように画面表示が変わります。
![iso-build-download.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2332364/6923454e-c727-b35b-a264-9ef79c587f2d.png)

ダッシュボードやRegistration Endpointが表示されるようになります。

#### ISO作成

今回はVMwareのTPMエミュレート機能を使うので、通常とは設定ファイルやiSOイメージ作成の流れが通常とは少し異なります。
ベアメタルサーバーへインストールする場合はもう少しシンプルになります。

まず、OS ManagementのRegistration EndpointsタブでCreateをクリックします。
そして今回は**Edit as YAML**で編集をします。
![create-registration-ep.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2332364/5276b0f1-a5b6-8a83-6468-cdd8ebc8d945.png)

Yamlの内容は以下の内容のものです。ユーザ名やパスワード、エンドポイント名は自由に決めてください。
ただ、注意点として今回はVMwareのTPMエミュレーション機能を使うので、`registration`のオプションだけは忘れずに。

```
apiVersion: elemental.cattle.io/v1beta1
kind: MachineRegistration
metadata:
  name: elemental-demo-vm
  namespace: fleet-default
spec:
  config:
    cloud-config:
      users:
        - name: root
          passwd: root
    elemental:
      install:
        reboot: true
        device: /dev/sda
        debug: true
      registration:
        emulate-tpm: true  ##必須
        emulated-tpm-seed: 1  ##必須
  machineName:
  machineInventoryLabels:
    manufacturer: "${System Information/Manufacturer}"
    productName: "${System Information/Product Name}"
    serialNumber: "${System Information/Serial Number}"
    machineUUID: "${System Information/UUID}"
```

上記内容で作成後Createし、Registration Endpointの画面で作成したエンドポイントをクリックしてください。
本来は下記の画面で`Build ISO`でビルド後、ISOをダウンロードし、マシンにインストールすればOKですが、VMware WorkstationのTPMエミュレート機能を使う場合は一手間必要です。

ここでは**Download Configuration File**でファイルをダウンロードしてください。[エンドポイント名]_registrationURL.yamlという名前でダウンロードされます。今回で言うとelemental-vm_registrationURL.yaml
![file-down.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2332364/b5dd432a-e444-d8a7-36e3-c5c5b879204b.png)

ここからISOを手動で作成する必要がありますが、それにはLinuxとdockerが必要になります。
今回はUbuntu VMが用意してあります。(RancherのVMでも何でもよい)

作業用のVMへ接続し、作業用ディレクトリを作成します。
```: 作業用VM
mkdir /home/user/elemental-demo
cd /home/user/elemental-demo
```

vim initial-registration.yamlに先ほどの、elemental-vm_registrationURL.yamlの内容をコピーします。
```
vim initial-registration.yaml
```

私の環境では以下のような内容でした。


<details><summary>elemental-vm_registrationURL.yaml</summary><div>

```
elemental:
  registration:
    url: https://rancher.192.168.1.166.sslip.io/elemental/registration/nccf24c8jf84klqm26p6hnvqjbxgkz2tjzzvnb6b4x74n2v4jzbbpj
    ca-cert: |-
      -----BEGIN CERTIFICATE-----
      MIIBvjCCAWOgAwIBAgIBADAKBggqhkjOPQQDAjBGMRwwGgYDVQQKExNkeW5hbWlj
      bGlzdGVuZXItb3JnMSYwJAYDVQQDDB1keW5hbWljbGlzdGVuZXItY2FAMTY5NTA5
      ODM3NDAeFw0yMzA5MTkwNDM5MzRaFw0zMzA5MTYwNDM5MzRaMEYxHDAaBgNVBAoT
      E2R5bmFtaWNsaXN0ZW5lci1vcmcxJjAkBgNVBAMMHWR5bmFtaWNsaXN0ZW5lci1j
      YUAxNjk1MDk4Mzc0MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEDo0UhuZde8EY
      /49wPFvbl9Sn7f7aKYu8fA7kqIOEFPavltZDwd8qt/KPdduCH01P3/ZWDGNLyhhC
      iVuk1LbY86NCMEAwDgYDVR0PAQH/BAQDAgKkMA8GA1UdEwEB/wQFMAMBAf8wHQYD
      VR0OBBYEFPHYnluqi3AL12cAj24ZQYBr1atkMAoGCCqGSM49BAMCA0kAMEYCIQCb
      MgVEKxccBlPYwILXxvEWW64LNp+Z/kwOnUQFbCtoyQIhAPYu0/zRx7xxLtaFG0Wv
      EagvKdglME6CM3ZUxBMsHCRy
      -----END CERTIFICATE-----
    emulate-tpm: true
    emulated-tpm-seed: 1
    auth: tpm
``` 
</div></details>

次にisoをダウンロードするスクリプトをダウンロードし、initial-registration.yamlを注入します。

```: Ubuntu VM
wget -q https://raw.githubusercontent.com/rancher/elemental/main/.github/elemental-iso-add-registration && chmod +x elemental-iso-add-registration
```

最後にスクリプトにinitial-registration.yamlを引数に渡し実行します。
```: Ubuntu VM
./elemental-iso-add-registration initial-registration.yaml
```

これで``elemental-teal.x86_63.iso``が作成されるのでダウンロードしてください。

本来であればこれをUSBに書き込みデバイスでブートしますが、今回はVMで構築します。


#### Elemental isoでブート
OSは先ほど言ったようにSLE Micro for Rancherなのでスペック的には軽いもので大丈夫です。kubernetesもRKE2かk3sを選択できますのでk3sで行う場合は大したスペックはいりません。
メモリ4GB、1コア CPUとかでも大丈夫です。
ただし、Diskは40GB以上用意してください。
VMを作成するときはゲストOSの選択画面のバージョンでSLESを選択してください。
![gestos.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2332364/8e49ebd6-bf49-30c9-45db-a678ab37adc6.png)


VMを用意したら、VMの設定を開いてください。そしてオプションをタブの``アクセスコントロール``で暗号化のパスワードを設定してください。(TPMの有効化)
![tpm-emulate.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2332364/1fbdb6f8-d99b-d66e-44de-609d9233b97e.png)

次に``詳細``でファームフェアタイプをUEfiにし、セキュアブートを有効にします。
![UEFI.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2332364/bbe7b77a-ec7a-9833-582f-60fe0685aed3.png)

ここまで来たら準備完了です。いよいよブートです。
#### ブートとk8sのインストール

ブートすると以下のような画面が表示されるはずです。そうでなければ設定が間違っています。
TPM設定が漏れているか、ファームフェアタイプの設定がBIOSのまま、などが考えられます。

![boot.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2332364/1be9b6f2-3956-0b91-3e96-31ff40037690.png)

ブート後、Rancher画面のInventry of MachinesでアクティブになればOKです。
![after-boot-inventry.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2332364/5f5dba2f-4ba9-f7a2-dcaf-f3279c9cfdce.png)

本画面でマシンの欄にチェックを入れて、``Create Elemental Cluster``を選択するか、通常のCluster作成画面でElementalが表示されます。

![create-cluster-with-elemental.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2332364/a59a7668-d756-0912-597a-adab3a2f1741.png)


![create-cluster-with-n.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2332364/63665205-ce93-86f5-39b6-a6a3e1c3d883.png)

どちらから選択しても通常のクラスタ作成画面になります。
ここで、k3sかRKE2を作成しkubernetesクラスタを構築できます。
構築後は通常のRancherでの利用の流れと同様になります。
![cluster-management.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2332364/c1f056d0-51e8-e1e1-90d5-7822566a57eb.png)


長くなりましたが、以上でElementalでのクラスタ作成の流れでした。
一度ISOを作れば同じものをマシンにインストールすることでクラスタを構築することができるので便利です。

次はRaspberry piを利用してやってみようかと思います。

#### 参考
今回の手順は[本ページ](https://elemental.docs.rancher.com/next/rancher-vmware)に準拠しています。

SLE Microに関しては[こちら](https://www.suse.com/ja-jp/products/micro/)