vSphere 7.0 U2a の新機能である、スーパーバイザー クラスタでの Virtual Machine Service(VM Service)を試してみます。
今回の内容です。
- VM Service とは
- 今回の環境
- コンテンツ ライブラリの準備
- スーパーバイザー名前空間での準備
- スーパーバイザー クラスタへのログインとリソース確認
- cloud-init User-Data の用意
- マニフェスト(YAML ファイル)の作成
- リソースの作成
- 仮想マシンの確認の確認
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 です。
ESXi は 7.0 U2 で、スーパーバイザー クラスタを構成してあります。
このラボのスーパーバイザー クラスタでは、ネットワーク スタックとして NSX-T 利用しています。ただし、VM Service は NSX-T なしでも利用できます。
スーパーバイザー クラスタの構築(ワークロード管理の有効化)は、下記のように実施ずみです。
スーパーバイザー名前空間
lab-ns-31 というスーパーバイザー名前空間を作成してあるので、ここに VM Service で を作成してみます。
コンテンツ ライブラリの準備
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 ファイルは、「アクション」→「アイテムのインポート」でインポートできます。
スーパーバイザー クラスタの Pod CIDR は、「10.244.0.0/21」です。VM Service の仮想マシンにも、このレンジのサブネットから IP アドレスが払い出されます。
スーパーバイザー名前空間での準備
名前空間に、VM Operator のマニフェスト(YAML)で指定する、ストレージ ポリシー、仮想マシン クラス、コンテンツ ライブラリを追加しておきます。
ストレージ ポリシーの追加
名前空間に、仮想マシン ストレージ ポリシーを追加します。これは、VM Operator では StorageClass として指定することになります。
ここで指定するポリシーは、仮想ディスクのデータストア配置を決定するために利用されます。ワークロード管理を有効化する際に作成しておいたもの(参考例)でも大丈夫です。
名前空間の「サマリ」→「ストレージ」にある、「ストレージの追加」をクリックします。
ストレージ ポリシーを選択して、「OK」をクリックします。
仮想マシン クラスの追加
名前空間に、仮想マシンのスペックを定義する仮想マシン クラスを追加します。これは、VM Operator では ViratulMachineClass として指定することになります。
名前空間の「サマリ」→「仮想マシン サービス」にある、「仮想マシン クラスの追加」をクリックします。
この名前空間で利用する仮想マシン クラスを選択して、「OK」をクリックします。今回は、デフォルトで作成されている「best-effort-xsmall」を利用します。
コンテンツ ライブラリの追加
名前空間に、コンテンツ ライブラリを追加します。これは、ライブラリにインポートした OVA を、VM Operator で ViratulMachineImage として指定するために必要です。
名前空間の「サマリ」→「仮想マシン サービス」にある、「コンテンツ ライブラリの追加」をクリックします。
コンテンツ ライブラリを選択して「OK」をクリックします。
スーパーバイザー クラスタへのログインとリソース確認
下記のように、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 に変更。
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 エンコードで記載。
ちなみに、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 を指定。
ちなみに、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 リソースと紐づけする。
ちなみに、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 名の指定が正しいか、など)を確認します。
仮想マシンは、デプロイ後にパワーオンされます。cloud-init の処理が完了するのを待ちます。
作成された仮想マシンは、NSX-T のオーバーレイ セグメントが割り当てられています。DHCP により、Pod CIDR から IP アドレス(10.244.0.34)が設定されています。
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 で仮想マシンを作成してみる話でした。