【OpenShift Virtualization】RHELのKVM Guest Imageを使って、YAMLでVM建ててみた

# はじめに
- エンタープライズ向けコンテナアプリケーション・プラットフォームである「Red Hat OpenShift Container Platform」の標準機能である「OpenShift Virtualization (OCPv)」では、コンテナのみならずRHELやWindowsのVirutalMachineをホスティングする事ができます
- 今回はAWSのManaged Service板OpenShiftである「Red Hat OpenShift Service on AWS (通称ROSA)」を使って、その機能を試します
- なお、ROSAにおける「OpenShift Virtualization」のセットアップについては以下の記事をご参照ください。
    - https://qiita.com/masaki-oomura/items/62ae108115d6164f9e42

# やること
- 今回はRed Hatが提供しているRHELのKVM Guset Imageを使って、明示的にGuest OSのVerを指定してVMを建てます
    - Red HatのKVM仮想化製品（Red Hat Virtualization, OpenStack Platform, そしてOpenShift Virtualization)上でGuestOSとしてのRHELをVMとして建てる場合に使っても良いOS ImageがInternetに公開されています
    - 今回はRHEL7.9（[Red Hat Enterprise Linux 7.9 Update KVM Guest Image (20220222)](https://access.redhat.com/downloads/content/69/ver=/rhel---7/7.9/x86_64/product-software)）を使わせてもらいましょう。
    - 具体的なImageのURLは「今すぐダウンロードする」ボタンを右クリックしてURLをコピーすればOK。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3627586/3fef7d93-b1b4-b337-9287-8761033f69f4.png)

- YamlファイルをApplyする方法でVMを建ててみます。

# 下準備
- ROSAでOCPvが使えるようにしておく。
- NameSpace`virtual-machine`を作っておく。

# YAMLファイルを用意
- テンプレートはこちらを参考にしました。
    - [7.2. カスタムイメージからの仮想マシンの作成](https://access.redhat.com/documentation/ja-jp/openshift_container_platform/4.15/html/virtualization/creating-vms-from-custom-images#virt-creating-vms-from-web-images)
- 今回使うものを以下に示します。
```rhel79-20220222.yaml
apiVersion: kubevirt.io/v1
kind: VirtualMachine
metadata:
  labels: #管理しやすい名前をつけましょう！ 
    app: rhel79-20220222 
  name: rhel79-20220222
spec:
  dataVolumeTemplates:
  - apiVersion: cdi.kubevirt.io/v1beta1
    kind: DataVolume
    metadata:
      name: rhel79-20220222
    spec:
      source:
          http: #先程コピーしたKVM Guest ImageのURLを貼ります。
            url: https://access.cdn.redhat.com/content/origin/files/sha256/46/46ed32cbe8183930f2488972a6d13bae2053e23c2f8ab8afa4d6e6757e9a7130/rhel-server-7.9-update-12-x86_64-kvm.qcow2?user=fe5140068751d08a0afda5a8f472365e&_auth_=1714104535_5e34e2ddfde1452e0ff9a5bdb8d4ddd9
      storage:
        resources:
          requests: #永続ストレージの容量を指定します
            storage: 30Gi 
  running: true
  template:
    metadata:
      labels:
        kubevirt.io/domain: rhel79-20220222
    spec:
      architecture: amd64
      domain:
        cpu: #1ソケットあたりのCore数, ソケット数, スレッド数を指定します
          cores: 1 
          sockets: 2 
          threads: 1 
        devices:
          disks:
          - disk:
              bus: virtio
            name: rootdisk
          - disk:
              bus: virtio
            name: cloudinitdisk
        resources:
          requests: #メモリ容量です
            memory: 8Gi 
      evictionStrategy: LiveMigrate
      volumes:
          - dataVolume:
              name: rhel79-20220222
            name: rootdisk
          - cloudInitNoCloud: # RHELのuser/passwordを指定してます。お好きなものをどうぞ。
              userData: |-
                #cloud-config
                user: cloud-user
                password: 'cloud-password' 
                chpasswd: { expire: False }
            name: cloudinitdisk

```

# YAMLをApplyする
- NameSpace（Project)を指定して、上記のYAMLを以下コマンドで適用します。
```
oc project virtual-machine
oc apply -f rhel79-20220222.yaml
```
- もしくは、OpenShiftのコンソール画面からもYAMLのApplyが可能です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3627586/98ed0e0e-cdf8-25b0-41ba-791dab08cba0.png)
- 作成をクリック。

# VMが起動する
- 2分くらい待てば起動しました！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3627586/a010204b-e52f-b977-922c-8ea7a41a69db.png)
- 今回はRWXでProvisionしたPVを使っていないため、`Not migratable`ってなってます。
    - Live Migrationしたい場合は、OpenShift Data Foudation (ODF) 等のSDSを用いて、RWXでPVをProvisioningできるStorageClassが使える様にしてください。
    - なお、ROSAにおけるODFの利用は現在サポート対象外です。ご注意ください。

# VMにログインしてみる
- 先ほど設定したuser/passwordを使ってログインできるかやってみましょう。
    - user: cloud-user
    - password: cloud-password

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3627586/64b53dad-afa9-64e2-7193-9364a90f8fd2.png)
- できました。
# おわりに
- RHELをマイナーバージョンレベルで指定して、YAMLファイルから超簡単にVMを建ててみました。
- コンテナの世界におけるDeployent.yamlのApplyと同じ様な雰囲気で、VMをDeployできる感じがおわかり頂けたかと思います。