分享

OpenStack Heat模板学习二 之LBaaS(负载均衡即服务)

52Pig 发表于 2014-10-8 22:53:23 [显示全部楼层] 只看大图 回帖奖励 阅读模式 关闭右栏 0 37508
本帖最后由 52Pig 于 2014-10-8 22:53 编辑

阅读导读:
1.HOT的spec文档包含哪些内容?
2.public网络和路由器是通过什么相连的?



4.gif

理解好了hello world HOT 模板,然后接下来就可以看HOT的spec文档了,包括Structure,PGS,PS,RS,OS以及Intrinsic Functions
现在Heat支持的Resource类型可以在http://docs.openstack.org/develo ... uide/openstack.html上找到,下面主要探索advancedservices(LB,FW,VPN)的相关模板,需要在阅OpenStack Resource Types 以及的前提下,才能了解下面模板的具体含义。
Loadbalancer 模板
接下来首先根据下手做一个Loadbalancer模板,网络拓扑图如下:

openstack.png

如上图所示,我们的服务器网络的网址范围为10.0.0.0/24,负载均衡器网络的网址范围是192.168.40.0/24,public网络链接办公网络,网址范围是192.168.10.224/28。路由器链接了所有三个网络。public网络和路由器是通过路由器的”网关臂(NeutronAPI中router的gateway)”相连的。路由器把服务器网络和负载均衡器网络的IP地址SNAT成路由器的”网关臂”在public网络的地址。这样他们就可以访问办公网络的IP啦。但是如果要想从办公网络访问服务器网络和负载均衡器网络,我们还需要动态地址(FloatingIP)。

Network 设备及拓扑
  1. public_net: 192.168.10.224/28
  2. lb_net:  192.168.40.0/24
  3. server_net: 10.0.0.0/24
  4. router: {
  5. gateway: <from public_net>,
  6. interface1: lb_net,
  7. interface2: server_net
  8. }
