如何用命令行在windows Azure上安装负载平衡的web Farm虚拟机(linux或其他)

 [原文发表地址]How to setup a Load Balanced Web Farm of Virtual Machines(Linux or otherwise)on Windows Azure(command line) [原文发表时间] 2013-05-13

我一哥们考虑把他的一些基于linux的网站移到Azure上。如果你现在的网站是node.js、ASP、ASP.NET或PHP做的,使用Azure Web站点是最容易的。我会在这篇文章里向你展示如何在几分钟内用Git安装Azure web站点。它们对你隐藏了底层操作系统,自动更新,易扩展,而且共享硬盘。

然而,他喜欢虚拟机和虚拟机赋予他的控制,另外他可以到处运行,移动东西,控制他的世界。

我会在Azure上使用开源的(GitHub)跨平台CLI工具(命令行接口)。如果你有node package manager你可以使用“npm install azure-cli--global”命令导入你的签名。你也可以从www.windowsazure.com下载安装命令行工具。

设立一个linux虚拟机

我们会用门户创建一个初步的虚拟机(我会向你展示如何在一分钟内用命令行做到)。这个虚拟机会被用来设立一个虚拟机镜像模版。我要创建一个Ubuntu 13.04服务器,然后安装Apache和PHP。然后我就捕获了一个我现在安装的机器的通用的镜像,可以被拷贝添加到场中。这个镜像将会在Azure 门户的“我的镜像”里显示。

注意:在Open Tech VM Depot上有个很棒的社区驱动的关于准备虚拟机镜像的类别。这像是最值得保存的Azure秘密。我待会儿会在上面发布,但这确实值得深入查看一下。

从Azure门户开始,我开始新建|虚拟机|然后选择Ubuntu Server 13.04。

clip_image001

名字不重要,但我要配置一个用户名和密码(或者使用SSH密钥):

clip_image002

注意我要创建一个独立的虚拟机了:

clip_image003

贴士: 如果我根本不想用门户创建虚拟机,我甚至可以通过命令行编程来发现虚拟机镜像,

然后创建虚拟机实例。使用“azure vm list”命令能帮我获取到可选取的虚拟机列表。我想

要的那个Ubuntu是“Ubuntu-13_04-amd64-server-20130501-en-us-30GB”(名字里带了个guid)。所以我只要键入“azure vm create MyDNSName ImageName [options]”处理他们。

一旦这个linux虚拟机启动,我会通过SSH进入。你可以看到Azure已经为虚拟机内部的SSH端口22随机匹配了一个高数值的公共端口。

clip_image004

我用SSH进去。我将要添加Apache,PHP,重启apache,然后添加一个test.php,这会显示PHP和当前的IP地址输出都正常工作,如此我就知道哪台机器处理的请求。

 sudo apt-get install apache2
sudo apt-get install libapache2-mod-php5 php5

我将添加一个 test.php

 sudo nano /var/www/test.php
 然后输入
 <?php echo gethostbyname(trim(`hostname`)); ?>

<?php phpinfo(); ?>

接着我将退出SSH。虚拟机默认被锁上了,所以为了测试这个我要添加一个终端。我可以通过门户来做,但我更想看看可否通过Azure命令行来做。

运行vm endpoint create来匹配外部的80端口到内部的80端口。

 azure vm endpoint create mylinuxtemplate 80 80

这时候我可以点击mylinuxtemplate.cloudapp.net:80/test.php看是否工作。

clip_image005

酷。这样我已经得到了我想要的linux虚拟机模版。现在我想把它“捕获”成镜像,这样就可以做的更多。这个linux上的“waagent”和windows上的“sysprep”一样。

通过SSH会话,运行waagent -deprovision。

 ~$ sudo waagent -deprovision

scott@mylinuxtemplate:~$ sudo waagent -deprovision

WARNING! The waagent service will be stopped.

WARNING! All SSH host key pairs will be deleted.

WARNING! Nameserver configuration in /etc/resolvconf/resolv.conf.d/{tail,originial} will be deleted.

WARNING! Cached DHCP leases will be deleted.

WARNING! root password will be disabled. You will not be able to login as root.

Do you want to proceed (y/n)? y
 WINDOWS用户: 如果你是windows用户,你可以用你喜欢的方式安装windows,
 然后运行%windir%\system32\sysprep.exe,
 获得一个虚拟机的镜像然后像这篇博文里一样操作。

我可以关机并从门户获得一个镜像,但是再一次,今天我们要玩命令行。注意,关机可能要花一点时间。

 azure vm shutdown mylinuxtemplate

azure vm capture mylinuxtemplate hanselmanlinuxwebfarmimage –delete
 capture命令会删除虚拟机。记住这只是个模版。然而,我有一个可重用的镜像!我可以看到azure虚拟机列表里的镜像都可用,包括用户镜像和gallery镜像。

