[Azure]Application Gateway(应用程序网关)实验参考



关于Azure Application Gateway的使用方法,请参考下面的几个链接:

中文链接:

Introduction: http://www.windowsazure.cn/home/features/application-gateway

Configuration: http://www.windowsazure.cn/documentation/articles/application-gateway-create-gateway

英文链接:

Introduction: https://azure.microsoft.com/en-us/documentation/articles/application-gateway-introduction/

Http LB: https://azure.microsoft.com/en-us/documentation/articles/application-gateway-create-gateway/?cdn=disable

SSL Offload: https://azure.microsoft.com/en-us/documentation/articles/application-gateway-ssl/?cdn=disable

ILB: https://azure.microsoft.com/en-us/documentation/articles/application-gateway-ilb/

 

一篇比较好的Blog

http://www.redbaronofazure.com/?p=4281

 

从官方的介绍里面,我们看到Application Gateway主要有三个应用场景或者说特点:

  1. HTTP load balancing(在应用层的负载均衡)

  2. Cookie based session affinity(基于Cookie的会话保持功能)

  3. SSL offloadSSL卸载,即通过applicationgateway实现ssl配置以减轻服务器压力)

另外除了配置SLB外,也可以使用Application Gateway实现ILB,即Application Gateway作为ILB中的Loadbalancer。(这个作为第四点实验)

针对上面的四种情况,我们后面会分别进行实验。

 

准备工作:

我们首先需要一个虚拟网络,创建拓扑大致如下(子网数量无要求):

[Azure]Application Gateway(应用程序网关)实验参考_第1张图片 

AppSubnet用于放置ApplicationGateway,这个是根据官网上面的要求,Application Gateway需要放在独立的子网中。

Subnet-1/2/3用来部署虚拟机。(Gateway子网为VPN所使用,这里请忽略)

 

子网中虚拟机的分布情况:

[Azure]Application Gateway(应用程序网关)实验参考_第2张图片

HTTP load balancingCookie based session affinity

首先针对负载均衡进行最基本的配置,即实现HTTP负载均衡:

我们先在两台虚拟机中搭建两个HTTP站点。

 

然后我们使用下面的命令创建一个Application Gateway(高亮的为参数需要修改):

New-AzureApplicationGateway –Name DanAppGwTest –VnetName DanEastVNET -Subnets AppSubnet

创建过程可能需要一段时间。

 

创建完成后使用下面的命令可以查看到Application Gateway的信息,包括其公网IPDNS名称,所属的虚拟网络名称和子网名称,Size等等:

Get-AzureApplicationGateway -Name DanAppGwTest

[Azure]Application Gateway(应用程序网关)实验参考_第3张图片

创建完成Application Gateway后,我们需要使用XML文件进行配置(推荐),或者使用Powershell Object进行配置(步骤较多,比较繁琐,不推荐)。

XML配置文件基本内容如下:

xml version="1.0" encoding="utf-8"?>

<ApplicationGatewayConfiguration xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.microsoft.com/windowsazure">

    <FrontendPorts>

        <FrontendPort>

       

            <Name>FrontendPort1Name>

            <Port>80Port>

        FrontendPort>

    FrontendPorts>

    <BackendAddressPools>

        <BackendAddressPool>

       

            <Name>BackendPool1Name>

            <IPAddresses>

                <IPAddress>10.0.0.8IPAddress>

                <IPAddress>10.0.0.36IPAddress>

            IPAddresses>

        BackendAddressPool>

    BackendAddressPools>

    <BackendHttpSettingsList>

        <BackendHttpSettings>

       

            <Name>BackendSetting1Name>

            <Port>80Port>

            <Protocol>HttpProtocol>

           

            <CookieBasedAffinity>EnabledCookieBasedAffinity>

        BackendHttpSettings>

    BackendHttpSettingsList>

    <HttpListeners>

        <HttpListener>

       

            <Name>HTTPListener1Name>

            <FrontendPort>FrontendPort1FrontendPort>

            <Protocol>HttpProtocol>

        HttpListener>

    HttpListeners>

    <HttpLoadBalancingRules>

        <HttpLoadBalancingRule>

       

            <Name>HttpLBRule1Name>

            <Type>basicType>

            <BackendHttpSettings>BackendSetting1BackendHttpSettings>

            <Listener>HTTPListener1Listener>

            <BackendAddressPool>BackendPool1BackendAddressPool>

        HttpLoadBalancingRule>

    HttpLoadBalancingRules>

