docker
Hyper-V
minikube

Windows10 ProからNested Hyper-Vで遊んでみる(コンテナ付)

この記事は富士通クラウドテクノロジーズ Advent Calendar 2017 5日目の記事です。

4日目は@herietさんの「Prometheusのexporterを作ってニフクラRDBを監視する」という記事でした。
このPrometheusウェーブに僕も乗り遅れないようにしたいと思います!

話はガラッと変わって今日のテーマはHyper-Vです!

動機

時々Windows10を使っているのでそこに載っているHyper-Vで遊んでみようと思いました
半分自分への備忘録です

やったこと

  • Nested Hyper-V(マシマシ)
  • Docker for Windows
    • Linux コンテナ
    • Hyper-V コンテナ
    • minikube
  • Windows Server コンテナ
    • Hyper-V コンテナ
    • Windows コンテナ

やれてないこと

  • Hyper-Vの機能に含まれるけどAD・DNS設定が必要なもの
    • クラスタ
    • ライブマイグレーション

予習

Windowsで動くコンテナ技術には大きく分けて3つあります

Docker for Windows

Hyper-V上にLinuxのVMを立て、そこでコンテナを動かします。つまりWindows上でLinuxコンテナが動かせます

Hyper-V コンテナ

Hyper-V上で動くWindowsコンテナです。Hyper-V上で仮想化されたコンテナなのでHyper-Vが必須ですが細かいことを考えずにコンテナを作ることができます

Windows Server コンテナ

Windows Server上で動くWindowsコンテナです。仮想化がされていないコンテナです。ホストOSのプロセスとして実行されますがそれ故にパッチレベルまでホストとゲストのバージョンを合わせる必要があります

準備

  • Hyper-Vの要件を満たした物理ホスト
    • 今回は2700k/16GBのマシンを用意しました

Nested Hyper-V(マシマシ)

目的

Windows 10 Pro上にNested Hyper-Vを組みまくってリソースの食べ具合を図ります
また、VMを作りまくってHyper-Vに慣れていきます

結果

意外といけました!

  • 物理ホスト(Hyper-V)(16GB)
    • Hyper-V(12GB)
      • Hyper-V(9.5GB)
        • Hyper-V(5.5GB)
          • VM(2GB)・・・Disk IOエラーにより死亡

1.PNG

雑感

手順がかなり多いです(特にセキュリティ周り)
Hyper-Vの仕様で躓くよりもWindowsの設定で躓く事が多かったです
Nestedの仮想ディスクを作らないよう保存場所を変えようと思ったのですが時間がなく試せませんでした。それ故にネストした仮想ディスクを使わざるを得ず、終盤はディスクのアクセスが非常に遅かったです

手順

物理ホスト上のWindows 10 Pro側の準備

Hyper-Vを有効化

  1. win+r → OptionalFeatures
  2. Hyper-Vにチェック
  3. 再起動を求められるので再起動

image.png

リモートサーバー管理ツールをインストール

ここから WindowsTH-RSAT_WS_1709-x64.msu をDLしてインストール
必須ではないですが、イベントログが見やすいのでトラブル時の切り分けに役立ちます
image.png

リモート管理するホストの許可設定

Powershellにて以下のコマンドを実行
# 全てのホストを信頼済みホストにする
Set-Item WSMan:\localhost\Client\TrustedHosts -Value *
# (もしくは)指定したホスト名を信頼済みホストにする
# `Set-Item` を使うので、現在の設定は上書きされる
# `Get-item wsman:\localhost\client\trustedhosts"で現在の設定を呼び出せる
Set-item wsman:\localhost\client\trustedhosts -Value "HOST1, HOST2, HOST3, HOST4"
# CredSSPの有効化(例)
# クライアントとサーバの認証に使うみたいです?
# `Get-WSManCredSSP` で現在の設定を表示
# `Disable-WSManCredSSP` で設定を削除
Enable-WSManCredSSP -Role client -DelegateComputer "HOST1, HOST2, HOST3, HOST4"
資格情報の追加
  1. win+rでgpedit.msc
  2. コンピューターの構成 > 管理用テンプレート > システム > 資格情報の委任
  3. NTLMのみのサーバー認証で新しい資格情報の委任を許可する
  4. サーバーを一覧に追加
  5. wsman/HOST1, wsman/HOST2... のように追加していく

