坑边闲话:虚拟机与实机在计算模型上是一致的,所以我们可以放心地把任务交给虚拟机做。但是,在设计虚拟机的托管平台时却需要考虑很多细节上的问题,比如存储、网络通信等。这是 ESXi 学习指南系列的第一篇正式文章,我们从网络虚拟化入手。

软件版本

本教程适用于 ESXi 7.0 和 8.0 版本。

1. ESXi 网络虚拟化概览·

图 1. ESXi 的网络面板。

在上图中可以看到,ESXi 的 Networking 分得很细,总共有如下选项:

  • Port groups,端口组
  • Virtual switches,虚拟交换机
  • Physical NICs,物理网卡
  • VMkernel NICs,虚拟机管控网卡(笔者自译)
  • TCP/IP stacks
  • Firewall rules

这六大部分的设计,借鉴了实体网络中的一些常见做法,下面我们一一道来。

1.1 虚拟交换机·

在非虚拟化环境下,如果我们有多台电脑想要彼此通信,那么最简单的方案就是买一个网口数量充分多的交换机,然后用这台交换机连接起我们所有的电脑;之后配置这些电脑的网卡 IP 在同一个交换域中,即可实现互联互通。如果仅有两台电脑 A 和 B,那么 A 与 B 通信就比较简单粗暴,直接用网线将两个电脑的 RJ45 网口连接起来,配置到同一网段即可建立点对点的连接。这里插一句,Thunderbolt 网络本质上就是为这种点对点交换而生的。

但是上述场景在虚拟化环境下就变得颇为复杂,假如我们有一台裸金属服务器,它有两个千兆以太网接口。这时我们在这台裸金属服务器上部署虚拟化 Hyperviser,并配置两个 Windows 10 客户机系统。这两个客户机分别直通了一个千兆以太网卡。此时这两个客户机仍能效仿传统方法,通过一根网线将这两个千兆以太网接口“短接”来实现虚机间的网络通信。看起来是不是很怪异?笔者年轻时也做过这种蠢事(尽管非常有用)。

上述蠢到萌的场景有很大的优化空间。首先,网卡不一定需要直通给某个机器。因为直通就意味着设备将要被独占,所以这个被直通的设备无法再被其他设备使用了。(SR-IOV 技术后面会单独讲。)拿网卡来说,一般网卡被认为是计算机网络七层参考模型中最后两层的设备,即物理层、链路层设备,原则上网络层(IP)、传输层(TCP/UDP)可以独立设计。所以在这种场景下,我们哪怕仅有一个网卡,也可以在网络层及之上大做文章!于是这就产生了一个概念:虚拟网卡。

图 2. ESXi VM 配置网络

所谓的虚拟网卡,就是一个在网络层及之上工作的软件,它对客户机而言是一个真正的网卡,但是其数据要想发到 Internet,就需要交给 ESXi 的网卡驱动,把链路层、物理层的问题补齐。

这儿就产生了一个重要的想法:既然网卡可以做虚拟,那么其数据自然也能让 ESXi 做内部交换!这样一来,同一个裸金属服务器上的多个客户机就无需“蠢萌”地用网线短接的方法通信了。岂不美哉!于是就有了虚拟交换机的概念。

1.2 vSwitch0 虚拟交换机·

虚拟交换机,顾名思义,就是运行在 ESXi 上面的一个软件。

图 3. 虚拟交换机。

在上图中,可以看到左边有两个框,右边有一个框。左边指的是虚拟世界,右边是现实世界。左边呈现的是各虚机的虚拟网卡连接到“虚拟交换机的虚拟端口”(这话有点儿绕)的拓扑图,右边呈现的是这个虚拟机的上行链路,也就是一个真实的网卡。

接下来我们解释一下这个过程。

  1. 首先,ESXi 给各个客户机(虚机)提供一个软件模拟的网卡,常见的有 intel E1000 千兆网卡,VMxNet 万兆网卡等;
  2. ESXi 会让你在 VM 配置页面选择是否要连接这个网卡到某个虚拟交换机,可以点击 Connect 或者不点击。不点击的话,在客户机里该网卡永远是不活跃的,Connect 的话,客户机的虚拟网卡的状态将与右侧的物理网卡的链路状态保持一致;
  3. ESXi 会根据虚拟网卡的流量目的地,自主判断是要将这些数据包转发给其他虚拟机还是转出此裸金属服务器。前者的数据交换就在内存里做,效率非常高(至少比“外部网线短接”高多了);后者将通过上图中右侧的物理网卡进行转发,多个客户机的数据将在这个上行的物理网卡面前“排队”。