ApplicationGatewayConfiguration>

 

关于FrontendPortBackendAddressPoolBackendHttpSettingsHttpListenerHttpLoadBalancingRule的对应关系,可以参考下面这个对应关系图:

[Azure]Application Gateway(应用程序网关)实验参考_第4张图片 

按照上面的编辑完成后,我们实现了下面的一些功能:

  1. 10.0.0.810.0.0.36两台虚拟机80端口的http负载均衡(基于轮询)

  2. 启用了基于Cookie的保持会话功能(EnableCookieBasedAffinity这个选项)

 

然后我们将上面的xml文件保存,在Azure Powershell中通过如下命令将xml文件的配置上传到Application Gateway中(C:\Users\han.xu3\Desktop\AppGWCfg.xmlxml文件路径,DanAppGwTestApplicationGateway的名称):

Set-AzureApplicationGatewayConfig -Name DanAppGwTest -ConfigFile C:\Users\han.xu3\Desktop\AppGWCfg.xml

 

配置完成后,我们就可以在浏览器里使用Application GatewayDNS名称来访问其80端口的服务了:

 [Azure]Application Gateway(应用程序网关)实验参考_第5张图片


通过抓取http报文,可以看到在第一次访问的时候,服务器返回的报文中会有一个SetCookie字段,告诉客户端保存ARRAffinityCookie并在下次请求时携带次Cookie

[Azure]Application Gateway(应用程序网关)实验参考_第6张图片

然后客户端再次请求页面的时候就会带上该Cookie

[Azure]Application Gateway(应用程序网关)实验参考_第7张图片

这个Cookie就是用来保持会话的Cookie,通过这个CookieApplication Gateway可以保证在Cookie过期前始终将来自同一个客户端的请求始终转发到同一台后端的server上。

 

关于ARRAffinity的相关说明请参考下面的链接:

http://blogs.msdn.com/b/azchina/archive/2013/11/21/disabling-arr-s-instance-affinity-in-windows-azure-web-sites.aspx

 

要禁用回话保持功能,有两种不同的方法可以实现:

可以在虚拟机Web站点的WebConfig.xml文件中添加下面的配置项(修改完要restart iis中的website):

 [Azure]Application Gateway(应用程序网关)实验参考_第8张图片


或者可以将我们前面对Application Gateway配置的xml文件中的CookieBasedAffinity的值修改为Disabled

<CookieBasedAffinity>DisabledCookieBasedAffinity>

然后再重新对Application Gateway应用配置:

Set-AzureApplicationGatewayConfig -NameDanAppGwTest -ConfigFile C:\Users\han.xu3\Desktop\AppGWCfg.xml

 

上面两种方法的任意一种配置完成后,清空本地的Cache或者换一台机器再次访问,抓包可以看到,已经没有ARRAffinityCookie了:

 [Azure]Application Gateway(应用程序网关)实验参考_第9张图片


SSL offload配置实验:

完成实验前,我们需要一个pfx证书,如果没有公共CA颁发的证书,可以通过makecert工具自己创建一个用于实验,需要用到makecertpvk2pfx工具。

创建脚本如下:

makecert -r -pe -n "CN=64dc1ad1-29ad-4bca-bed6-5fc25efaede4.chinacloudapp.cn"-sky exchange ".\64dc1ad1-29ad-4bca-bed6-5fc25efaede4.chinacloudapp.cn.cer"-sv ".\64dc1ad1-29ad-4bca-bed6-5fc25efaede4.chinacloudapp.cn.pvk"

pvk2pfx -pvk ".\64dc1ad1-29ad-4bca-bed6-5fc25efaede4.chinacloudapp.cn.pvk"-spc ".\64dc1ad1-29ad-4bca-bed6-5fc25efaede4.chinacloudapp.cn.cer"-pfx ".\64dc1ad1-29ad-4bca-bed6-5fc25efaede4.chinacloudapp.cn.pfx"-pi 1qaz2wsxE