复制代码
根据以上信息:设置LB网络拓扑图模板network_topology.template如下,注意在这之前你可能需要清理网络拓扑环境,然后设置合适的br-ex配置(sudo ifconfig br-ex 192.168.10.225netmask 255.255.224.0 up),方能够访问public_net:
  1. heat_template_version: 2013-05-23  
  2.   
  3. description: >  
  4.     network topology deployment HOT template reference to  
  5.     http://www.ustack.com/blog/neutron_loadbalance/  
  6.   
  7. parameters:  
  8.     public_net_name:  
  9.         type: string  
  10.         label: Public Network Name  
  11.         default: public_net  
  12.     lb_net_name:  
  13.         type: string  
  14.         label: Loadbalancer Network Name  
  15.         default: lb_net  
  16.     server_net_name:  
  17.         type: string  
  18.         label: Web Servers Network Name  
  19.         default: server_net  
  20.     public_subnet_name:  
  21.         type: string  
  22.         label: Public Subnet Name  
  23.         default: public_subnet  
  24.     public_subnet_cidr:  
  25.         type: string  
  26.         label: Public Subnet CIDR  
  27.         default: 192.168.10.224/28  
  28.     lb_subnet_name:  
  29.         type: string  
  30.         label: Loadbalancer Subnet Name  
  31.         default: lb_subnet  
  32.     lb_subnet_cidr:  
  33.         type: string  
  34.         label: Loadbalancer Subnet CIDR  
  35.         default: 192.168.40.0/24  
  36.     server_subnet_name:  
  37.         type: string  
  38.         label: Web Servers Subnet Name  
  39.         default: server_subnet  
  40.     server_subnet_cidr:  
  41.         type: string  
  42.         label: Web Servers Subnet CIDR  
  43.         default: 10.0.0.0/24  
  44.     router_name:  
  45.         type: string  
  46.         label: The Router Name  
  47.         default: router  
  48.   
  49. outputs:  
  50.     public_net_id:  
  51.         description: Public Network uuid  
  52.         value: {get_resource: public_net}  
  53.     lb_subnet_id:  
  54.         description: Loadbalancer Subnet uuid  
  55.         value: {get_resource: lb_subnet}  
  56.     lb_subnet_gateway:  
  57.         description: Loadbalancer Subnet Gateway  
  58.         value: {get_attr: [lb_subnet, gateway_ip]}  
  59.     lb_subnet_cidr:  
  60.         description: Loadbalancer Subnet CIDR  
  61.         value: {get_attr: [lb_subnet, cidr]}  
  62.     server_net_id:  
  63.         description: Web Servers Network uuid  
  64.         value: {get_resource: server_net}  
  65.     server_subnet_gateway:  
  66.         description: Web Servers Subnet Gateway  
  67.         value: {get_attr: [server_subnet, gateway_ip]}  
  68.     server_subnet_cidr:  
  69.         description: Web Servers Subnet CIDR  
  70.         value: {get_attr: [server_subnet, cidr]}  
  71.       
  72.   
  73. resources:  
  74.     public_net:  
  75.         type: OS::Neutron::Net  
  76.         properties:  
  77.             name: {get_param: public_net_name}  
  78.             shared: True  
  79.             value_specs: {"router:external": True}  
  80.     lb_net:  
  81.         type: OS::Neutron::Net  
  82.         properties:  
  83.             name: {get_param: lb_net_name}  
  84.     server_net:  
  85.         type: OS::Neutron::Net  
  86.         properties:  
  87.             name: {get_param: server_net_name}  
  88.     public_subnet:  
  89.         type: OS::Neutron::Subnet  
  90.         depends_on: public_net  
  91.         properties:  
  92.             name: {get_param: public_subnet_name}  
  93.             cidr: {get_param: public_subnet_cidr}  
  94.             network_id: {get_resource: public_net}  
  95.             enable_dhcp: False  
  96.     lb_subnet:  
  97.         type: OS::Neutron::Subnet  
  98.         depends_on: lb_net  
  99.         properties:  
  100.             name: {get_param: lb_subnet_name}  
  101.             cidr: {get_param: lb_subnet_cidr}  
  102.             network_id: {get_resource: lb_net}  
  103.     server_subnet:  
  104.         type: OS::Neutron::Subnet  
  105.         depends_on: server_net  
  106.         properties:  
  107.             name: {get_param: server_subnet_name}  
  108.             cidr: {get_param: server_subnet_cidr}  
  109.             network_id: {get_resource: server_net}  
  110.     router:  
  111.         type: OS::Neutron::Router  
  112.         depends_on: [public_net, public_subnet]  
  113.         properties:  
  114.             name: {get_param: router_name}  
  115.             external_gateway_info: {"network": {get_resource: public_net}}  
  116.     lb_interface:  
  117.         type: OS::Neutron::RouterInterface  
  118.         depends_on: [lb_subnet, router]  
  119.         properties:  
  120.             router_id: {get_resource: router}  
  121.             subnet_id: {get_resource: lb_subnet}  
  122.     server_interface:  
  123.         type: OS::Neutron::RouterInterface  
  124.         depends_on: [server_subnet, router]  
  125.         properties:  
  126.             router_id: {get_resource: router}  
  127.             subnet_id: {get_resource: server_subnet}  
复制代码
#heat template-validate--template-file ./network_topology.template然后运行如下CLI命令,则自动生成相应的网络拓扑,省去不少命令行敲字,而且实验结束,直接heatstack-delete 掉即可。
#heat stack-create -f./network_topology.template lb-net-topology
网络拓扑用到的Resource资源如下:
  1. OS::Neutron::Net: http://docs.openstack.org/developer/heat/template_guide/openstack.html#OS::Neutron::Net
  2. OS::Neutron::Subnet:
  3. http://docs.openstack.org/developer/heat/template_guide/openstack.html#OS::Neutron::Subnet
  4. OS::Neutron::Router:
  5. http://docs.openstack.org/developer/heat/template_guide/openstack.html#OS::Neutron::Router
复制代码
接下来开始部署LB了, 主要有下面个资源:
  1. Pool:
  2. VIP:
  3. Floating IP for VIP
  4. HealthMonitor:
  5. 2 Pool Member instances (内部运行简单的web server):
