KubeVirtはアプリケーションを仮想マシンで動作させるため、LinuxだけでなくWindowsなども動かすことができます。
近年のWindowsはコマンドベースによるアクセスも色々とできるようになってはいますが、まだまだWindowsはGUIで操作する方が多いと思います。そこで、KubeVirtで起動した仮想マシンで動くWindowsにRDPプロトコルを使ってリモートアクセスする方法をまとめてみたいと思います。
基本的には前の投稿でも説明したように、Kubernetesのサービスを利用して実現します。
RDPプロトコルのポートはTCPおよびUDPプロトコルの3389番ポートを使って通信を行いますが、今回の場合はKubernetes ServiceでNodePortを割り当ててアクセスしてみます。
KubeVirtでVMを管理するには、次の流れでそれぞれを作成します。
- ストレージボリュームを作成
- VMIを作成
- VMIの上でVMが動く
- VMになんらかの方法で任意のOSを導入
VMIのIはInfrastructureのことのようです。 コンテナーの中でLibvirtとQEMU、KubeVirtの少々のプロセスが動く環境のことを指します。
そのVMIの作成時に、次のようなYAMLファイルを作成してデプロイしたとします。
apiVersion: kubevirt.io/v1alpha3
kind: VirtualMachine
metadata:
creationTimestamp: 2018-07-04T15:03:08Z
generation: 1
labels:
kubevirt.io/os: windows
name: win2016
spec:
running: true
template:
metadata:
creationTimestamp: null
labels:
kubevirt.io/domain: win2016
spec:
domain:
cpu:
cores: 2
devices:
disks:
- disk:
bus: virtio
name: disk0
- cdrom:
bus: sata
readonly: true
name: cloudinitdisk
machine:
type: q35
resources:
requests:
memory: 8192M
volumes:
- name: disk0
persistentVolumeClaim:
claimName: win2016
- cloudInitNoCloud:
userData: |
#ps1_sysnative
$HostName = hostname
[ADSI]$UpdateUser = "WinNT://$HostName/Administrator,User"
$UpdateUser.SetPassword( "Mywin2k16#" )
$UpdateUser.SetInfo()
name: cloudinitdisk
この場合にこのVMIに対してServiceを割り当てるには、次のようなYAMLファイルを作成します。ラベルとセレクターで同じラベルを設定すれば良いというわけです。下記の例では kubevirt.io/domain: win2016 がラベルですね。
---
apiVersion: v1
kind: Service
metadata:
name: win2016-nodeport
labels:
kubevirt.io/domain: win2016
spec:
type: NodePort
ports:
- port: 3389
targetPort: 3389
nodePort: 30389
selector:
kubevirt.io/domain: win2016
nodePort: 30389の部分は未指定の場合はNodePortの範囲から自動設定されますが、今回の場合は特定のポートを記述することにしました。クラスターで使用中のポートはkubectl get svcなどで確認できますから、使用中ではないポートを指定します。
NodePortで利用するレンジは事前にファイヤーウォール設定で許可しておく必要があります。例えばfirewall-cmdを使う場合は次のような感じです。おそらくKubernetesの環境をセットアップする際になんらかの方法でポート開放しているはずです。
$ sudo firewall-cmd --permanent --add-port=30000-32767/tcp $ sudo firewall-cmd --reload
リモートデスクトップの設定
あとはWindows側でリモートデスクトップの許可をするだけです。デフォルトの設定では無効化されていると思います。
Windows Server 2016以降の場合はサーバーマネージャーを起動し、左ペインで「ローカルサーバー」を選び、右ペインの一覧の中からリモートデスクトップの設定を確認します。「無効」となっている項目をクリックすると、従来のバージョンのWindowsのような「システムのプロパティ」が開かれますので、リモートデスクトップの項目を「このコンピューターへのリモート接続を許可する」にします。その下の「ネットワークレベル認証で〜(推奨)」の設定はオンにしておいた方がいいでしょう。

リモートデスクトップクライアントの設定
Windowsマシンであれば、リモートデスクトップクライアントはデフォルトで用意されています。 Macの場合は、AppStoreなどからリモートデスクトップクライアントがダウンロードできます。
Microsoft純正のリモートデスクトップクライアントを使う場合は「PC name」という項目に「ノードのIPアドレス:NodePort」を指定します。例えば「192.168.0.100:30389」のような感じです。あとの項目はいつものように必要な設定を仕込んでいきます。

サードパーティのリモートデスクトップクライアント、例えばParallels Clientの場合、IPアドレスとポートを別に設定できるものも存在します。私的にはこちらの方が好きです。

KubeVirtはVNCコンソールで操作はできますが、デフォルトの設定のままだとマウスの矢印に大きなずれがあるので使いずらい問題があります。対象がWindowsであれば、これまで説明した設定を行うことでRDPプロトコルを使ったWindows VMへのリモートアクセスが可能になります。

VNCコンソールによるアクセス時に起きていた、マウスの矢印のずれがなくなるほか、文字列などのコピーペーストやリモートソースへのローカルソースのマウントなどができるようになって便利になります。