其中64dc1ad1-29ad-4bca-bed6-5fc25efaede4.chinacloudapp.cn是我们ApplicationGatewayDNS名称,1qaz2wsxE是我们为这个证书设置的密码。

 

设置完成后,我们通过Azure Powershell将生成的pfx证书上传到Application Gateway中:

Add-AzureApplicationGatewaySslCertificate-Name DanAppGwTest-CertificateName GWCert-Password 1qaz2wsxE-CertificateFile C:\Users\han.xu3\Desktop\64dc1ad1-29ad-4bca-bed6-5fc25efaede4.chinacloudapp.cn.pfx

(其中GWCert是证书名称)

上传完成后,使用下面的命令可以查看上传的pfx证书信息:

Get-AzureApplicationGatewaySslCertificate-Name DanAppGwTest

 [Azure]Application Gateway(应用程序网关)实验参考_第10张图片


上传完成后我们需要进一步修改前面配置Application Gatewayxml文件:

xml version="1.0" encoding="utf-8"?>

<ApplicationGatewayConfiguration xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.microsoft.com/windowsazure">

    <FrontendPorts>

        <FrontendPort>

       

            <Name>FrontendPort1Name>

            <Port>80Port>

        FrontendPort>

        <FrontendPort>

            <Name>FrontendPort2Name>

            <Port>443Port>

        FrontendPort>

    FrontendPorts>

    <BackendAddressPools>

        <BackendAddressPool>

       

            <Name>BackendPool1Name>

            <IPAddresses>

                <IPAddress>10.0.0.8IPAddress>

                <IPAddress>10.0.0.36IPAddress>

            IPAddresses>

        BackendAddressPool>

    BackendAddressPools>

    <BackendHttpSettingsList>

        <BackendHttpSettings>

       

            <Name>BackendSetting1Name>

            <Port>80Port>

            <Protocol>HttpProtocol>

           

            <CookieBasedAffinity>EnabledCookieBasedAffinity>

        BackendHttpSettings>

    BackendHttpSettingsList>

    <HttpListeners>

        <HttpListener>

       

            <Name>HTTPListener1Name>

            <FrontendPort>FrontendPort1FrontendPort>

            <Protocol>HttpProtocol>

        HttpListener>

        <HttpListener>

            <Name>HTTPListener2Name>

            <FrontendPort>FrontendPort2FrontendPort>

            <Protocol>HttpsProtocol>

            <SslCert>GWCertSslCert>

        HttpListener>

    HttpListeners>

    <HttpLoadBalancingRules>

        <HttpLoadBalancingRule>

       

            <Name>HttpLBRule1Name>

            <Type>basicType>

            <BackendHttpSettings>BackendSetting1BackendHttpSettings>

            <Listener>HTTPListener1Listener>

            <BackendAddressPool>BackendPool1BackendAddressPool>

        HttpLoadBalancingRule>

        <HttpLoadBalancingRule>

            <Name>HttpLBRule2Name>

            <Type>basicType>

            <BackendHttpSettings>BackendSetting1BackendHttpSettings>

            <Listener>HTTPListener2Listener>

            <BackendAddressPool>BackendPool1BackendAddressPool>

        HttpLoadBalancingRule>

    HttpLoadBalancingRules>

ApplicationGatewayConfiguration>

上面高亮的部分是我们修改的部分,其中添加了443作为HTTPS的前端端口,HTTPListener2与该端口进行绑定,并绑定了我们上传的证书,HttpLBRule2server及服务端口,Listener进行了绑定。由于是测试,所以我们没有移除HTTP的配置,所以此时使用HTTPHTTPS都可以正常访问,并且server端都是使用80端口响应。

 

然后通过Azure Powershell将配置文件更新:

Set-AzureApplicationGatewayConfig -Name DanAppGwTest -ConfigFile C:\Users\han.xu3\Desktop\AppGWCfg.xml

 

更新完成后,可以通过https来访问了(由于是我们自签名的证书,所以不受信任会显示Certificate Error):

