この記事は富士通クラウドテクノロジーズ 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エラーにより死亡
- Hyper-V(5.5GB)
- Hyper-V(9.5GB)
- Hyper-V(12GB)
雑感
手順がかなり多いです(特にセキュリティ周り)
Hyper-Vの仕様で躓くよりもWindowsの設定で躓く事が多かったです
Nestedの仮想ディスクを作らないよう保存場所を変えようと思ったのですが時間がなく試せませんでした。それ故にネストした仮想ディスクを使わざるを得ず、終盤はディスクのアクセスが非常に遅かったです
手順
物理ホスト上のWindows 10 Pro側の準備
Hyper-Vを有効化
- win+r →
OptionalFeatures
-
Hyper-V
にチェック - 再起動を求められるので再起動
リモートサーバー管理ツールをインストール
ここから WindowsTH-RSAT_WS_1709-x64.msu
をDLしてインストール
必須ではないですが、イベントログが見やすいのでトラブル時の切り分けに役立ちます
リモート管理するホストの許可設定
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"
資格情報の追加
- win+rで
gpedit.msc
-
コンピューターの構成
>管理用テンプレート
>システム
>資格情報の委任
NTLMのみのサーバー認証で新しい資格情報の委任を許可する
サーバーを一覧に追加
-
wsman/HOST1
,wsman/HOST2
... のように追加していく
isoディレクトリの共有設定
osのisoを格納するフォルダの共有設定を忘れずに行っておきます(手順省略)
ゲストOSに用いるOSを選定
リソースを余計に食いたくないのでHyper-V Serverを利用
firewallの名前のややこしさの関係上英語版を使います
(余談)Hyper-V Serverの特徴
- GUIなし
- 最初からHyper-Vついてる
- コンテナ利用不可
- 無料
- 追加できる機能はファイル共有のみ
nestedの準備
公式ドキュメントにも要件が書いてありますが、実際のところこの他にも要件があるので一発でそれらを解決してくれるスクリプトを利用します
- Hyper-V マネージャーからVMを作成
Invoke-WebRequest https://raw.githubusercontent.com/MicrosoftDocs/Virtualization-Documentation/live/hyperv-tools/Nested/Enable-NestedVm.ps1 -OutFile .\Enable-NestedVm.ps1
-
.\Enable-NestedVm.ps1 VMNAME
プロンプトの質問への回答は基本YでOK - Hyper-V Serverをインストール
Hyper-V Server内での操作
Hyper-V Serverではログインするとcmd.exe及びsconfigが開かれています
sconfigでの設定
CLIサーバー管理ツールです
-
3
-> 管理者追加 -
2
-> HostName変更 - 再起動
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を作成する
- Windows 10 Pro上のHyper-V マネージャーからHyper-V Serverのホストを登録
- 仮想スイッチの設定を行う(外部にしてvNICをアサインすればOK)
(備考)
この仮想スイッチが曲者で、しばしば作成時にエラーを吐いて止まります。しかし根気強く作成をし続ければいずれ成功します。
終了
リソースの限り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
- win+r →
OptionalFeatures
-
Hyper-V
,コンテナー
にチェック - 再起動
Windows Server
- サーバーマネージャーからHyper-V及びコンテナー機能をインストール
- 再起動
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を立ち上げる
- タスクトレイ内のdockerアイコンを右クリックしてSwitch to Windows containers...
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のススメ
Windows 10 のHyper-V マネージャーについてくるVMイメージです
VM作成時にクイック作成を選ぶと展開することができます
サクッと作れるのでとりあえず何か検証したいときなんかにおすすめ
- ISO不要
- ライセンスキー不要
- 90日間稼働可
- 商用利用不可(EULA必読)
参考文献
- はじめてのコンテナーDocker & Windows & Linux
- Hyper-V on Windows 10 Documentation
- Windows Server Virtualization Documentation
- Docker for Windows Documentation
- Windows Containers Documentation
- Windows にまつわる e.t.c
6日目は@makky05さんの「アルバイトの思い出系の心温まるポエム」です。
あったけぇポエムお楽しみに~!