OpenShiftで仮想マシンを扱うOpenShift VirtualizationをAWSで動かす(1)

 
本日の記事はOpenShiftで仮想マシンを扱うことが出来るOpenShift VirtualizationをAWS上にデプロイし、AWSのベアメタルインスタンスで仮想マシンを扱ってみたいと思います。
アップストリームプロジェクトはKubeVirtになっています。本記事の内容は本記事執筆時にはTechnical Previewのサポート状況であり本番で利用することはできません。
軽快に検証できる点を重視して記事を提供致します。
  • OpenShift Virtualizationのデプロイしてテストインスタンスを立ち上げる
  • プラットフォームはAWSを使用
  • OpenShiftインストールメソッドはIPI
  • ストレージにはOpenShift Data Foundationを使用
  • 2つMachineSetを作成しODF、OCP-V用ノードを追加
  • 何らかのOpenShiftのサブスクリプションを所有されていることが前提
  • マイグレーションなど機能のテストは次回

TOC

はじめに

コンテナプラットフォームの上で仮想マシンを動かす。そんな謎ソリューションが気になってくしゃみが止まらなくなった日はありませんか?私は年々ひどくなる花粉症に理由を付けて現実逃避をする日々が続いております。
クラウドインフラ全般を担当しているソリューションアーキテクトの伊藤です。
 
こちらのKBでOpenShift VirtualizationをAWS上にデプロイするナレッジが公開されています。

access.redhat.com


最近リリースされたOpenShift 4.10にアドオンできるOpenShift Virtualization 4.10のリリースノートに、「OpenShift VirtualizationのワーカーノードにAWSのBaremetalノードを使用することについてはTechPreviewです」と明記されるようになりました。実は以前からデプロイは出来たのですが、今回ドキュメントに明記されたことから、本記事では実際に行ってみたいと思います。
#仮想マシンにはRWX属性を持った共有ストレージが必要であるため、OpenShift Data Foundationも同時にデプロイします。
 
今回デプロイするのはこの構成(最小構成、シングルAZ)
  1.  Masterノード (3nodes, m5.2xlarge)
  2.  標準のWorkerノード (2nodes, m6i.large)
  3.  ストレージ用のODF Workerノード (3nodes, m6i.4xlarge)
  4.  仮想マシンを動かすベアメタルWorkerノード (2nodes, m5.metal)
1と2はopenshift-installerによって初期にデプロイされます。
3と4は初期デプロイが完了したあと、machinesetを作成してノードを拡張します。

OpenShiftをAWS IPIでインストール

access.redhat.com

基本は上記のクイックインストールの通りですが、費用削減とテストのためAZを1つに絞ります。
アカウント設定
AWS CLIが使えるIAMアカウントを作成してください。
アカウント確認
AWS CLIを叩いたときに意図したアカウントであるか確認してください。
OpenShift CLIダウンロード

console.redhat.com

上記のURLからOpenShift installerとCommand line interfaceを両方最新をDLして展開します。
インストールコンフィグの作成

mkdir aws4103 #クラスタ毎にディレクトリを作ることをお勧めします。

openshift-isntall create install-config #以下のインタラクティブが行われます。

SSH公開鍵、プラットフォーム、リージョン、ベースドメイン、クラスタ名、pullsecretの6つを指定します。そして生成されたinstall-config.yamlファイルを以下のdiffの様に書き換えます。
[takitou@takuya-PC aws410]$ diff -uda install-config.yaml.org install-config.yaml
--- install-config.yaml.org 2022-03-28 13:59:53.296185800 +0900
+++ install-config.yaml 2022-03-28 14:03:13.925747800 +0900
@@ -4,13 +4,20 @@
- architecture: amd64
hyperthreading: Enabled
name: worker
- platform: {}
- replicas: 3
+ platform:
+ aws:
+ zones:
+ - ap-northeast-1d
+ replicas: 2
controlPlane:
architecture: amd64
hyperthreading: Enabled
name: master
- platform: {}
+ platform:
+ aws:
+ zones:
+ - ap-northeast-1d
+ type: m5.2xlarge
replicas: 3
metadata:
creationTimestamp: null
[takitou@takuya-PC aws410]$
 
デプロイ実行
[takitou@takuya-PC aws410]$ openshift-install create cluster --dir . --log-level=debug
特に問題なければクラスタ作成コマンドを実行し、40分弱でクラスタがデプロイされて管理者のログインパスワードが表示されます。
INFO To access the cluster as the system:admin user when using 'oc', run 'export KUBECONFIG=/home/takitou/aws410/auth/kubeconfig'
INFO Login to the console with user: "kubeadmin", and password: "1234-5678-9012-3456"
デプロイ完了を確認
export KUBECONFIG=./auth/kubeconfig
oc get co
oc get machines -n openshift-machine-api