注意: 当你删除虚拟机,你只是删除了虚拟机的配置。你没有删除相关的硬盘,这让你可以

再次启动虚拟机。如果你真的想移除这些东西,确保你删除了虚拟机实例删除了硬盘

通过命令行创建一个linux虚拟机场中

现在我的存储账户里有了一个镜像,可以用它创建N个虚拟机。我要开始建一个虚拟机。建完后我可以在“azure站点列表”里看到它启动。当机器准备就绪,我可以做的更多!确保你使用--ssh switch否则你无法通过SSH进入机器!

 C:\>;; azure vm create hanselmanlinuxfarm hanselmanlinuxwebfarmimage scott MyPassword123 --location "West US" --ssh

info: Executing command vm create

+ Looking up image

+ Looking up cloud service

+ Creating cloud service

+ Creating VM

info: vm create command OK

C:\>;; azure vm list

info: Executing command vm list

+ Fetching VMs

data: DNS Name VM Name Status

data: ------------------------------- ------------------ ----------

data: hanselmanlinuxfarm.cloudapp.net hanselmanlinuxfarm CreatingVM

info: vm list command OK

C:\>;; azure vm list

info: Executing command vm list

+ Fetching VMs

data: DNS Name VM Name Status

data: ------------------------------- ------------------ ---------

data: hanselmanlinuxfarm.cloudapp.net hanselmanlinuxfarm ReadyRole

info: vm list command OK
 奇怪: Azure有个概念叫“云服务”,这是个很烂的名字。对我们来说,就把它当作我们虚拟 
机的容器吧。这是个逻辑上的容器,会包含并关联所有的虚拟机(和其他的云之类的东西) 
到一起。当你有一个虚拟机的时候,你将有一个云服务关联到它,但你在门户上看不到这个 
云服务,因为还没有真正用到。当你在一个容器中有两个虚拟机,接着你就会发现门户里出 
现了“容器”云服务。

我现在已经创建了一个hanselmanlinuxfarm 虚拟机,所以也就有了一个hanselmanlinuxfarm 云服务“容器”。现在,我要创建更多的虚拟机,但要和第一台虚拟机连接起来。有两种方法。第一种,用命令行里的connect选项。注意,如果你在意的话,你不用这样控制你的虚拟机名字。如果你有上百台机器,你一定不想这样做。

命令行会发现存在的云服务(还是,“容器”),然后创建一个新的虚拟机。我将运行这个命令两次,这样我总共将有3台虚拟机。

很重要: 在第二台虚拟机上用到的connect命令被称作key。这创建了第二台(以后还有N+1)虚拟机并添加到一样的云服务“容器”。看起来这些虚拟机都互相关联。下一台虚拟机的名字将是-2,接着-3,等等。但他们也用一样的外部名字,像hanselmanlinuxfarm.cloudapp.net。

我将这样做两次,每次使用不同的SSH端口号来匹配内部的22端口号。如果我不想SSH暴露在外面,之后可以删除公共终端。

 C:\>; azure vm create --connect hanselmanlinuxfarm hanselmanlinuxwebfarmimage scott MyPassword --ssh 12345

info: Executing command vm create

+ Looking up image

+ Looking up cloud service

+ Getting cloud service properties

+ Looking up deployment

+ Creating VM

info: vm create command OK
 当创建一个linux虚拟机的时候,你必须添加一个--ssh标识到命令行否则你将无法通过SSH进去。确保添加高数值的端口号,
 这样你可以匹配端口22,比如12346->22等等。如果你通过门户创建的这些虚拟机,会随机给你分配端口。当你通过命令行
 做的时候要自己选择。这会儿,azure vm list显示我有三台。两台已经准备就绪,最后一台现在被创建好了。
 你可以看到这些虚拟机在同样的云服务“容器”里运行,因为DNS名是一样的。这些虚拟机正式称呼是“farm”。
 C:\>; azure vm list

info: Executing command vm list

+ Fetching VMs

data: DNS Name VM Name Status

data: ------------------------------- -------------------- ----------

data: hanselmanlinuxfarm.cloudapp.net hanselmanlinuxfarm ReadyRole

data: hanselmanlinuxfarm.cloudapp.net hanselmanlinuxfarm-2 ReadyRole

data: hanselmanlinuxfarm.cloudapp.net hanselmanlinuxfarm-3 CreatingVM

info: vm list command OK 
 好了,现在通过门户创建第四台虚拟机,只是给你看看。

通过门户创建一个linux虚拟机并添加到farm场中

就像你知道的,你也可以从门户添加虚拟机到你的场中。

