以前我都是用 Vagrant + VirtualBox 快速创建虚拟机环境。通过 Vagrant 配置文件,我们可以快速初始化多个关联的虚拟机,并省去了设置网络和存储的时间。还可以将 Vagrant 项目直接转给别人,让别人快速搭建类似的环境。用了 Kubernetes Desktop 后,需要开启 Windows 的 Hyper-V,这样就无法使用 VirtualBox 了。所以,为了同时使用 Kubernetes 和虚拟化,使用 Hyper-V 代替 VirtualBox会是一个自然的选择。不过目前 Vagrant 还不支持 Hyper-V 网络初始化,所以要有需要自定义的步骤。
本文创建的 vagrant 项目的完整代码在这里,大家直接使用。
我们的 Windows 10 默认没有开启 Hyper-V 和 SMB 1.0/CIFS,所以需要手工开启,使用管理员运行 Powershell ,然后执行:
Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Hyper-V -All
Enable-WindowsOptionalFeature -Online -FeatureName "SMB1Protocol" -All
安装完后需要重启计算机。
直接从这里下载安装即可,安装完后需要重启计算机。
因为要用到 reload 插件,所以还需要运行:
vagrant plugin install vagrant-reload
准备一个目录(完成后的项目在这里),作为 vagrant 项目的根目录。添加文件 scripts\create-nat-hyperv-switch.ps1:
# See: https://www.petri.com/using-nat-virtual-switch-hyper-v
If ("NATSwitch" -in (Get-VMSwitch | Select-Object -ExpandProperty Name) -eq $FALSE) {
'Creating Internal-only switch named "NATSwitch" on Windows Hyper-V host...'
New-VMSwitch -SwitchName "NATSwitch" -SwitchType Internal
New-NetIPAddress -IPAddress 192.168.0.1 -PrefixLength 24 -InterfaceAlias "vEthernet (NATSwitch)"
New-NetNAT -Name "NATNetwork" -InternalIPInterfaceAddressPrefix 192.168.0.0/24
}
else {
'"NATSwitch" for static IP configuration already exists; skipping'
}
If ("192.168.0.1" -in (Get-NetIPAddress | Select-Object -ExpandProperty IPAddress) -eq $FALSE) {
'Registering new IP address 192.168.0.1 on Windows Hyper-V host...'
New-NetIPAddress -IPAddress 192.168.0.1 -PrefixLength 24 -InterfaceAlias "vEthernet (NATSwitch)"
}
else {
'"192.168.0.1" for static IP configuration already registered; skipping'
}
If ("192.168.0.0/24" -in (Get-NetNAT | Select-Object -ExpandProperty InternalIPInterfaceAddressPrefix) -eq $FALSE) {
'Registering new NAT adapter for 192.168.0.0/24 on Windows Hyper-V host...'
New-NetNAT -Name "NATNetwork" -InternalIPInterfaceAddressPrefix 192.168.0.0/24
}
else {
'"192.168.0.0/24" for static IP configuration already registered; skipping'
}
然后再添加 scripts\set-hyperv-switch.ps1 :
# See: https://www.thomasmaurer.ch/2016/01/change-hyper-v-vm-switch-of-virtual-machines-using-powershell/
Get-VM "homestead" | Get-VMNetworkAdapter | Connect-VMNetworkAdapter -SwitchName "NATSwitch"
增加修改 IP 的脚本,首先是 CentOS 的脚本 scripts\centos\configure-static-ip.sh :
#!/bin/sh
echo 'Setting static IP address for Hyper-V...'
cat << EOF > /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
BOOTPROTO=none
ONBOOT=yes
PREFIX=24
IPADDR=192.168.0.2
GATEWAY=192.168.0.1
DNS1=8.8.8.8
EOF
# Be sure NOT to execute "systemctl restart network" here, so the changes take
# effect on reboot instead of immediately, which would disconnect the provisioner.
然后是 Ubuntu
然后准备一个名为 Vagrantfile 的文件:
Vagrant.configure("2") do |config|
config.trigger.before :up do |trigger|
trigger.info = "Creating 'NATSwitch' Hyper-V switch if it does not exist..."
trigger.run = {privileged: "true", powershell_elevated_interactive: "true", path: "./scripts/create-nat-hyperv-switch.ps1"}
end
config.trigger.before :reload do |trigger|
trigger.info = "Setting Hyper-V switch to 'NATSwitch' to allow for static IP..."
trigger.run = {privileged: "true", powershell_elevated_interactive: "true", path: "./scripts/set-hyperv-switch.ps1"}
end
config.vm.provision "shell", path: "./scripts/centos/configure-static-ip.sh"
config.vm.provision :reload
config.vm.provider "hyperv" do |hv|
hv.vmname = "homestead"
end
config.vm.hostname = "hypervhost"
config.vm.synced_folder '.', '/vagrant', {
type: 'smb', mount_options: ['vers=3.0'],
smb_username: ENV['VAGRANT_SMB_USERNAME'],
smb_password: ENV['VAGRANT_SMB_PASSWORD']
}
config.vm.box = "centos/7"
end
使用管理员运行 powershell,进入 Vagrantfile 所在目录,运行:
vagrant up
当询问使用哪个 switch ,选择 “1) Default Switch”,然后就可以看到虚拟机启动又重启。然后在 SMB 共享文件部分,会提示你输入用户名密码,用你操作系统用户名和密码即可。如果没有报错,即可通过 ssh 客户端,使用 ..vagrant\machines\default\hyperv 下的 private_key 访问 192.168.0.2 。
如果需要修改 IP,需要修改 "./scripts/centos/configure-static-ip.sh" 中的内容。如果用的是 Ubuntu ,需要修改 “config.vm.provision "shell"” 执行 "./scripts/ubuntu/configure-static-ip.sh"。
如果修改的 IP 不是 192.168.0.* ,则还需要修改 switch 相关的脚本,先将网关配置好。