[openstack-dev] [magnum][heat] spawn a group of nodes on different availability zones

Mathieu Velten mathieu.velten at cern.ch
Thu Mar 3 10:23:00 UTC 2016


Thank you both for your answers !

Indeed I need it sooner rather than later (as usual :) ) so the Newton
release is a bit too far away.
In the meantime I just test your solution with the index and the map
and it works great ! 
I'll use that for now, and we will discuss taking over the Heat bp
internally.

Regards,

Mathieu

Le jeudi 03 mars 2016 à 08:57 +0000, Steven Hardy a écrit :
> On Wed, Mar 02, 2016 at 05:40:20PM -0500, Zane Bitter wrote:
> > 
> > On 02/03/16 05:50, Mathieu Velten wrote:
> > > 
> > > Hi all,
> > > 
> > > I am looking at a way to spawn nodes in different specified
> > > availability zones when deploying a cluster with Magnum.
> > > 
> > > Currently Magnum directly uses predefined Heat templates with
> > > Heat
> > > parameters to handle configuration.
> > > I tried to reach my goal by sticking to this model, however I
> > > couldn't
> > > find a suitable Heat construct that would allow that.
> > > 
> > > Here are the details of my investigation :
> > > - OS::Heat::ResourceGroup doesn't allow to specify a list as a
> > > variable
> > > that would be iterated over, so we would need one ResourceGroup
> > > by AZ
> > > - OS::Nova::ServerGroup only allows restriction at the hypervisor
> > > level
> > > - OS::Heat::InstanceGroup has an AZs parameter but it is marked
> > > unimplemented , and is CFN specific.
> > > - OS::Nova::HostAggregate only seems to allow adding some
> > > metadatas to
> > > a group of hosts in a defined availability zone
> > > - repeat function only works inside the properties section of a
> > > resource and can't be used at the resource level itself, hence
> > > something like that is not allowed :
> > > 
> > > resources:
> > >   repeat:
> > >     for_each:
> > >       <%az%>: { get_param: availability_zones }
> > >     template:
> > >       rg-<%az%>:
> > >         type: OS::Heat::ResourceGroup
> > >         properties:
> > >           count: 2
> > >           resource_def:
> > >             type: hot_single_server.yaml
> > >             properties:
> > >               availability_zone: <%az%>
> > > 
> > > 
> > > The only possibility that I see is generating a ResourceGroup by
> > > AZ,
> > > but it would induce some big changes in Magnum to handle
> > > modification/generation of templates.
> > > 
> > > Any ideas ?
> > This is a long-standing missing feature in Heat. There are two
> > blueprints
> > for this (I'm not sure why):
> > 
> > https://blueprints.launchpad.net/heat/+spec/autoscaling-availabilit
> > yzones-impl
> > https://blueprints.launchpad.net/heat/+spec/implement-autoscalinggr
> > oup-availabilityzones
> > 
> > The latter had a spec with quite a lot of discussion:
> > 
> > https://review.openstack.org/#/c/105907
> > 
> > And even an attempted implementation:
> > 
> > https://review.openstack.org/#/c/116139/
> > 
> > which was making some progress but is long out of date and would
> > need
> > serious work to rebase. The good news is that some of the changes I
> > made in
> > Liberty like https://review.openstack.org/#/c/213555/ should
> > hopefully make
> > it simpler.
> > 
> > All of which is to say, if you want to help then I think it would
> > be totally
> > do-able to land support for this relatively early in Newton :)
> > 
> > 
> > Failing that, the only think I can think to try is something I am
> > pretty
> > sure won't work: a ResourceGroup with something like:
> > 
> >   availability_zone: {get_param: [AZ_map, "%i"]}
> > 
> > where AZ_map looks something like {"0": "az-1", "1": "az-2", "2":
> > "az-1",
> > ...} and you're using the member index to pick out the AZ to use
> > from the
> > parameter. I don't think that works (if "%i" is resolved after
> > get_param
> > then it won't, and I suspect that's the case) but it's worth a try
> > if you
> > need a solution in Mitaka.
> Yeah, this won't work if you attempt to do the map/index lookup in
> the
> top-level template where the ResourceGroup is defined, but it *does*
> work
> if you pass both the map and the index into the nested stack, e.g
> something
> like this (untested):
> 
> $ cat rg_az_map.yaml
> heat_template_version: 2015-04-30
> 
> parameters:
>   az_map:
>     type: json
>     default:
>       '0': az1
>       '1': az2
> 
> resources:
>  AGroup:
>     type: OS::Heat::ResourceGroup
>     properties:
>       count: 2
>       resource_def:
>         type: server_mapped_az.yaml
>         properties:
>           availability_zone_map: {get_param: az_map}
>           index: '%index%'
> 
> $ cat server_mapped_az.yaml
> heat_template_version: 2015-04-30
> 
> parameters:
>   availability_zone_map:
>     type: json
>   index:
>     type: string
> 
> resources:
>  server:
>     type: OS::Nova::Server
>     properties:
>       image: the_image
>       flavor: m1.foo
>       availability_zone: {get_param: [availability_zone_map,
> {get_param: index}]}
> 
> FWIW we already use this technique in some TripleO templates, and it
> works
> pretty well.
> 
> https://github.com/openstack/tripleo-heat-templates/blob/master/netwo
> rk/ports/external_from_pool.yaml#L35
> 
> Steve
> 
> _____________________________________________________________________
> _____
> OpenStack Development Mailing List (not for usage questions)
> Unsubscribe: OpenStack-dev-request at lists.openstack.org?subject:unsubs
> cribe
> http://lists.openstack.org/cgi-bin/mailman/listinfo/openstack-dev


More information about the OpenStack-dev mailing list