clip_image006

给你的新虚拟机起个名字,然后“连接到一个已有的虚拟机”。我不喜欢这表述,我也很好

奇你是怎么想的。基本上这里的意思是“添加这个虚拟机到虚拟机集合中”。这无关那个你

从下拉列表中选取的,只要你从云服务“容器”中选取一个。

clip_image007

我不会点击OK,但如果我点击了,这会儿我已经有第四台虚拟机了,这个是通过门户创建的。

让我的linux虚拟机场中负载平衡

我已经有了三个一样的虚拟机运行着Apache和PHP还有我的test.php页面。

 C:\>; azure vm list

info: Executing command vm list

+ Fetching VMs

data: DNS Name VM Name Status

data: ------------------------------- -------------------- ---------

data: hanselmanlinuxfarm.cloudapp.net hanselmanlinuxfarm ReadyRole

data: hanselmanlinuxfarm.cloudapp.net hanselmanlinuxfarm-2 ReadyRole

data: hanselmanlinuxfarm.cloudapp.net hanselmanlinuxfarm-3 ReadyRole



info: vm list command OK
 
 让我打开这三台机器上的80端口。我想让它们负载平衡但是不行,这是匹配单一非负载平衡的端口方法。
 azure vm endpoint create hanselmanlinuxfarm 80 80

azure vm endpoint create hanselmanlinuxfarm-2 80 80

azure vm endpoint create hanselmanlinuxfarm-3 80 80

为了负载平衡的端口我需要使用“create-multiple”。我不仅想一次打开多个端口,为了负载平衡我还想要一个探索安装。例如,我用http,如果有从test.php返回的200个结果,我会希望虚拟机从场中中拉出来。如果30秒内没有回应,也将会把虚拟机从回转中拉回来。

这里我创建了这些80端口到80端口的匹配,但还更多的监控test.php,不只一个HTTP 200状态。

 azure vm endpoint create-multiple hanselmanlinuxfarm 80:80:HttpTrafficIn:http:80:/test.php

azure vm endpoint create-multiple hanselmanlinuxfarm-2 80:80:HttpTrafficIn:http:80:/test.php

azure vm endpoint create-multiple hanselmanlinuxfarm-3 80:80:HttpTrafficIn:http:80:/test.php
  

这里的“HttpTrafficIn”就是我所说的负载平衡集的名字。

注意: 我在做一个拉取请求来添加一个通过终端命令查看探索路径的功能,但现在你可以在

“azure vm show”里看到:

 C:\>;azure vm show hanselmanlinuxfarm

info: Executing command vm show

+ Fetching VM

data: DNSName "hanselmanlinuxfarm.cloudapp.net"

data: VMName "hanselmanlinuxfarm"

data: IPAddress "100.68.xx.xx"

data: InstanceStatus "RoleStateUnknown"

data: InstanceSize "Small"

data: InstanceStateDetails ""

data: OSVersion ""

data: Image "hanselmanlinuxwebfarmimage"

data: DataDisks ""

data: Network Endpoints 0 LoadBalancedEndpointSetName "HttpTrafficIn"

data: Network Endpoints 0 LocalPort "80"

data: Network Endpoints 0 Name "endpname-80-80"

data: Network Endpoints 0 Port "80"

data: Network Endpoints 0 LoadBalancerProbe Path "/test.php"

data: Network Endpoints 0 LoadBalancerProbe Port "80"

data: Network Endpoints 0 LoadBalancerProbe Protocol "http"

data: Network Endpoints 0 Protocol "tcp"

data: Network Endpoints 0 Vip "137.135.xx.xx"

info: vm show command OK
  

好,现在我们来看一下我是不是已经有一个负载平衡的场中。

注意: 为了从你的Azure虚拟机(或其他云虚拟机)获得最好的性能,考虑放入一些像

MySQL/PostgreS 数据库,放到不同的盘上,用不同的缓存大小。你要让系统盘和数据盘分开。例如,我有一个windows 虚拟机运行MySQL。系统盘在一个标准的30G的盘上,但MySQL数据库在单独的一个5G的附加的盘上。这让东西分开,整洁,并且性能更好。

查看我的新场中

如果我登入门户,我可以看到每个独立的虚拟机或把场中看成一个“云服务”。懂吗?

clip_image008

clip_image009

让我的farm更可靠

我想确信我的新虚拟机都在Azure数据中心的不同机架上。我知道它们在“West US”,因为

我把它们放在那里,但我不清楚它们是在一个机架上还是相邻的或是其他什么。因为一个机

架在一个“错误域”中,意味着一个机架可能,我不知道,自爆?我想告诉Azure,所有这些

虚拟机都是一个“可用集”的一部分。这个名字是我用在虚拟机上的,意思是“通过把它们分开让这些机器具可用性”。