复制代码
根据以上信息设计LB模板如下:
  1. heat_template_version: 2013-05-23  
  2.   
  3. description: >  
  4.     LB service deployment HOT template reference to  
  5.     http://www.ustack.com/blog/neutron_loadbalance/  
  6.   
  7. parameters:  
  8.     image_name:  
  9.         type: string      
  10.         label: Image Name  
  11.         description: Image to be used for compute instance  
  12.         default: cirros-0.3.0-i386-uec  
  13.     instance_type:  
  14.         type: string  
  15.         label: Instance Type  
  16.         description: Type of instance (flavor) to be used  
  17.         default: m1.tiny  
  18.     health_monitor_type:  
  19.         type: string  
  20.         label: Type of HealthMonitor  
  21.         constraints:  
  22.             - allowed_values: [PING, TCP, HTTP, HTTPS]  
  23.         default: HTTP  
  24.     pool_name:  
  25.         type: string  
  26.         label: The Name of Pool  
  27.         default: pool  
  28.     lb_method:  
  29.         type: string  
  30.         label: The Algorithm used to distribute load between the memebers of pool  
  31.         constraints:  
  32.             - allowed_values: [ROUND_ROBIN, LEAST_CONNECTIONS, SOURCE_IP]  
  33.         default: ROUND_ROBIN  
  34.     pool_protocol:  
  35.         type: string  
  36.         label: Protocol for Pool Balancing  
  37.         constraints:  
  38.             - allowed_values: [HTTP, HTTPS, TCP]  
  39.         default: HTTP  
  40.     lb_subnet_id:  
  41.         type: string  
  42.         label: Loadbalancer Subnet uuid  
  43.     vip_name:  
  44.         type: string  
  45.         label: Name of VIP  
  46.         default: vip  
  47.     vip_address:  
  48.         type: string  
  49.         label: Address of VIP which must be within lb_subnet  
  50.     session_persistence_type:  
  51.         type: string  
  52.         label: Session Persistence Type  
  53.         constraints:  
  54.             - allowed_values: [SOURCE_IP, HTTP_COOKIE, APP_COOKIE]  
  55.         default: HTTP_COOKIE  
  56.     vip_protocol_port:  
  57.         type: number  
  58.         label: VIP protocol port  
  59.         default: 8080  
  60.     member_protocol_port:  
  61.         type: number  
  62.         label: Member protocol port  
  63.         default: 8080  
  64.     public_net_id:  
  65.         type: string  
  66.         label: Public Network uuid  
  67.     server_net_id:  
  68.         type: string  
  69.         label: Web Servers Network uuid  
  70.   
  71.   
  72. outputs:  
  73.     vip_floating_ip:  
  74.         description: FloatingIP of VIP  
  75.         value: {get_attr: [floatingip, floating_ip_address]}  
  76.     member1_ip_address:  
  77.         description: IP address of member1  
  78.         value: {get_attr: [member1, first_address]}  
  79.     member2_ip_address:  
  80.         description: IP address of member2  
  81.         value: {get_attr: [member2, first_address]}  
  82.     vip:  
  83.         description: VIP info  
  84.         value: {get_attr: [pool, vip]}  
  85.     lb_keypair_private_key:  
  86.         description: private key of KeyPair for 'ssh-add use'  
  87.         value: {get_attr: [lb_keypair, private_key]}  
  88.       
  89.   
  90. resources:  
  91.     lb_keypair:  
  92.         type: OS::Nova::KeyPair  
  93.         properties:  
  94.             name: lb_keypair  
  95.             save_private_key: True  
  96.     health_monitor:  
  97.         type: OS::Neutron::HealthMonitor  
  98.         properties:  
  99.             delay: 10  
  100.             expected_codes: "200"  
  101.             http_method: GET  
  102.             max_retries: 3  
  103.             timeout: 20  
  104.             type: {get_param: health_monitor_type}  
  105.             url_path: /  
  106.     pool:  
  107.         type: OS::Neutron::Pool  
  108.         depends_on: health_monitor  
  109.         properties:  
  110.             admin_state_up: False  
  111.             name: {get_param: pool_name}  
  112.             lb_method: {get_param: lb_method}  
  113.             protocol: {get_param: pool_protocol}  
  114.             monitors: [{get_resource: health_monitor}]  
  115.             subnet_id: {get_param: lb_subnet_id}  
  116.             vip:   
  117.                 session_persistence:  
  118.                     type: {get_param: session_persistence_type}  
  119.                 name: {get_param: vip_name}  
  120.                 address: {get_param: vip_address}  
  121.                 protocol_port: {get_param: vip_protocol_port}  
  122.     member1:  
  123.         type: OS::Nova::Server  
  124.         properties:  
  125.             name: server1  
  126.             key_name: {get_resource: lb_keypair}  
  127.             image: {get_param: image_name}  
  128.             flavor: {get_param: instance_type}  
  129.             networks:  
  130.                 - {network: {get_param: server_net_id}}  
  131.     member2:  
  132.         type: OS::Nova::Server  
  133.         properties:  
  134.             name: server2  
  135.             key_name: {get_resource: lb_keypair}  
  136.             image: {get_param: image_name}  
  137.             flavor: {get_param: instance_type}  
  138.             networks:  
  139.                 - {network: {get_param: server_net_id}}  
  140.     pool_member1:  
  141.         type: OS::Neutron::PoolMember  
  142.         depends_on: [pool, member1]  
  143.         properties:  
  144.             address: {get_attr: [member1, first_address]}  
  145.             pool_id: {get_resource: pool}  
  146.             protocol_port: {get_param: member_protocol_port}  
  147.             weight: 100  
  148.     pool_member2:  
  149.         type: OS::Neutron::PoolMember  
  150.         depends_on: [pool, member2]  
  151.         properties:  
  152.             address: {get_attr: [member2, first_address]}  
  153.             pool_id: {get_resource: pool}  
  154.             protocol_port: {get_param: member_protocol_port}  
  155.             weight: 100  
  156.     floatingip:  
  157.         type: OS::Neutron::FloatingIP  
  158.         depends_on: pool  
  159.         properties:  
  160.             fixed_ip_address: {get_param: vip_address}  
  161.             floating_network_id: {get_param: public_net_id}  
  162.             port_id: {get_attr: [pool, vip, port_id]}  