Cluster Operatorが全てAvailable: Ture, Degraded: Falseになっていることを確認します。

MachineSet作成してODFノード(ストレージ用)、Baremetalノード(OCP Virtualization用親ノード)追加

マシンセットの作成は以下のドキュメントを参考にします。
oc get machineset -n openshift-machine-api
NAME DESIRED CURRENT READY AVAILABLE AGE
ocpv-rskd2-worker-ap-northeast-1d 2 2 2 2 34m
oc get machineset -n openshift-machine-api  ocpv-rskd2-worker-ap-northeast-1d -o yaml > ocpv-odf-apne-1d.yaml

ODFノード用のMachineSetの定義は以下のdiffのように変更

[takitou@takuya-PC aws410]$ diff -uda ocpv-worker-apne-1d.yaml ocpv-odf-apne-1d.yaml
--- ocpv-worker-apne-1d.yaml    2022-03-28 14:51:47.205147700 +0900
+++ ocpv-odf-apne-1d.yaml       2022-03-28 14:55:15.593765900 +0900
@@ -1,34 +1,35 @@
 apiVersion: machine.openshift.io/v1beta1
 kind: MachineSet
 metadata:
-  annotations:
-    machine.openshift.io/GPU: "0"
-    machine.openshift.io/memoryMb: "8192"
-    machine.openshift.io/vCPU: "2"
-  creationTimestamp: "2022-03-28T05:16:55Z"
-  generation: 1
   labels:
     machine.openshift.io/cluster-api-cluster: ocpv-rskd2
-  name: ocpv-rskd2-worker-ap-northeast-1d
+  name: ocpv-rskd2-odf-ap-northeast-1d
   namespace: openshift-machine-api
-  resourceVersion: "23688"
-  uid: 8bbed1d2-3ce9-43bb-b412-a330fac4df2c
 spec:
-  replicas: 2
+  replicas: 3
   selector:
     matchLabels:
       machine.openshift.io/cluster-api-cluster: ocpv-rskd2
-      machine.openshift.io/cluster-api-machineset: ocpv-rskd2-worker-ap-northeast-1d
+      machine.openshift.io/cluster-api-machineset: ocpv-rskd2-odf-ap-northeast-1d
   template:
     metadata:
       labels:
         machine.openshift.io/cluster-api-cluster: ocpv-rskd2
         machine.openshift.io/cluster-api-machine-role: worker
         machine.openshift.io/cluster-api-machine-type: worker
-        machine.openshift.io/cluster-api-machineset: ocpv-rskd2-worker-ap-northeast-1d
+        machine.openshift.io/cluster-api-machineset: ocpv-rskd2-odf-ap-northeast-1d
     spec:
       lifecycleHooks: {}
-      metadata: {}
+      taints:
+      - effect: NoSchedule
+        key: node.ocs.openshift.io/storage
+        value: "true"
+      metadata:
+        creationTimestamp: null
+        labels:
+          node-role.kubernetes.io/worker: ""
+          node-role.kubernetes.io/infra: ""
+          cluster.ocs.openshift.io/openshift-storage: ""
       providerSpec:
         value:
           ami:
@@ -47,7 +48,7 @@
           deviceIndex: 0
           iamInstanceProfile:
             id: ocpv-rskd2-worker-profile
-          instanceType: m6i.large
+          instanceType: m6i.4xlarge
           kind: AWSMachineProviderConfig
           metadata:
             creationTimestamp: null
@@ -69,9 +70,3 @@
             value: owned
           userDataSecret:
             name: worker-user-data
-status:
-  availableReplicas: 2
-  fullyLabeledReplicas: 2
-  observedGeneration: 1
-  readyReplicas: 2
-  replicas: 2
[takitou@takuya-PC aws410]$
続いて、Baremetalノード用のMachineSetを作成します。
oc get machineset -n openshift-machine-api  mymetal-dqhvp-worker-ap-northeast-1d -o yaml > ocpv-metal-apne-1d.yaml
Baremetalノード用のMachineSetの定義は以下のdiffのように変更
[takitou@takuya-PC aws410]$ diff -uda ocpv-worker-apne-1d.yaml ocpv-metal-apne-1d.yaml
--- ocpv-worker-apne-1d.yaml    2022-03-28 14:51:47.205147700 +0900
+++ ocpv-metal-apne-1d.yaml     2022-03-28 14:56:54.514627400 +0900
@@ -1,34 +1,29 @@
 apiVersion: machine.openshift.io/v1beta1
 kind: MachineSet
 metadata:
-  annotations:
-    machine.openshift.io/GPU: "0"
-    machine.openshift.io/memoryMb: "8192"
-    machine.openshift.io/vCPU: "2"
-  creationTimestamp: "2022-03-28T05:16:55Z"
-  generation: 1
   labels:
     machine.openshift.io/cluster-api-cluster: ocpv-rskd2
