Azure 上的 Linux—企鹅的奇怪栖息地
Linux 爱好者可能会认为在微软的 Azure 服务上运行 Linux 虚拟机,就像在撒哈拉沙漠中发现企鹅在晒日光浴一样不可思议。在微软云的核心地带运行 Linux?这难道不是在很多层面上都错了吗?
为什么会有人想在微软的服务器上运行 Linux 呢?对于业余爱好者来说,我想这和人们攀登珠穆朗玛峰的原因一样:因为它就在那里。对于商业用户来说,在微软的架构中启动 Linux 虚拟机为将开源技术与现有的 Microsoft Azure 服务并置提供了新的选择。对于整个云市场来说,更多的竞争对消费者来说是好消息。
云市场虚拟专用服务器 (VPS) 形式的虚拟机已经由众多供应商提供了近十年,他们使用了 Xen、Virtuozzo/OpenVZ 和 KVM 等虚拟化技术。这些供应商将一台物理服务器细分为多个小型虚拟服务器。用户通常按月订阅,并分配内存、磁盘和网络带宽。
后来的供应商,如亚马逊、Rackspace 和现在的微软,提供了相同但更精细的服务。用户可以按小时启动虚拟机(或数百个),按千兆字节支付带宽费用,并使用更高级的功能,如私有网络、类 SAN 存储功能、卸载的数据库引擎等等。
所有这些多样性对最终用户来说都是好消息。2002 年,一个 128MB 内存的 VPS 每月花费近 100 美元。2006 年,您可以花 40 美元/月获得一个 512MB 内存的 VPS。今天,在 VPS 市场上,这样的 VPS 可以以低于 5 美元/月的价格找到,或者从云提供商那里以每小时几美分的价格获得。
微软进入市场亚马逊的弹性计算云 (Elastic Compute Cloud) 和其他供应商(如 Rackspace)很快跟进,都取得了早期的成功。微软最初选择了另一种更复杂的云策略。Azure 被构建为“平台即服务”产品(参见“云的种类”侧边栏),开发者可以在其中编写在各种角色中运行并与 Azure API 通信的应用程序。理论上,这允许开发者专注于代码,而不用担心底层的抽象硬件。
但在实践中,开发者被迫编写以 Azure 为中心的应用程序,采用速度缓慢。许多拥有混合 Windows/Linux 环境的企业发现,在亚马逊和其他云环境中托管他们自己管理的服务器,比花费时间移植和调试他们的应用程序更有吸引力。
2012 年,微软在其产品线中增加了“基础设施即服务”(虚拟机)产品,允许用户运行和管理他们直接控制的 Windows 和 Linux 虚拟机。
Azure 虚拟机目前仍处于“社区预览”阶段,这是微软术语中的“Beta 版”。支持仅限于论坛,正如您将看到的,该产品仍需要进行一些打磨。然而,在使用该服务几个月后,我发现 Azure 上的 Linux 非常稳定、易于使用且性能良好。在撰写本文时,微软尚未确定正式发布日期。
云的种类基于云的服务有几种不同的形式,具体取决于被抽象和配置的内容。
-
软件即服务 (SaaS):提供商运行一个应用程序,并向订阅者公开一个接口。这仅仅是使用一个基于 Web 的应用程序。示例包括 Salesforce.com、NetSuite 和 37 Signals 的 Basecamp。
-
平台即服务 (PaaS):提供商提供一个平台,用户可以使用该平台构建应用程序。订阅者编写并提供代码,这些代码在抽象的硬件和软件服务上运行。示例包括微软最初的 Azure 产品、Oracle 的 Fusion 云或 Google 的 App Engine。
-
基础设施即服务 (IaaS):提供商提供虚拟机和其他基础设施组件,用户可以根据自己的喜好进行配置。示例包括亚马逊的 EC2、Rackspace Cloud、Google Compute 和微软的 Azure。虚拟专用服务器也是 IaaS 产品,但财务模型不同。
Azure 的主要竞争对手是 Amazon EC2,不难看出微软的 IaaS 产品是仿照其竞争对手的成功模式设计的。
与 EC2 一样,Azure 也按小时定价,费率也相似。在社区预览期间,定价略低于预期的正式发布定价。按小时虚拟机的实际价格比较取决于长期承诺的期限。例如,亚马逊提供竞价实例和预付费保留实例,而微软也为长期承诺提供折扣。存储和带宽定价非常相似。总的来说,在 Azure 上运行虚拟机的成本与 EC2 大致相同,这可能正是微软计划的。
EC2 提供了微软尚未赶上的功能。例如,底层的存储虚拟机磁盘(弹性块存储)可以快照到 S3 存储。然而,许多亚马逊的服务在 Azure 世界中都有类似的对应物。例如,亚马逊的 SimpleDB 类似于 Azure 的表存储。两家供应商都提供复杂的网络功能、缓存、监控和内容分发网络选项。在任一环境中,虚拟机都可以位于美洲、欧洲或亚洲,并带有全球 CDN 节点。
Azure 的价值主张不是“我们是更好的云”,而是“您可以在这里与您的 Azure 平台一起做类似 EC2 的事情”。对于那些拥有深度微软部署、早期采用 Azure 或希望开发可以移入和移出 Azure 的应用程序的商店来说,新的 IaaS 产品将具有吸引力。
体验 Azure使用 Microsoft Azure 需要一个免费的 Windows Live 帐户,以及一张信用卡来开立收费帐户。如果您的雇主参与了 Microsoft Developer Network (MSDN) 计划,您可能已经有权每月免费获得一定数量的 Azure 服务。设置好帐户后,您可以前往管理门户并开始添加服务。
Azure 控制面板非常简洁,而且非常漂亮。对于云服务来说,漂亮的控件可能不是一个主要的卖点,但 Azure 界面非常具有交互性。当您设置服务时,操作状态的消息会异步地出现在屏幕底部。性能图表和历史记录集成到显示中,面板感觉更像是一个桌面应用程序,而不是一个“点击提交并等待”的 Web 界面。