从门户上我将选择第一台虚拟机并选择配置,然后创建一个可用集。我把它命名为“hanselmanlinux”,但它可以是任何名字。

clip_image010

添加可用集意味着Azure可以移动我的虚拟机到数据中心的其他任何地方,而且这可能需要重启。有时候很快,有时候要花一到十分钟,看最初大小。所以要明白,放在这个集的东西要小。

当这些做好后,转头去把其他的虚拟机一个个添加到一样的可用集里。这看起来像是在门户

中,现在我保证了我的三台虚拟机都在不同的错误域(机架)上。

clip_image011

点击我的web farm

现在我可以点击hanselmanlinuxfarm.cloudapp.net/test.php并看到IP改变(还有在门户中

看到cup利用率的改变)或者甚至可以通过SSH观察HTOP,得到一个实时的视图。嗨,我已经有一个小的Linux farm了!

clip_image012

这里有我用SSH进入其中一个,看看htop(比top还棒)

clip_image013

我的完整脚本,总结

这里是我的完整脚本。我使用azure vm image list | find /I "13_04"来发现一个Ubuntu镜像。我也可以用bash完成它。

 C:\>;azure vm image list | find /i "13_04"

data: b39f27a8b8c64d52b05eac6a62ebad85__Ubuntu-13_04-amd64-server-20130423-en-us-30GB

data: b39f27a8b8c64d52b05eac6a62ebad85__Ubuntu-13_04-amd64-server-20130501-en-us-30GB

data: b39f27a8b8c64d52b05eac6a62ebad85__Ubuntu_DAILY_BUILD-raring-13_04-amd64-server-20130511-en-us-30GB

data: b39f27a8b8c64d52b05eac6a62ebad85__Ubuntu_DAILY_BUILD-raring-13_04-amd64-server-20130515-en-us-30GB

data: b39f27a8b8c64d52b05eac6a62ebad85__Ubuntu_DAILY_BUILD-raring-13_04-amd64-server-20130517-en-us-30GB

data: b39f27a8b8c64d52b05eac6a62ebad85__Ubuntu_DAILY_BUILD-raring-13_04-amd64-server-20130518-en-us-30GB

data: b39f27a8b8c64d52b05eac6a62ebad85__Ubuntu_DAILY_BUILD-raring-13_04-amd64-server-20130521-en-us-30GB
  

一旦我发现一个镜像,我用命令行在自己选定的路径下创建我的第一个虚拟机。再次,这是

linux,不要忘了-ssh

 azure vm create mylinuxtemplate b39f27a8b8c64d52b05eac6a62ebad85__Ubuntu-13_04-amd64-server-20130501-en-us-30GB scott MyPassword --location "West US" --ssh

用你喜欢的方式得到它。用SSH进入,安装,运行waagent来准备。关闭并捕获它。

 azure vm shutdown mylinuxtemplate

azure vm capture mylinuxtemplate mylinuxfarmimage --delete

最终,这里有个基础脚本文件来安装5台虚拟机。记住第一条命令不同于后面的。当然,用

bash你可以make一个叫“spinup5” 的脚本并以你想要的方式自动化。在终端创建中HTTP探测器是可选的。

 azure vm create hanselmanlinuxfarm hanselmanlinuxwebfarmimage scott password --location "West US" --ssh

azure vm create --connect hanselmanlinuxfarm hanselmanlinuxwebfarmimage scott password --ssh 12345

azure vm create --connect hanselmanlinuxfarm hanselmanlinuxwebfarmimage scott password --ssh 12346

azure vm create --connect hanselmanlinuxfarm hanselmanlinuxwebfarmimage scott password --ssh 12347

azure vm create --connect hanselmanlinuxfarm hanselmanlinuxwebfarmimage scott password --ssh 12348

azure vm endpoint create-multiple hanselmanlinuxfarm 80:80:HttpTrafficInLhttp:80:/test.php

azure vm endpoint create-multiple hanselmanlinuxfarm-2 80:80:HttpTrafficInLhttp:80:/test.php

azure vm endpoint create-multiple hanselmanlinuxfarm-3 80:80:HttpTrafficInLhttp:80:/test.php

azure vm endpoint create-multiple hanselmanlinuxfarm-4 80:80:HttpTrafficInLhttp:80:/test.php

azure vm endpoint create-multiple hanselmanlinuxfarm-5 80:80:HttpTrafficInLhttp:80:/test.php
  

这些都运行完后,我进到门户并手动安装可用集。现在还只能用powershell,但很快就可用跨平台工具来设置可用集了!

下次,也许我会尝试“azure vm scale”移动这些小虚拟机到8处理器56G的大机器上。