如何在高温下将实例数量分布在可用区域中



我有一个如下的实例资源:

masters:
type: OS::Heat::ResourceGroup
properties:
count: { get_param: num_masters }
resource_def:
type: heat_stack_server.yaml
properties:
name:
str_replace:
template: cluster_id-k8s_type-%index%
params:
cluster_id: { get_param: cluster_id }
k8s_type: master
cluster_env: { get_param: cluster_env }
cluster_id:  { get_param: cluster_id }
type:        master
image:       { get_param: master_image }
flavor:      { get_param: master_flavor }
key_name:    { get_resource: keypair }
net:         { get_resource: net }
subnet:      { get_resource: subnet }
secgrp:
- { get_resource: master-secgrp }
- { get_resource: node-secgrp }
floating_network: { get_param: external_net }
net_name:
str_replace:
template: openshift-ansible-cluster_id-net
params:
cluster_id: { get_param: cluster_id }
depends_on:
- interface

它创建num_masters。现在,我想保证这些主控器将在不同的可用性区域中创建(这样,当其中一个失败时,另一个将继续工作)。

比方说,我有3个AZ和num_masters == 5。如何展开它们,使区域1包含节点1和4,区域2-2和5,依此类推?

Ansible有一个loop.cycle的功能,你可以一遍又一遍地传递选项列表。有什么想法如何在操作系统中做到这一点吗?

好的,我找到了一个解决方案。我看到有人勾选了我的问题,所以我知道还有其他人在寻找解决方案,所以我最好分享我的问题。

您很少(我当然也不会)将Heat与其他配置管理框架隔离使用。我把它和Ansible一起用。因此,为了在可用性区域(AZ)之间分布节点,您可以考虑自己准备此分布。首先,我在我的Ansible vars文件中有一个所有可用AZ的列表(对不起双关语):

zones:
- 'zone1'
- 'zone2'

或者,您可以查询Openstack以获取该列表。当你有了它,你把它填充到堆栈的环境文件中,如下所示:

{% set zone_cycler = cycler( *zones ) %}
master_availability_zones: [{% for n in range(1,master_number+1) %}"{{ zone_cycler.next() }}"{% if not loop.last %}{{','}} {% endif %}{% endfor %}]

因此,对于五台主机和两个区域,您将获得以下信息:

master_availability_zones: ["zone1","zone2","zone1","zone2","zone1"]

然后你将这个列表传递到你的主机资源组中,如下所示:

master_availability_zones:
type: comma_delimited_list
label: Master Availability zones
description: Availability zone mapping for masters
master_nodes:
type: OS::Heat::ResourceGroup
properties:
count: { get_param: master_number }
resource_def:
type: master_template.yaml
properties:
...
availability_zones: { get_param: master_availability_zones }
index: "%index%"
...

也不要忘记传递index变量,在master_template.yaml:中,您需要它

master_node:
type: OS::Nova::Server
properties:
...
availability_zone: { get_param: [ availability_zones, { get_param: index } ] }
...

Voila,您现在有了可扩展的过程,可以适应任意的主机和区域编号。

最新更新