复制代码
stack@vm:~/hot-files$  heat stack-create lbaas -f ./lbaas.template -P"public_net_id=842a7996-b8ca-4f75-8bfa-72d930780694;lb_subnet_id=f33b03a9-0f39-4c25-a9fa-94d63042f206;server_net_id=33c2e2db-121f-489e-bdc0-
06d091472727;vip_address=192.168.40.3"然后运行如下命令部署lb模板:
Note: 可能注意到了现在Poo的admin_state_up是False状态,这是由于LBaaS Haproxy的一个bug,如果不设置,会导致vip直接返回Error,导致Heat模板运行中断,所以暂时设置为False,等部署好后,再打开admin_state_up,打开后发现Member是INACTIVE状态的,因为现在member还没有开启web server,我用很多方法试图用String,template,以及get_file将user_data注入到VM中,但不知道为什么都失败了,所以你只能自己进到VM中启动一个简单的web服务器了,我的如下所示:
  1. $ while true
  2. > do
  3. > echo -e 'HTTP/1.0 200 OK\r\n\r\n<serverX>' | nc -l -p 8080
  4. > done
复制代码
启动后就看到Member变为ACTIVE状态了。
拿到VIP的floatingIP,然后就可以测试LB的运行状态了,结果如下:
LB.png
LB成功运行!
另外: Keypair的用法:你可以import a keypair,将你的操作console的public key引入,也可以像上面lb模板创建一个keypair,然后将lb_private_key保存到一个文件(lb_private_key.pem)中,然后给VM加一个floatingIP
  1. #eval `ssh-agent`
  2. #ssh-add lb_private_key.pem
复制代码
然后你就可以通过ssh访问VM了,其他可以进noVNC界面对VM进行相关操作。
LB模板用到的resources有: OS::Nova::Server, OS::Nova::KeyPair, OS::Neutron::Pool, OS::Neutron::PoolMember, OS::Neutron::HealthMonitor, OS::Neutron::FloatingIP

用的不方便的地方:

1.Template查错功能有待提高,阐释不清楚或者错误张冠李戴
2.没有类似于action-continue –force的功能,比如LBaaS创建的VIP状态返回error是由于haproxy内部的一个bug,这类人类可控的错误希望能够just 忽略掉然后继续运行。
3.不知道为什么,用heat一直不能把user_data注入VM中

相关内容:


OpenStack Heat 模板学习一 之hello world


没找到任何评论,期待你打破沉寂

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条