image.png

isoディレクトリの共有設定

osのisoを格納するフォルダの共有設定を忘れずに行っておきます(手順省略)
image.png

ゲストOSに用いるOSを選定

リソースを余計に食いたくないのでHyper-V Serverを利用
firewallの名前のややこしさの関係上英語版を使います

(余談)Hyper-V Serverの特徴

  1. GUIなし
  2. 最初からHyper-Vついてる
  3. コンテナ利用不可
  4. 無料
  5. 追加できる機能はファイル共有のみ

nestedの準備

公式ドキュメントにも要件が書いてありますが、実際のところこの他にも要件があるので一発でそれらを解決してくれるスクリプトを利用します

  1. Hyper-V マネージャーからVMを作成
  2. Invoke-WebRequest https://raw.githubusercontent.com/MicrosoftDocs/Virtualization-Documentation/live/hyperv-tools/Nested/Enable-NestedVm.ps1 -OutFile .\Enable-NestedVm.ps1
  3. .\Enable-NestedVm.ps1 VMNAMEプロンプトの質問への回答は基本YでOK
  4. Hyper-V Serverをインストール

Hyper-V Server内での操作

Hyper-V Serverではログインするとcmd.exe及びsconfigが開かれています

sconfigでの設定

CLIサーバー管理ツールです

  1. 3 -> 管理者追加
  2. 2 -> HostName変更
  3. 再起動

image.png

sconfigの内容はPowerShellでやってもいいです
net user username /add password
net localgroup administrators user /add
net user user

Rename-Computer -NewName "HOSTNAME" -Force -Restart

cmd.exe上での設定

# powershellに切り替え
powershell

# PowerShellのリモート操作を許可
Enable-PSRemoting

# CredSspの設定
Enable-WSManCredSSP -Role server

# (Option)GUI版のWindows Serverを実行している場合
Set-WSManQuickConfig -Force

# firewallの設定
netsh advfirewall firewall set rule group="File and Printer Sharing" new enable=yes
netsh advfirewall firewall set rule group="Windows Remote Management" new enable=yes
netsh advfirewall firewall set rule group="Remote Event Log Management" new enable=yes
netsh advfirewall firewall set rule group="Remote Volume Management" new enable=yes

# 共有フォルダのマウント
net use Z: \\HOSTNAME\共有名 /user:username password

# isoのコピー(例)
Copy-Item Z:\SERVERHYPERCORE_OEM_X64FRE_EN-US.ISO .\

# Nested Hyper-Vの要件を満たすように設定してくれるスクリプトをDL
Invoke-WebRequest https://raw.githubusercontent.com/MicrosoftDocs/Virtualization-Documentation/live/hyperv-tools/Nested/Enable-NestedVm.ps1 -OutFile .\Enable-NestedVm.ps1

Hyper-V Server上でVMを作成する

  1. Windows 10 Pro上のHyper-V マネージャーからHyper-V Serverのホストを登録

image.png

  1. 仮想スイッチの設定を行う(外部にしてvNICをアサインすればOK)

image.png

(備考)
この仮想スイッチが曲者で、しばしば作成時にエラーを吐いて止まります。しかし根気強く作成をし続ければいずれ成功します。

終了

リソースの限りnestedの準備からHyper-V Server上でVMを作成するまでを繰り返す

(備考)
Hyper-V Serverインストール時に51%の進捗でエラーを吐いて止まる場合はVMの設定が良くないです。
Enable-NestedVMをもう一度回してみてください。

Docker for Windows + Hyper-V コンテナ

