[openstack-dev] [magnum][heat] spawn a group of nodes on different availability zones
Steven Hardy
shardy at redhat.com
Thu Mar 3 08:57:19 UTC 2016
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-availabilityzones-impl
> https://blueprints.launchpad.net/heat/+spec/implement-autoscalinggroup-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/network/ports/external_from_pool.yaml#L35
Steve
More information about the OpenStack-dev
mailing list