vSphere with Tanzu の VM Service を試してみる。(vSphere 7.0 U2a) - vm.gowatana.jp

vm.gowatana.jp

NEOにほんごVMware(仮)

vSphere with Tanzu の VM Service を試してみる。(vSphere 7.0 U2a)

vSphere 7.0 U2a の新機能である、スーパーバイザー クラスタでの Virtual Machine Service(VM Service)を試してみます。

 

今回の内容です。

 

VM Service とは

VM Service は、スーパーバイザー クラスタのもつ Kubernetes のリソースとして、仮想マシンを管理する機能です。仮想マシンの作成・削除などのライフサイクル管理で、vSphere スーパーバイザー クラスタの Kubernetes を利用します。

この仕組みで利用されている VM Operator for Kubernetes は、GitHub でも公開されました。これまでの vSphere with Tanzu でも、Tanzu Kubernetes Grid(TKG)Service の Kubernetes クラスタ ノードになる仮想マシンを VM Operator でデプロイしていました。しかし、7.0 U2a から、TKG に関係しない仮想マシンでも利用できるようになりました。

 

ドキュメントでは下記のあたりが参考になります。

 

下記のブログ、デモ リソースも参考になります。

 

今回の環境

今回は、構築ずみのスーパーバイザー クラスタを利用しています。

 

ソフトウェア バージョン

vCenter Server 7.0 U2a です。

f:id:gowatana:20210508223254p:plain

 

ESXi は 7.0 U2 で、スーパーバイザー クラスタを構成してあります。

f:id:gowatana:20210508223651p:plain

 

このラボのスーパーバイザー クラスタでは、ネットワーク スタックとして NSX-T 利用しています。ただし、VM Service は NSX-T なしでも利用できます。

スーパーバイザー クラスタの構築(ワークロード管理の有効化)は、下記のように実施ずみです。

 

スーパーバイザー名前空間

lab-ns-31 というスーパーバイザー名前空間を作成してあるので、ここに VM Service で を作成してみます。 

f:id:gowatana:20210508224409p:plain

 

コンテンツ ライブラリの準備

VM Service で利用する仮想マシンの OVA ファイルを、コンテンツ ライブラリに登録しておきます。

VM Service むけ OVA ファイルの用意

VM Service で利用する仮想マシン イメージの OVA ファイルは、VMware Marketplace からダウンロードしておきます。SIGN UP / SIGN IN すると、下記ページに「DOWNLOAD」ボタンが表示されます。

 

vSphere 7.0 U2a リリース時点では、CentOS Stream 8 の OVA(ファイル名は下記)のみが用意されています。

  • centos-stream-8-vmservice-v1alpha1-1619529007339.ova

 

2021/5/18 に、Ubuntu の OVA も公開されました。 

 

コンテンツ ライブラリ作成と OVA インポート

VMware Marketplace からダウンロードした OVA ファイルを、コンテンツ ライブラリにインポートしておきます。

今回は、cl-vmservice-01 というライブラリを作成しました。 OVA ファイルは、「アクション」→「アイテムのインポート」でインポートできます。

f:id:gowatana:20210508231405p:plain

 

スーパーバイザー クラスタの Pod CIDR は、「10.244.0.0/21」です。VM Service の仮想マシンにも、このレンジのサブネットから IP アドレスが払い出されます。

f:id:gowatana:20210509133309p:plain

 

スーパーバイザー名前空間での準備

名前空間に、VM Operator のマニフェスト(YAML)で指定する、ストレージ ポリシー、仮想マシン クラス、コンテンツ ライブラリを追加しておきます。

 

ストレージ ポリシーの追加

名前空間に、仮想マシン ストレージ ポリシーを追加します。これは、VM Operator では StorageClass として指定することになります。

ここで指定するポリシーは、仮想ディスクのデータストア配置を決定するために利用されます。ワークロード管理を有効化する際に作成しておいたもの(参考例)でも大丈夫です。

 

名前空間の「サマリ」→「ストレージ」にある、「ストレージの追加」をクリックします。

f:id:gowatana:20210508233414p:plain

 

ストレージ ポリシーを選択して、「OK」をクリックします。

f:id:gowatana:20210508233332p:plain

 

仮想マシン クラスの追加

名前空間に、仮想マシンのスペックを定義する仮想マシン クラスを追加します。これは、VM Operator では ViratulMachineClass として指定することになります。

 