值得注意的是,vSwitch0 是一个特殊的、默认的虚拟交换机,这个虚拟交换机几乎不能被删除、重命名。为什么呢?因为在安装 ESXi 的时候,会默认将某个网卡设置为 vSwitch0 的上行链路,同时也会自动生成一个 VMkernel NIC,保证此裸金属服务器能通过 Web 被访问。VMkernel NIC 所在的虚拟交换机是不能被删除的,即便你真的 Remove 了,那么你将立即暂时失去 ESXi 的访问能力,但是重启一下裸金属服务器之后,被你删掉的 vSwitch0 及 VMkernel NIC 就又回来了。这能防止很多小白误操作,导致再也管理不了 ESXi. 从这个过程中也可以看到,vSwitch0 本质上是无法永久删除的。

1.3 端口组·

看完了 1.2,就基本明白端口组 Port group 是怎么回事了。许多小白朋友以为端口组就是虚拟机的物理网卡集合,这种认识是大错特错!

端口组就是虚拟交换机上的某些端口的集合。交换机上的端口是没有 IP 地址的。

我们可以在端口组上设置 VLAN,从而实现交换机的管理功能。

1.4 如何通过网络管理 ESXi 自身·

图 4. VMKernel 管理网卡。

说了这么多虚拟化问题,还有一个问题没有解决,那就是如何管理 vmware ESXi 本身。当然,最直接的方法就是给裸金属服务器直接插显示器和键盘鼠标,然后在那个简陋的后台窗口配置。但是通过 Web 进行配置才是主流的做法。

在 Networking 面板里的 VMkernel NICs 是专门用来配置管理网卡的。所谓 VMkernel NIC 也是一个虚拟网卡,只不过它不属于任何客户机,而是属于 ESXi 自己!

通过 ESXi 的管理网卡的上行物理网卡才能访问 ESXi 的 Web 管理界面。如果你的某些物理网卡不是在 VMkernel NIC 所在的 vSwitch 的上行链路列表里,那么很遗憾,是无法通过这些物理网卡管理 ESXi 的。

接下来看一下如何创建一个 VMkernel NIC.

图 5. 添加 VMKernel 网卡。

在上图中可以看到,它默认创建了一个端口组,并自主选择了 vSwitch0 作为虚拟交换机,同时默认的 VLAN ID 是 0.

为什么要新建端口组?这是因为,VMkernel NIC 所连接的 vSwitch 端口组,必须与其他普通虚拟机的虚拟机虚拟网卡所连接的端口组隔开。 如果你强行将 VMkernel NIC 的端口组设置为某虚机的虚拟网卡所在的端口组,那么在创建之后,ESXi 将提醒你,此虚机的网卡不可访问了,也就是被踢掉了。

所以,管理端口 VMkernel NIC 要在一个独立的端口组里!不要为了美观而妄想通过一个端口组解决所有问题。

在上图中,最后的 Services 部分里,可以选择该管理网卡所能从事的服务,比如集群常用的 vMotion 迁移功能等。这一部分有机会单独写文章讲。

1.5 ESXi 所面对的物理网卡·

图 6. 物理网卡。

ESXi 中的物理网卡能够在此页面中看到。物理网卡的命名方式一般是 vmnicNN 是 0、1、2…

比如,图里的 vmnic0 是一个 intel i219LM 千兆网卡,常见于 Dell 的商用机和某些支持 vPro 的笔记本上。其驱动程序是 ne1000,目前它没插网线,所以 Link speed 项是 Link down,表示这个网卡目前不活跃。vmnic1vmnic2 是 intel X550-T2 上的两个 10G 万兆电口网卡,驱动是 ixgben,其中的 i 指的是 intel,x 指的是 ten,也就是 10G. 目前它们插在了千兆交换机上,所以目前的速度是千兆全双工,而非万兆。

物理网卡没什么好说的,这个界面唯一的作用就是查看网卡。有些时候一个 PCIe 转双口万兆网卡就看着很麻烦,分不清谁是 vmnic1、谁是 vmnic2,这时候可以让 vmnic0 做管理网卡,然后通过拔插 vmnic1vmnic2 的网线的方式判断网卡活跃状态,并由此判定网卡 Name 与实际网口的一一对应关系。

1.6 分布式交换机·

有机会单独写文章讲。

总结·

这篇文章通过简短的图文,讲述了如何配置 ESXi 和客户机的网络问题。

To Be Continued.