如何在热度上跨可用区分布实例数量?
How to spread number of instances across availability zones in heat?
我有这样的实例资源:
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
。如何传播它们,使 zone1 包含节点 1 和 4,zone2 - 2 和 5,等等?
Ansible 具有 loop.cycle 功能,您可以在其中一遍又一遍地传递选项列表。在 OS 中如何做到这一点有什么想法吗?
好的,我找到了一个解决方案。我看到有人勾选了我的问题,所以我知道还有其他人在寻找解决方案,所以我最好分享我的。
您很少使用(我当然不会)将 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 } ] }
...
瞧,您现在有了可扩展的程序,可以适应任意主机和区域号。
我有这样的实例资源:
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
。如何传播它们,使 zone1 包含节点 1 和 4,zone2 - 2 和 5,等等?
Ansible 具有 loop.cycle 功能,您可以在其中一遍又一遍地传递选项列表。在 OS 中如何做到这一点有什么想法吗?
好的,我找到了一个解决方案。我看到有人勾选了我的问题,所以我知道还有其他人在寻找解决方案,所以我最好分享我的。
您很少使用(我当然不会)将 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 } ] }
...
瞧,您现在有了可扩展的程序,可以适应任意主机和区域号。