名前空間の「サマリ」→「仮想マシン サービス」にある、「仮想マシン クラスの追加」をクリックします。

f:id:gowatana:20210508230135p:plain

 

この名前空間で利用する仮想マシン クラスを選択して、「OK」をクリックします。今回は、デフォルトで作成されている「best-effort-xsmall」を利用します。

f:id:gowatana:20210508230317p:plain

 

コンテンツ ライブラリの追加

名前空間に、コンテンツ ライブラリを追加します。これは、ライブラリにインポートした OVA を、VM Operator で ViratulMachineImage として指定するために必要です。

 

名前空間の「サマリ」→「仮想マシン サービス」にある、「コンテンツ ライブラリの追加」をクリックします。

f:id:gowatana:20210508233114p:plain

 

コンテンツ ライブラリを選択して「OK」をクリックします。

f:id:gowatana:20210508233211p:plain

 

スーパーバイザー クラスタへのログインとリソース確認

下記のように、kubectl 実行環境を用意して、スーパーバイザー クラスタにログインしておきます。

 

kubectl で、名前空間(lab-ns-31)に追加したリソースを確認しておきます。これらのリソースを、あとで YAML で指定します。

 

ストレージ ポリシーから作成された、StorageClass と ResourceQuota です。

$ kubectl get StorageClass
NAME                    PROVISIONER              RECLAIMPOLICY   VOLUMEBINDINGMODE   ALLOWVOLUMEEXPANSION   AGE
vm-storage-policy-wcp   csi.vsphere.vmware.com   Delete          Immediate           true                   21h
$ kubectl get ResourceQuota
NAME                     AGE    REQUEST                                                                                     LIMIT
lab-ns-31-storagequota   151m   vm-storage-policy-wcp.storageclass.storage.k8s.io/requests.storage: 0/9223372036854775807

 

仮想マシン クラスです。

$ kubectl get VirtualMachineClassBindings -A
NAMESPACE   NAME                 VIRTUALMACHINECLASS   AGE
lab-ns-31   best-effort-xsmall   best-effort-xsmall    143m

 

仮想マシン イメージ(インポートした OVA ファイル)です。

$ kubectl get VirtualMachineImage
NAME                                                         VERSION                           OSTYPE                FORMAT   AGE
centos-stream-8-vmservice-v1alpha1-1619529007339                                               centos8_64Guest       ovf      147m
ob-15957779-photon-3-k8s-v1.16.8---vmware.1-tkg.3.60d2ffd    v1.16.8+vmware.1-tkg.3.60d2ffd    vmwarePhoton64Guest   ovf      154m
ob-16466772-photon-3-k8s-v1.17.7---vmware.1-tkg.1.154236c    v1.17.7+vmware.1-tkg.1.154236c    vmwarePhoton64Guest   ovf      154m
ob-16545581-photon-3-k8s-v1.16.12---vmware.1-tkg.1.da7afe7   v1.16.12+vmware.1-tkg.1.da7afe7   vmwarePhoton64Guest   ovf      154m
ob-16551547-photon-3-k8s-v1.17.8---vmware.1-tkg.1.5417466    v1.17.8+vmware.1-tkg.1.5417466    vmwarePhoton64Guest   ovf      154m
ob-16897056-photon-3-k8s-v1.16.14---vmware.1-tkg.1.ada4837   v1.16.14+vmware.1-tkg.1.ada4837   vmwarePhoton64Guest   ovf      154m
ob-16924026-photon-3-k8s-v1.18.5---vmware.1-tkg.1.c40d30d    v1.18.5+vmware.1-tkg.1.c40d30d    vmwarePhoton64Guest   ovf      154m
ob-16924027-photon-3-k8s-v1.17.11---vmware.1-tkg.1.15f1e18   v1.17.11+vmware.1-tkg.1.15f1e18   vmwarePhoton64Guest   ovf      154m
ob-17010758-photon-3-k8s-v1.17.11---vmware.1-tkg.2.ad3d374   v1.17.11+vmware.1-tkg.2.ad3d374   vmwarePhoton64Guest   ovf      154m
ob-17332787-photon-3-k8s-v1.17.13---vmware.1-tkg.2.2c133ed   v1.17.13+vmware.1-tkg.2.2c133ed   vmwarePhoton64Guest   ovf      154m
ob-17419070-photon-3-k8s-v1.18.10---vmware.1-tkg.1.3a6cd48   v1.18.10+vmware.1-tkg.1.3a6cd48   vmwarePhoton64Guest   ovf      154m
ob-17654937-photon-3-k8s-v1.18.15---vmware.1-tkg.1.600e412   v1.18.15+vmware.1-tkg.1.600e412   vmwarePhoton64Guest   ovf      154m
ob-17658793-photon-3-k8s-v1.17.17---vmware.1-tkg.1.d44d45a   v1.17.17+vmware.1-tkg.1.d44d45a   vmwarePhoton64Guest   ovf      154m
ob-17660956-photon-3-k8s-v1.19.7---vmware.1-tkg.1.fc82c41    v1.19.7+vmware.1-tkg.1.fc82c41    vmwarePhoton64Guest   ovf      154m
ob-17861429-photon-3-k8s-v1.20.2---vmware.1-tkg.1.1d4f79a    v1.20.2+vmware.1-tkg.1.1d4f79a    vmwarePhoton64Guest   ovf      154m

 