[Azure]Application Gateway(应用程序网关)实验参考_第11张图片

可以查看网页的证书看到正是我们上传的pfx证书:

[Azure]Application Gateway(应用程序网关)实验参考_第12张图片 


ILB配置实验:

这里我们继续在前面的基础上修改xml文件来实现ILB。配置文件修改如下:

xml version="1.0" encoding="utf-8"?>

<ApplicationGatewayConfiguration xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.microsoft.com/windowsazure">

    <FrontendIPConfigurations>

        <FrontendIPConfiguration>

            <Name>fip1Name>

            <Type>PrivateType>

            <StaticIPAddress>10.0.0.109StaticIPAddress>

        FrontendIPConfiguration>

    FrontendIPConfigurations>

  <FrontendPorts>

        <FrontendPort>

       

            <Name>FrontendPort1Name>

            <Port>80Port>

        FrontendPort>

        <FrontendPort>

            <Name>FrontendPort2Name>

            <Port>443Port>

        FrontendPort>

    FrontendPorts>

    <BackendAddressPools>

        <BackendAddressPool>

       

            <Name>BackendPool1Name>

            <IPAddresses>

                <IPAddress>10.0.0.8IPAddress>

                <IPAddress>10.0.0.36IPAddress>

            IPAddresses>

        BackendAddressPool>

    BackendAddressPools>

    <BackendHttpSettingsList>

        <BackendHttpSettings>

       

            <Name>BackendSetting1Name>

            <Port>80Port>

            <Protocol>HttpProtocol>

           

            <CookieBasedAffinity>EnabledCookieBasedAffinity>

        BackendHttpSettings>

    BackendHttpSettingsList>

    <HttpListeners>

        <HttpListener>

       

            <Name>HTTPListener1Name>

            <FrontendIP>fip1FrontendIP>

            <FrontendPort>FrontendPort1FrontendPort>

            <Protocol>HttpProtocol>

        HttpListener>

        <HttpListener>

            <Name>HTTPListener2Name>

            <FrontendIP>fip1FrontendIP>

            <FrontendPort>FrontendPort2FrontendPort>

            <Protocol>HttpsProtocol>

            <SslCert>GWCertSslCert>

        HttpListener>

    HttpListeners>

    <HttpLoadBalancingRules>

        <HttpLoadBalancingRule>

       

            <Name>HttpLBRule1Name>

            <Type>basicType>

            <BackendHttpSettings>BackendSetting1BackendHttpSettings>

            <Listener>HTTPListener1Listener>

            <BackendAddressPool>BackendPool1BackendAddressPool>

        HttpLoadBalancingRule>

        <HttpLoadBalancingRule>

            <Name>HttpLBRule2Name>

            <Type>basicType>

            <BackendHttpSettings>BackendSetting1BackendHttpSettings>

            <Listener>HTTPListener2Listener>

            <BackendAddressPool>BackendPool1BackendAddressPool>

        HttpLoadBalancingRule>

    HttpLoadBalancingRules>

ApplicationGatewayConfiguration>

这里在重新配置Application Gateway之前,先做一个实验,我们从网络划分中看到Application GatewayDIP范围是在10.0.0.108-10.0.0.110之间的,所以我们找一台虚拟网络内的虚拟机测试一下,发现Application GatewayDIP是该子网内的第一个IP

[Azure]Application Gateway(应用程序网关)实验参考_第13张图片

同时也可以访问80443的服务:

[Azure]Application Gateway(应用程序网关)实验参考_第14张图片

我们将xml配置文件更新到Application Gateway中(使用Azure Powershell)之后,就可以使用10.0.0.109来访问80443的服务了,此时10.0.0.108仍然可以访问,并且我们ping一下10.0.0.109发现无法连通:

[Azure]Application Gateway(应用程序网关)实验参考_第15张图片

这说明我们修改配置文件并不是重置Application GatewayDIP,只是实现了转发功能而已。

 

以上为关于Application Gateway的全部实验内容,基本覆盖了所有的功能特性,具体的使用案例可以在具体遇到问题时进行解决。

 

如果有什么不清楚的地方,欢迎随时讨论。

你可能感兴趣的:(Azure)