工欲善其事,必先利其器。搭建一个方便管理的服务集群,是分布式学习很重要的环境。

目前流行的虚拟机产品主要为Vmware 和 win10自带的Hyper-V(win10家庭版无此功能),网上关于Vmware的教程更多,显然它更容易上手,但Hyper-V也算是一个很不错的产品,这里记录一下我的学习过程:

目录

Hyper-V的安装

服务集群的搭建

虚拟机的网络通信

NAT网络的搭建

端口映射

Linux的静态IP

虚拟机的自启动问题


Hyper-V的安装

也不能算说是安装,如果你的win10是专业版或者专业版以上,只需要在功能中开启即可

服务集群的搭建

虽然服务器现在是Linux的天下,但使用 win server + Hyper-V的组合也不在少数,在开发学习中,我更建议使用 hyper-V (Vmware)来管理一大堆Linux虚拟机集群,(亲测踩坑,没有专业的团队维护的话,服务器只装一个Linux,然后使用docker管理其他的Linux系统,出现问题的概率很大)。

在hyper-v中安装虚拟机和Vmware的操作方法差不多,也没有太多的坑,可参考网上其它教程。

既然部署在单台机器内的集群(如果你是土豪,一台电脑一个系统,当我没说),那么就有两个很重要的问题:

  • 这么多虚拟机,它们之间如何通信,它们与外部如何双向通信
  • 当电脑启动时,如何自启动这些虚拟机,不然每天还一个个手动启动吗?

分别来解决

虚拟机的网络通信

NAT网络的搭建

(以下命令都是在powershell中运行,管理员身份打开)

HyperV虚拟交换机分为 外部,内部,私有

默认的 defaultSwitch 为内部,并标注了默认使用NAT:

 

但官方文档中有这样说明:

 

使用如下命令查询却显示没有NAT网络,很迷,存疑?

Get-NetNat

这个 defaultSwitch 虽然可以很好的连接互联网,但宿主机每次重启,该交换机的IP都会改变,很不稳定,至于为什么,暂时也很疑惑?

于是我觉得自己建立一个内部交换器试一下

结果是 内网可以互相访问,但虚拟机无法访问互联网,(参考defaultSwitch,推测可能是需要NAT模式的内部交换机才可以访问互联网)于是依据下面的步骤新建了,NAT模式的内部交换机 NATSeitch ,算是成功访问外网,也稳定住了IP)

查看当前网络适配器列表

Get-NetAdapter

 

创建一个虚拟网卡(名为 NATSwitch)

New-VMSwitch -SwitchName "NATSwitch" -SwitchType Internal

使用 New-NetIPAddress 配置 NAT 网关

New-NetIPAddress -IPAddress 192.168.3.1 -PrefixLength 24 -InterfaceIndex 38

 

 

  • IPAddress - NAT 网关 IP 指定要用作 NAT 网关 IP 的 IPv4 或 IPv6 地址。 常规形式将为 a.b.c.1(例如 172.16.0.1)。 尽管最后一个位置不一定必须是.1,但通常是(基于前缀长度)

    通用网关 IP 为 192.168.0.1

  • PrefixLength -- NAT 子网前缀长度定义的 NAT 本地子网大小(子网掩码)。 子网前缀长度将为 0 到 32 之间的整数值。

    0 将映射整个 Internet,32 将只允许一个映射的 IP。 常用值的范围为 24 到 12,具体取决于需要附加到 NAT 的 IP 数。

    常用 PrefixLength 为 24 -- 这是子网掩码 255.255.255.0

  • InterfaceIndex -- ifIndex 是你在上一步中确定的虚拟交换机的接口索引。

(注:如果爆红,检查一下此IP是否被其它的适配器占用了(ping一下该地址即可),如果占用,请删除该适配器(或者修改该适配器IP)然后再次执行。)

使用 New-NetNat配置 NAT 网络。

New-NetNat -Name SWING-NAT -InternalIPInterfaceAddressPrefix 192.168.3.0/24
  • Name - NATOutsideName 描述 NAT 网络的名称。 将使用此参数删除 NAT 网络。

  • InternalIPInterfaceAddressPrefix - NAT 子网前缀同时描述上述 NAT 网关 IP 前缀和上述 NAT 子网前缀长度。

端口映射

网络部署好了,那么如何才能从外部访问这台电脑中的虚拟机呢?

例如该电脑内部署了十台虚拟机,我现在要使用 ssh 来连接其内部的某一个linux系统,这时就需要用到端口映射了,

这和docker 的 port 8080:8089 表示是一个道理,使用宿主机的端口来映射虚拟机的端口,为外部提供服务,也保证了虚拟机其他端口的安全性。

管理员身份运行powershell:

#查询映射
netsh interface portproxy show v4tov4

#新增映射
netsh interface portproxy add v4tov4 listenaddress=192.168.2.100 listenport=7982 connectaddress=192.168.3.2 connectport=22

#删除一个端口映射
netsh interface portproxy delete v4tov4 listenaddress=192.168.0.102 listenport=7980

#查询这个IP所有的端口映射。
netsh interface portproxy show v4tov4|find "192.168.0.102"

Linux的静态IP

要想一个系统的稳定,其中的每个点最好也是稳定的,将虚拟机的IP设置为静态IP,防止已启动IP就找不到家了。

这里拿 ubuntu 16.04来举例(其他的操作系统配置自行百度)

使用 ifconfig命令获取当前的 网卡名 (例如我的是 enp8s0 )

编辑文件/etc/network/interfaces

# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).
​
source /etc/network/interfaces.d/*
​
# The loopback network interface
auto lo
iface lo inet loopback
​
# The primary network interface
auto enp8s0
#iface enp8s0 inet dhcp
iface enp8s0 inet static
address 192.168.3.2
netmask 255.255.255.240
gateway 192.168.3.1
dns-nameserver 114.114.114.114

然后使用 /etc/init.d/networking restart  重启网络

虚拟机的自启动问题

这个很容易实现,管理员身份运行powershell:

# 查看该虚拟机的自启动和延时参数
gvm -Name u-docker-gitlab-runner | Select-Object VMname,AutomaticStartDelay,AutomaticStartAction

# 允许该虚拟机自启动
gvm -Name u-docker-gitlab-runner | Set-VM -AutomaticStartAction Start
 
# 配置自启动的延时时间
gvm -Name u-docker-gitlab-runner | Set-VM -AutomaticStartDelay 30

对您有帮助的话记得留言点赞,谢谢您的鼓励!!

 

 

 

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