Hyper-Vに慣れたのでDockerをWindows上で動かして軽いLinux(今回はalpine)とnanoserverを走らせてみます

目的

動けばいい

結果

動いた
おまけで走らせたminikubeも動いた

所感

Docker for WindowsのHyper-Vコンテナはexperimental扱いなので正式版のリリースが待ち遠しいです

手順

準備

以下のOSを用意しましょう

  • Windows 10 Pro
  • Windows Server Standard(VM)(未確認)
    • GUI版
  • Windows Server DataCenter(VM)
    • GUI版

Docker for WindowsはGUIが必須です

コンテナ機能を有効化

Windows 10 Pro

  1. win+r → OptionalFeatures
  2. Hyper-V, コンテナーにチェック
  3. 再起動

Windows Server

  1. サーバーマネージャーからHyper-V及びコンテナー機能をインストール
  2. 再起動

Dockerのインストール

今回はchocolateyを使います

Set-ExecutionPolicy Bypass -Scope Process -Force; iex ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1'))
choco install -y docker docker-for-windows
Restart-Computer

Dockerを立ち上げる

デスクトップにDocker for Windowsがあるのでダブルクリックして立ち上げます
Hyper-V マネージャーにMobyLinuxVMがあれば成功です

Alpineを動かす

Powershellからdocker run -it alpine

エラー

no matching manifest for windows/amd64 in the manifest list entries
ISSUE
タスクトレイ内のdockerアイコンを右クリックしてSwitch to Windows/Linux containers...を何回か行うとエラーを回避できます

nanoserverを立ち上げる

  1. タスクトレイ内のdockerアイコンを右クリックしてSwitch to Windows containers...
  2. docker run -it microsoft/nanoserver powershell

終了

ここまで環境が整えばminikubeを使ってお手軽k8sクラスタを構築できます
以下のコマンドでminikubeというVMがHyper-V上に作成されます
Hyper-Vの仮想スイッチ名を入れる必要があるのでお忘れなく

choco install minikube
minikube config set vm-driver hyperv
minikube start --hyperv-virtual-switch=vSWITCHNAME
minikube ssh

Windows Server コンテナ

仮想環境に頼らないコンテナを作ってみます

目的

Windows Serverコンテナの雰囲気を掴む

結果

特に問題なく作れた

手順

準備

以下のOSを用意しましょう

  • Windows Server Standard(VM)(未確認)
  • Windows Server DataCenter(VM)

Dockerのインストール

Install-Module DockerProvider -Force
Install-Package Docker -ProviderName DockerProvider -Force
Restart-Computer -Force
docker run microsoft/dotnet-samples:dotnetapp-nanoserver

キモかわキャラが出てきたら成功です

ちなみにdocker run --isolation hyper-vとするとDocker for Windowsの項目でも扱ったHyper-Vコンテナでコンテナを作成することが可能です

終了

今回はハマりませんでしたがWindows Server コンテナの場合ホストOSとコンテナイメージのバージョンをパッチレベルまで合わせる必要があります

最後に

とりあえず最低限Hyper-Vを遊ぶことができました。ESXiとは異なり簡単にハイパーバイザー型の仮想化環境を整えられるのは大きなメリットだと思います(特にドライバ周り)
時間があればHyper-VにNested ESXi+VSAN環境を作ったりAD・DNSサーバーを立ててライブマイグレーションやクラスタなんかもしてみたいです。長く遊べそうですね!

おまけ

Windows 10 dev environmentのススメ

image.png

Windows 10 のHyper-V マネージャーについてくるVMイメージです
VM作成時にクイック作成を選ぶと展開することができます
サクッと作れるのでとりあえず何か検証したいときなんかにおすすめ

  • ISO不要
  • ライセンスキー不要
  • 90日間稼働可
  • 商用利用不可(EULA必読)

参考文献

6日目は@makky05さんの「アルバイトの思い出系の心温まるポエム」です。
あったけぇポエムお楽しみに~!