-  name: ocpv-rskd2-worker-ap-northeast-1d
+  name: ocpv-rskd2-metal-ap-northeast-1d
   namespace: openshift-machine-api
-  resourceVersion: "23688"
-  uid: 8bbed1d2-3ce9-43bb-b412-a330fac4df2c
 spec:
   replicas: 2
   selector:
     matchLabels:
       machine.openshift.io/cluster-api-cluster: ocpv-rskd2
-      machine.openshift.io/cluster-api-machineset: ocpv-rskd2-worker-ap-northeast-1d
+      machine.openshift.io/cluster-api-machineset: ocpv-rskd2-metal-ap-northeast-1d
   template:
     metadata:
       labels:
         machine.openshift.io/cluster-api-cluster: ocpv-rskd2
         machine.openshift.io/cluster-api-machine-role: worker
         machine.openshift.io/cluster-api-machine-type: worker
-        machine.openshift.io/cluster-api-machineset: ocpv-rskd2-worker-ap-northeast-1d
+        machine.openshift.io/cluster-api-machineset: ocpv-rskd2-metal-ap-northeast-1d
     spec:
       lifecycleHooks: {}
-      metadata: {}
+      metadata:
+        creationTimestamp: null
+        labels:
+          node-role.kubernetes.io/worker: ""
       providerSpec:
         value:
           ami:
@@ -47,7 +42,7 @@
           deviceIndex: 0
           iamInstanceProfile:
             id: ocpv-rskd2-worker-profile
-          instanceType: m6i.large
+          instanceType: m5.metal
           kind: AWSMachineProviderConfig
           metadata:
             creationTimestamp: null
@@ -69,9 +64,3 @@
             value: owned
           userDataSecret:
             name: worker-user-data
-status:
-  availableReplicas: 2
-  fullyLabeledReplicas: 2
-  observedGeneration: 1
-  readyReplicas: 2
-  replicas: 2
[takitou@takuya-PC aws410]$
作成したマニフェストをOpenShiftクラスタに適用します。
oc create -f ocpv-odf-apne-1d.yaml
oc create -f ocpv-metal-apne-1d.yaml
AWSのクラウドAPIを叩いて実際にノードを作成するため少し時間が掛かります。適用したことを確認します。
oc get machine -n openshift-machine-api
oc get machineset -n openshift-machine-api

これでODFとOpenShift Virtualization用のノードがデプロイできました。

Operatorインストール (ODF)

OperatorHubでODFを検索しクリックします。

特に変更なくインストールを行います。

インストールが完了したら、同時にOpenShift Virtualization Operatorもインストールします。

Storage System CR作成

次にODFのカスタムリソースであるStorage Systemを作成し、ストレージクラスタを構成します。

提供されるAPIのStorage Systemをクリックします。

1については特に変更なく進みます。

2の容量およびノードについては、MachineSetを作成するためのマニフェストにラベルを付与していましたので、デフォルトで対象のノードが選択された状態になっています。このまま進みます。

セキュリティおよびネットワークについても特に変更点ありません。このまま進めてStorage Systemを作成していまいます。

作成が完了すると、ODFのコンソールが確認できるようになります。
デフォルト ストレージクラスの変更
ODFでStorage Systemを作成してから、OpenShift VirtualizationのHyper Converged CRを作成するまでの間に行う重要なことがあります。
デフォルトのStorage ClassをODFで作成した ocs-storagecluster-ceph-rbdに変更します。
この変更によって、この後作成するHyper Converged CRによって仮想マシンテンプレートのOSイメージ保存先が変更されます。デフォルトの gp2だとRWX属性ではないため、gp2で作成された仮想マシンでライブマイグレーションが実施できません。

HCO CR作成

続いて、HyperConveged CRも作成します。内容はデフォルトのままで問題ありません。

Administratorパースペクティブに仮想化のビューが出現しました。

仮想インスタンスの立ち上げ

なんと!OpenShift 4.10から、いくつかの仮想マシンのテンプレートにブートソース(OSイメージ)がデフォルトで設定されるようになりました。
特にコンフィグレーションを変更していない場合は、このブートソースのOSイメージは常に最新を目指します。機能追加、脆弱性修正などで新しいパッチバージョンがリリースされた場合、これに追従します。

ブートソースのPVのストレージクラスがデフォルトで指定したocs-storagecluster-ceph-rbdであることが確認できます。

 

最後にOpenShiftで仮想マシンが立ち上げられることを確認します。

次回

次回は実際にマイグレーションなどの機能を確認して使ってみようと思います。
 
 
 

* 各記事は著者の見解によるものでありその所属組織を代表する公式なものではありません。その内容については非公式見解を含みます。