はじめまして。VMware の伊藤です。Tanzu 製品のプラットフォームアーキテクトとして働いており、開発と運用双方の経験があります。この記事では vSphere with Tanzu の「VM Service」という機能で仮想マシンをK8s流(kubectl)に操作する方法を紹介します。
コンテナ利用者のかたには周知の事実かもしれませんが、「コンテナは仮想マシンを置き換えるものではない」ということを聞いたことがあるかと思います。一番わかりやすい違いとしては「コンテナは同一ホスト上でカーネルを共有している」ということや「コンテナ上のデータには永続性がない」などが挙げられます。つまり「コンテナに適したワークロードはある」一方で「仮想マシンに適したワークロードは残り続ける」という事実があります。
ただ、コンテナの運用に慣れているユーザーから見ると、従来からの仮想マシンの運用は面倒くさいものかもしれません。たとえば VMware の vSphere やパブリッククラウドの IaaS 基盤は GUI 操作が基本であり、「似た操作をなんども繰り返す」というのはなかなかの苦痛です。繰り返し操作をしやすくするために API や CLI を採用することもできますが、その使い方を環境ごとに覚えるのも大変です。
vSphere with Tanzu が提供する VM Service という機能は、この「仮想マシンの運用は必要だけど、その操作が面倒」というコンテナ経験者のための仮想マシン管理ソリューションです。仮想マシンを作成したり、変更したり、削除したりといった操作を kubectl コマンドと YAML ファイルの定義ファイルで実現できます。
この記事では以下の順で VM Service の利用法を紹介します。
- コンテンツライブラリに VM Service で使う仮想マシンテンプレートの登録
- ネームスペースで上記コンテンツライブラリと仮想マシンサイズ設定を定義
- VM Service で構築する仮想マシンの YAML 設定ファイルの用意
- kubectl と YAML 設定ファイルを利用した仮想マシンの作成/変更/削除
公式ドキュメントとしては vSphere with Tanzu の配下にある以下のページが VM Service トップとなります。
なお、VM Service はライセンス的には vSphere with Tanzu と同じく Tanzu Basic から利用可能です。vSphere with Tanzu のネットワークも NSX-T 構成でも NSX-ALB 構成でも利用可能です。
vSphere with Tanzu への仮想マシンテンプレートの登録
VM Service の機能を利用するには「vSphere 7.0 u2a」以上の vSphere 上に構築された vSphere with Tanzu が必要です。無印の「vSphere 7.0 u2」はサポートしていませんのでご注意ください。vSphere with Tanzu のセットアップが完了していたら、VM Service を利用するための準備はほとんどいりません。
VM Service の設定は各ネームスペースごとに実施するのですが、VM Service で展開する仮想マシンのテンプレートを vSphere に登録する作業のみは全ネームスペース共有の作業です。この作業は「VMware から Base OS イメージを取得する。取得したイメージを VM Service が使うコンテンツライブラリーに登録」という流れです。
この作業は以下のドキュメントに詳細があります。
まず前者のドキュメントに沿って、VM Service のイメージを登録するコンテンツライブラリを作成します。具体的には以下の手順となります。
- メニューからコンテンツライブラリを選択
- コンテンツライブラリの作成
- コンテンツライブラリの名前(今回は vm-service とした)とvCenterを選択
- 次ページへ進み、ローカルコンテンツライブラリを選択
- 次ページを進み、ストレージで使うデータストアを選択
- 作成終了
この作業が済んだら、後者のドキュメントに沿って「 VMware Cloud Marketplace」から、仮想マシンサービスイメージ(VM Service image)を検索します。以下のように検索欄に「VM Service Image」と入力すると候補が表示されますので、ページを進めてOVFイメージを入手してください。今回は Ubuntu と CentOS の両方を入手しています。
入手できたら、以下の手順でコンテンツライブラリにイメージを追加します。
- 作成したコンテンツライブラリをクリックして選択
- アクションから「アイテムのインポート」を選択
- 上記のダウンロードしたOVFイメージを選択
- インポート
これでコンテンツライブラリの準備は完了しました。この操作は vSphere with Tanzu につき一回のみで問題ありませんが、今後新しい VM Service 用のイメージが出てきた場合はOVFの追加作業は必要となります。また、将来的にユーザーが作成したカスタムイメージをベース OS に登録できるようにする計画があります。
ネームスペースごとの VM Service の設定
各ネームスペースでは管理者がどれぐらいのリソースを利用できるかといったことを定義しています。VM Service で利用可能な「ベース OS イメージを持つコンテンツライブラリ」と「展開する VM のマシンスペック」に関する設定を VM Service を利用するネームスペースごとに設定します。
この作業の起点は以下となります。
このページの右下から、対象となるイメージを持つコンテンツライブラリにチェックをいれます。そして、マシンスペック(VM Classes)で有効化するものにチェックをいれます。この図にあるスペックは事前定義されているものですが、自分でカスタム値を設定することもできます。
以上でネームスペース上での設定は終了となります。
VM Service で展開する仮想マシンの設定ファイルの準備
事前準備が終了したので、ここからは仮想マシンを展開するための定義の準備となります。純粋な K8s でいうところの Deployment/Pod などのリソース定義 YAML の作成相当の仕事です。
まず、設定ファイルの全体像ですが、以下となります。
- Cloud-Init の設定ファイル: 仮想マシン起動後のカスタマイズ内容を定義
- Config Map: K8s のリソース。上記 Cloud-Init の内容を k8s で取り込むため
- VM 自体の設定ファイル: 仮想マシンの名前やスペックを定義。上記の Config Map も参照
ここでは「docker がインストールされた ubuntu を用意する」というシナリオで設定ファイルを作成します。
Cloud-Init はパブリッククラウドでよく利用されている仮想マシン構築を自動化する標準化された手法です。Cloud-Init 自体の使い方は覚えるしかないのですが、検索すればサンプルなどがヒットしますし、スクラッチで書くのではなく既存の定義ファイルを変更する形で書けば負担は少ないです。
Ubuntu に docker をインストールしつつ、パスワードログインと鍵でログインできるように設定します。
この Cloud-Init を Config Map 化します。作業の流れとしては、以下の流れとなります。
- Cloud-Init を base64 でエンコード
- Config Map のリソースを書く
- Config Map のフィールドに Cloud-Init の base64 のデータを書き込む
まず、ファイルの内容を base64 でエンコードします。エンコードの実施方法はプラットフォームにより異なりますが、Ubuntu の場合は「base64 -w 0」とすると表示改行なしでエンコードしてくれます。
このようにして作成したデータを使って Config Map に書きます。
Config Map が作成できたら、次に仮想マシンの YAML ファイルを書きます。仮想マシンのスペック情報に加えて、さきほど作成した Config Map を指定します。
なお、この VM の設定のなかでネットワークやストレージになにをつかうかといった情報が必要となりますが、それは vSphere with Tanzu の管理画面から確認できます。
これでファイルとしての準備は完了しました。設定ファイルの準備は1ショットだと面倒なのですが、似た構成をなんども作成する際に差分だけでよくなります。そのため、長期的な運用や、自動化のソリューションと相性がよいです。
VM Service で仮想マシンを展開
設定ファイルさえできてしまえば、仮想マシンの展開は簡単です。おおまかな流れは以下となります。
- vSphere with Tanzu のネームスペースにログイン
- コンテキストをネームスペースにする
- kubectl で ConfigMap を展開
- kubectl で VM を展開
vSphere with Tanzu の復習も兼ねて、上記の1から実施するサンプルを記載します。
ログインに関してはコマンドが多くて面倒なので、1コマンドを発行するだけのスクリプト化することをおすすめします。上記操作をすると、すぐに vSphere で仮想マシンの作成が開始されます。
パワーオンされた後も Cloud-Init での初期化が裏で続いているので、設定が全て反映されるまでは少し時間がかかります。今回の vSphere with Tanzu クラスタはテスト用のネスト構成なのでかなり非力です。本番環境はもっと速いかと思いますが、およそ VM 起動に2分と、VM起動後の初期設定に1分程度かかっています。
3分ほど待って vSphere 画面か、kubectl で仮想マシンの IP を確認し、Cloud-Init で設定した鍵情報でログインできることが確認できました。Cloud-init で書いたように docker もインストール済みです。
VM Service で仮想マシンの変更と削除
作成した仮想マシンは kubectl で操作可能です。ここでは状態変更として電源を Off にしてみます。やりかたは簡単で、さきほど作成した YAML ファイルに書かれる電源状態を更新して、再度 kubectl でアプライするだけです。もちろん、Pod のようにファイルではなくコマンドベースで状態変更してもかまいません。
最後にこの仮想マシンを削除します。削除も kubernetes 流にリソースファイルを指定して「kubectl delete -f <ファイル名>」 でできます。「kubectl delete vm <VM名>」でも消せます。
以上で VM Service の基本機能の紹介を終えます。ご拝読ありがとうございました。