图 1. Azure 管理门户易于使用且设计精美。

图 2. Azure 门户显示任务消息和状态。
Azure 提供了几种 Linux 版本:CentOS 6.2、Ubuntu 12.04、SUSE Linux Enterprise Server 和 OpenSUSE 12.1。可以滚动您自己的镜像并上传它,但这需要使用 Microsoft 的 Hyper-V 服务器产品,这对于普通 Linux 用户来说不太可能方便地拥有。

图 3. 创建虚拟机时提供了五种不同的 Linux 选项。
对于本文,我创建了一个名为“penguin1”的 CentOS 6.2 虚拟机。在 cloudapp.net 域中自动为虚拟机创建一个 DNS 名称,如果您拥有自己的域,则可以将其 CNAME 到您的域。

图 4. 在 Azure 中设置 penguin1
虚拟机不直接暴露于互联网,而是被赋予 10.x IP 地址。在 Azure 面板内部,用户可以配置端点以打开防火墙端口并根据自己的喜好进行映射。例如,要设置 Web 服务器,需要创建一个端口 80(可能还有 443)端点,它可以映射到虚拟机上所需的任何端口。

图 5. 添加网络端点以设置 Web 服务器
这个网络防火墙是一个很好的安全功能。默认情况下,只配置了端口 22 (SSH)。如果您打算更改默认的 SSH 端口(通常这样做是为了防止脚本小子扫描),您还需要在 Azure 管理门户中更改端点。您也可以选择在管理门户中更改它,并将其映射回虚拟机上的 22 端口。
选择“从库创建”可以为您提供最多的创建选项。在提供基本信息(如名称和大小)后,配置立即开始,根据我的经验,大约需要十分钟才能完成。
Root 密码是什么!?!?其他 VPS 系统的用户可能想知道他们在哪里指定 root 密码。答案很简单:您不需要。您指定的任何帐户都将被授予 sudo 权限以 su
到 root 用户
[andrew@penguin1 ~]$ sudo su -
[sudo] password for andrew:
[root@penguin1 ~]#
从那时起,如果您愿意,可以使用 passwd 设置 root 密码。
存储Linux 虚拟机有三种类型的存储。
首先,每个虚拟机都被赋予一个 30GB 的根卷。存储是本地冗余的,并且可以选择使其成为地理冗余,成本增加约 33%。不幸的是,在没有创建您自己的模板的情况下,如果您喜欢不同的文件系统布局或想要更小的每月存储账单,则无法修改此 30GB 配置。根卷数据在重启后仍然存在,并且是 Azure 存储中的永久 BLOB。因此,如果您删除虚拟机,可以保留其根卷,并在以后将其挂载到另一个系统上,或将其用作新虚拟机的根卷。
您还可以创建任意数量的其他卷。这些卷作为 BLOB 存在于 Azure 存储中,并且是持久的。它们的功能很像 SAN 卷,允许您创建卷并将其附加到一个虚拟机,然后在以后卸载并附加到另一个虚拟机。不幸的是,无法调整这些卷的大小,这是一个令人失望的限制。虽然您可以创建一个更大的卷,移动数据并删除旧卷,但这显然不是一种可扩展的方法。
当您创建一个新磁盘并将其附加到虚拟机时,它会显示为一个新的 SCSI 设备,您可以对其进行 mkfs 和挂载。在 Azure 门户中创建一个新的 20GB 磁盘后,penguin1 的 dmesg 显示
scsi 4:0:0:0: Direct-Access Msft Virtual Disk 1.0 PQ: 0 ANSI: 4
sd 4:0:0:0: Attached scsi generic sg3 type 0
sd 4:0:0:0: [sdc] 41943040 512-byte logical blocks: (21.4 GB/20.0 GiB)
sd 4:0:0:0: [sdc] Write Protect is off
sd 4:0:0:0: [sdc] Mode Sense: 0f 00 10 00
sd 4:0:0:0: [sdc] Write cache: enabled, read cache: enabled,
supports DPO and FUA
sdc: unknown partition table
sd 4:0:0:0: [sdc] Attached SCSI disk
现在您可以 fdisk、mkfs 和 mount
[root@penguin1 ~]# fdisk /dev/sdc
Command (m for help): n
Command action
e extended
p primary partition (1-4)
p
Partition number (1-4): 1
First cylinder (1-2610, default 1):
Using default value 1
Last cylinder, +cylinders or +size{K,M,G} (1-2610, default 2610):
Using default value 2610
Command (m for help): w
The partition table has been altered!
Calling ioctl() to re-read partition table.
Syncing disks.
[root@penguin1 ~]# mkfs.ext4 /dev/sdc1
mke2fs 1.41.12 (17-May-2010)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
1310720 inodes, 5241198 blocks
262059 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=4294967296
160 block groups
32768 blocks per group, 32768 fragments per group
8192 inodes per group
Superblock backups stored on blocks:
32768, 98304, 163840, 229376, 294912, 819200, 884736,
1605632, 2654208, 4096000
Writing inode tables: done
Creating journal (32768 blocks): done
Writing superblocks and filesystem accounting information: done
This filesystem will be automatically checked every 21 mounts or
180 days, whichever comes first. Use tune2fs -c or -i to override.
[root@penguin1 ~]# mkdir /data
[root@penguin1 ~]# mount /dev/sdc1 /data
[root@penguin1 ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/VolGroup-lv_root
28G 2.0G 24G 8% /
tmpfs 872M 0 872M 0% /dev/shm
/dev/sda1 485M 86M 374M 19% /boot
/dev/sdb1 69G 180M 66G 1% /mnt/resource
/dev/sdc1 20G 172M 19G 1% /data
正如您可能预期的那样,如果我要在 Azure 门户中删除此磁盘,除非我首先卸载它,否则操作将失败。
最后,虚拟机还配备了可变数量的真正本地存储。此存储不住在 Azure 云中,而是配置在实际的物理节点上。如果 Azure 架构中存在硬件或其他故障,并且您的虚拟机迁移到新的主机,则存储在此空间中的数据将丢失。此文件系统旨在用于状态信息、临时数据和其他临时文件。在 Linux 镜像上,它显示为 /mnt/resource。小型虚拟机接收 70GB 的文件系统,并且大小随虚拟机大小而增加,对于超大型虚拟机,最大可达 800GB。
我在 Azure 上经历过硬件故障。我的虚拟机关闭,迁移到新的硬件主机,并在新服务器上启动。我定义为启动的服务正常启动,所有网络端点都正确移动,我挂载的磁盘被重新挂载,虚拟机工作正常。但是,我在 /mnt/resource 中的临时数据丢失了,文件系统是空的,这是按设计进行的。
粗糙之处CentOS 镜像可能需要一些改进。由 OpenLogic 提供,我注意到了一些让我挠头的事情
-
配置了交换分区,但未出现在 /etc/fstab 中。因为创建一个交换分区但不使用它并没有太多优势,所以这大概是一个疏忽。
-
一些默认服务在没有理由的情况下运行。例如,为什么需要 CUPS?我不太可能在云中打印。鉴于 RAID 冗余由 Azure 存储层提供,并且不需要软件 RAID,为什么 mdmonitor 设置为在启动时运行?
-
我定期收到来自 fprintd 的崩溃报告。删除此服务很简单,但为什么 CentOS 镜像被创建为在虚拟的、基于云的环境中支持指纹生物识别身份验证让我感到困惑。
-
iptables 已启用,只有一个规则接受 bootp,尽管 INPUT 链无论如何都具有默认的 ACCEPT 策略。
希望随着 Linux 在 Azure 中稳定下来,这些问题将得到纠正。
性能总的来说,I/O 性能非常出色。使用 ioping 测量,我发现我之前创建的 /data 磁盘平均延迟为 6 毫秒,而 /mnt/resource 显示为快速的 0.4 毫秒。根磁盘较慢,为 18 毫秒,但正如微软在其文档中解释的那样,它以不同的方式优化标记为“OS 磁盘”的卷上的 I/O 性能
操作系统磁盘和数据磁盘具有主机缓存设置(有时称为主机缓存模式),在某些情况下可以提高性能。但是,这些设置在其他情况下可能会对性能产生负面影响,具体取决于应用程序。对于数据磁盘的读取操作和写入操作,主机缓存默认处于关闭状态。对于操作系统磁盘的读取和写入操作,主机缓存默认处于开启状态。如前所述,这些设置在大多数情况下应该效果最佳。但是,您的结果可能会有所不同。我们建议您将数据密集型操作放在与操作系统磁盘分离的数据磁盘上。

图 6. Azure 门户中性能指标的集成显示
计算性能取决于您选择的虚拟机大小。在底层,微软正在使用 AMD 设备,这可以从 /proc/cpuinfo 中看出
processor : 1
vendor_id : AuthenticAMD
cpu family : 16
model : 8
model name : AMD Opteron(tm) Processor 4171 HE
stepping : 1
cpu MHz : 2094.702
cache size : 512 KB
总结
有些人可能会说,Azure 中 Linux 的最大优点是它为亚马逊和谷歌带来了竞争。对于最终用户而言,性能和定价非常相似,而企业管理员可能会发现将 Linux 与 Windows 和 Azure 特定部署并置的能力是有利的。虽然在 Azure 云中运行 Linux 可能看起来像企鹅在魔多搭帐篷,但在云领域中增加一个高质量的参与者对所有人来说都是好消息。