cloud-init User-Data の用意

VM Operator でのゲスト OS 設定には、cloud-init を利用します。

今回は、次のような User-Data を用意しておきます。

  • demo ユーザを作成。パスワードなしで sudo 実行できるようにする。
  • demo ユーザのパスワードは VMware1!
  • SSH のパスワード認証を許可。
  • タイムゾーンを Asia/Tokyo に変更。

gist.github.com

 

User-Data は、Base64 形式に変換しておきます。

$ cat lab-centos-vm-01.userdata | base64
I2Nsb3VkLWNvbmZpZwp1c2VyczoKICAtIG5hbWU6IGRlbW8KICAgIHNoZWxsOiAvYmluL2Jhc2gK
ICAgIHN1ZG86IEFMTD0oQUxMKSBOT1BBU1NXRDpBTEwKY2hwYXNzd2Q6CiAgICBsaXN0OiB8CiAg
ICAgIGRlbW86Vk13YXJlMSEKICAgIGV4cGlyZTogZmFsc2UKc3NoX3B3YXV0aDogeWVzCnJ1bmNt
ZDoKICAtIHRpbWVkYXRlY3RsIHNldC10aW1lem9uZSBBc2lhL1Rva3lvCgo=

 

マニフェスト(YAML ファイル)の作成

仮想マシン(VirtualMachine)、OVF のオプションを指定する ConfigMap、仮想マシンに接続するロードバランサ(VirtualMachineService)の YAML を作成しておきます。

 

ConfigMap

仮想マシン イメージに渡す OVF パラメータの、ConfigMap のマニフェストを作成しておきます。

  • hostname: ゲスト OS のホスト名を指定。
  • user-data: cloud-init の User-Data を、Base64 エンコードで記載。

gist.github.com

 

ちなみに、ssh_authorized_keys で SSH の公開鍵を登録できますが、今回はデモ環境として扱いやすいように、あえてパスワード認証にしています。

 

VirtualMachine

仮想マシンのマニフェストを作成しておきます。

  • 仮想マシン名: lab-centos-vm-01
  • 仮想マシン イメージ: centos-stream-8-vmservice-v1alpha1-1619529007339
  • 仮想マシン クラス: best-effort-xsmall
  • ストレージ クラス: vm-storage-policy-wcp
  • vNIC を接続するネットワーク: NSX-T
  • vmMetadata で、ConfigMap configmap-lab-centos-vm-01 を指定。

gist.github.com

 

ちなみに、NSX-T を利用していない場合は、ネットワークの指定は下記のようになります。

  • networkType: vsphere-distributed
  • networkName:  ワークロード管理の有効化の際に作成したネットワークを指定する。(kubectl get network で確認できる名前を指定する)

 

VirtualMachineService

NSX-T を利用するスーパーバイザー名前空間では、仮想マシンには Pod CIDR のレンジから IP アドレスが払い出されます。NSX-T 外部から仮想マシンに接続するため、ロードバランサを作成しておきます。

  • ロードバランサのポート: SSH(TCP/22)
  • demo: vm-service-01 ラベルで、VirtualMachine リソースと紐づけする。

gist.github.com

 

ちなみに、VM Service で作成した仮想マシンに接続確認するには、同じ名前空間の vSphere Pod や、同じ NSX-T のセグメントに接続した仮想マシンも利用できます。作成した仮想マシンには、直接接続できるネットワーク構成であれば、VirtualMachineService を作成しなくても接続できます。

 

デモ用の YAML ファイル

ここまでの VirtualMachine、ConfigMap、VirtualMachineService をまとめて、下記のように YAML ファイルを作成しておきます。

 

リソースの作成

それでは、Kubernetes のリソースとして仮想マシンと関連リソースを作成します。

スーパーバイザー クラスタにログインしてある状態で、kubectl apply により、YAML ファイルをもとにリソースを作成します。

$ kubectl apply -f vm_service_demo_lab-centos-vm-01.yml
configmap/configmap-lab-centos-vm-01 created
virtualmachine.vmoperator.vmware.com/lab-centos-vm-01 created
virtualmachineservice.vmoperator.vmware.com/svc-lab-centos-vm-01 created

 

仮想マシンの確認の確認

仮想マシンの様子を確認してみます。

 

vSphere Client での確認

vSphere Client では、タスク情報などで仮想マシンが作成される様子を確認できます。

仮想マシンのデプロイが開始されない場合は、YAML の内容など(VirtualMachine リソースでの ConfigMap 名の指定が正しいか、など)を確認します。

f:id:gowatana:20210509125318p:plain


仮想マシンは、デプロイ後にパワーオンされます。cloud-init の処理が完了するのを待ちます。

f:id:gowatana:20210509125416p:plain

 

作成された仮想マシンは、NSX-T のオーバーレイ セグメントが割り当てられています。DHCP により、Pod CIDR から IP アドレス(10.244.0.34)が設定されています。

f:id:gowatana:20210509125610p:plain

 

kubectl での確認

仮想マシンは、VirtualMachine リソースとして確認できます。

$ kubectl config current-context
lab-ns-31
$ kubectl get VirtualMachine
NAME               POWERSTATE   AGE
lab-centos-vm-01   poweredOn    6m22s

VirtualMachine は、vm に省略できます。

$ kubectl get vm
NAME               POWERSTATE   AGE
lab-centos-vm-01   poweredOn    6m24s

VirtualMachineService を作成すると、Service リソースも作成されます。ここでは EXTERNAL-IP として 192.168.70.35 が割り当てられました。

$ kubectl get VirtualMachineService
NAME                   TYPE           AGE
svc-lab-centos-vm-01   LoadBalancer   6m28s
$ kubectl get service
NAME                   TYPE           CLUSTER-IP    EXTERNAL-IP     PORT(S)        AGE
svc-lab-centos-vm-01   LoadBalancer   10.96.0.140   192.168.70.35   22:31449/TCP   7m1s

SSH での接続確認

作成された仮想マシンに、SSH でログインしてみます。

今回作成した仮想マシンには、cloud-init で SSH でのパスワードなし認証を設定してあります。さらに、VirtualMachineService で TCP/22 ポートのロードバランサを作成してあります。

 

cloud-init で作成した demo ユーザで、SSH ログインしてみます。接続先アドレスは、ロードバランサの EXTERNAL-IP(192.168.70.35)です。

$ ssh demo@192.168.70.35
The authenticity of host '192.168.70.35 (192.168.70.35)' can't be established.
ECDSA key fingerprint is SHA256:jf+mFvQiW4BjVLUct5mPKozOjoXKLBaLzDLjD+IRgmE.
ECDSA key fingerprint is MD5:23:ee:53:fe:23:b8:1e:48:13:0a:62:59:59:c7:d8:ae.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.70.35' (ECDSA) to the list of known hosts.
demo@192.168.70.35's password: ★パスワード入力。
[demo@lab-centos-vm-01 ~]$
[demo@lab-centos-vm-01 ~]$ cat /etc/centos-release
CentOS Stream release 8

 

ゲスト OS の IP アドレスは、vSphere Client に表示されているとおり、10.244.0.34 が設定されています。

[demo@lab-centos-vm-01 ~]$ ip address show dev ens192
2: ens192: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 04:50:56:00:90:03 brd ff:ff:ff:ff:ff:ff
    inet 10.244.0.34/28 brd 10.244.0.47 scope global noprefixroute ens192
       valid_lft forever preferred_lft forever
    inet6 fe80::650:56ff:fe00:9003/64 scope link noprefixroute
       valid_lft forever preferred_lft forever

 

タイムゾーンも cloud-init により Asia/Tokyo の JST になっています。ちなみにデフォルトだと EDT です。

[demo@lab-centos-vm-01 ~]$ date
Sun May  9 11:30:26 JST 2021

 

以上、VM Service で仮想マシンを作成してみる話でした。