复杂的反亲和策略

https://blueprints.launchpad.net/nova/+spec/complex-anti-affinity-policies

此蓝图建议启用用户定义策略规则以满足更高级的策略需求,并提出一个示例,为anti-affinity策略添加max_server_per_host规则。

问题描述

Nova 支持过滤和加权,以便就新实例的创建位置做出明智的决策,并且 ServerGroupAntiAffinityFilter 基于此调度器机制实现服务器组的反亲和性。

用户为特定的服务器组设置策略以启用服务器组的反亲和性。这满足了服务器组亲和性的最基本要求,但不足以满足更复杂的反亲和性需求。

例如,用户希望启用具有除 1 以外的限制的反亲和策略,而当前静态限制为 1。通过这样做,可以限制同一反亲和组中的虚拟机数量,从而由用户控制。为了实现反亲和性和资源利用率要求,这对用户来说是一个非常有用的功能,特别是当用户在云中没有足够的宿主机但仍然希望其应用程序具有一定程度的高可靠性时。此外,我们也不能使用软反亲和策略,因为它基于权重而不是主机过滤来实现。

因此,调度器需要提供某种机制来启用用户定义策略规则以满足更高级的策略需求。

用例

作为 NFV 用户,考虑到可靠性和资源利用率,我希望有一种机制来添加同一反亲和组中每个宿主机实例的最大数量限制。

提议的变更

本规范建议

  • 添加一个通用的“rules”字段,它是一个字典,可以应用于策略。

    现在,仅支持anti-affinity策略的max_server_per_host,示例用法如下

    对于anti-affinity策略,“max_server_per_host”规则意味着为给定宿主机上的组中虚拟机数量添加最大限制。例如,如果用户有一个包含 6 个实例的组和 2 个宿主机,并具有anti-affinity策略,那么在当前的anti-affinity策略中会被拒绝,然后用户可以指定{'max_server_per_host': 3}规则,这意味着 6 个实例分布在 2 个宿主机上,每个宿主机有 3 个服务器。

  • 创建一个新的 API 微版本以支持这些更改

    1. 支持将可选参数rules传递给创建实例组 API。现在,我们仅支持anti-affinity策略的“max_server_per_host”规则作为 API 中使用 JSON schema 验证的具有 int 值 >= 1 的可选条目。

    2. 还需要更改POST /os-server-groupsGET /os-server-groupsGET /os-server-groups/{server_group_id}的响应,以采用新的策略格式。

    3. 删除POST /os-server-groupsGET /os-server-groupsGET /os-server-groups/{server_group_id}的响应中的空且未使用的metadata字段。

  • 更改ServerGroupAntiAffinityFilter以适应复杂的策略模型。

    过滤器将从策略规则中获取 max_server_per_host 限制,并将其与给定宿主机上相同组中的服务器数量进行比较。如果过滤器发现数量不满足限制,它将过滤掉该宿主机。

    为了向后兼容,反亲和性过滤器的默认max_server_per_host为 1。

备选方案

另一种方法是在调度器认为需要双倍化之前,对最大扩展设置一个设置。用户可以定义无论组中有多少实例,他们希望的最低冗余量。

数据模型影响

  • 将在instance_group_policy数据库表中添加一个Textrules。为了添加该列,还将添加数据库模式迁移。

    rules的格式是一个包含多个键/值对的字典,例如

    {'max_server_per_host': 3, `other_key`: `other_value`}
    
  • 添加一个新的InstanceGroupPolicy版本对象,包括policyrulesgroup_id字段。

  • 将一个新的policy字段添加到InstanceGroup对象。

    InstanceGroup.policy 将是InstanceGroupPolicy的一个实例,并且原始的policies字段将被弃用。

REST API 影响

以下更改将在新的 API 微版本中引入。

  • POST /os-server-groups

    支持将rules传递给创建实例组 API,并更改创建服务器组的模式以避免创建没有策略的服务器。

    示例创建服务器组 JSON 请求

    {
        "server_group": {
            "name": "test",
            "policy": {
                "name": "anti-affinity",
                "rules": {
                    "max_server_per_host": 3
                }
            }
        }
    }
    

    POST /os-server-groups的新 JSON 模式如下

    create = {
    'type': 'object',
    'properties': {
        'server_group': {
            'type': 'object',
            'properties': {
                'name': parameter_types.name,
                'policy':
                    {
                        'oneOf': [
                        {
                            'type': 'object',
                            'properties': {
                                'name': {
                                    'type': 'string',
                                    'enum': ['anti-affinity'],
                                },
                                'rules': {
                                    'type': 'object',
                                    'properties': {
                                        'max_server_per_host': parameter_types.positive_integer,
                                    },
                                    'additionalProperties': False
                                }
                            },
                            'required': ['name'],
                            'additionalProperties': False
                        },
                        {
                            'type': 'object',
                            'properties': {
                                'name': {
                                    'type': 'string',
                                    'enum': ['affinity', 'soft-anti-affinity', 'soft-affinity'],
                                },
                            },
                            'required': ['name'],
                            'additionalProperties': False
                        }]
                }
            },
            'required': ['name', 'policy'],
            'additionalProperties': False,
        }},
        'required': ['server_group'],
        'additionalProperties': False,
    }
    

    更改响应为新的策略格式,并删除空且未使用的metadata字段

    {
        "server_group": {
            "id": "5bbcc3c4-1da2-4437-a48a-66f15b1b13f9",
            "name": "test",
            "policy": {
                "name": "anti-affinity",
                "rules": {
                    "max_server_per_host": 3
                }
            }
            "members": []
        }
    }
    

    请注意:如果用户在不指定策略规则的情况下创建组,则rules键的值为{}

  • GET /os-server-groups

    更改响应为新的策略格式,并删除空且未使用的metadata字段

    {
        "server_groups": [
            {
                "id": "616fb98f-46ca-475e-917e-2563e5a8cd19",
                "name": "test",
                "policy": {
                    "name": "anti-affinity",
                    "rules": {
                        "max_server_per_host": 3
                    }
                },
                "members": [],
                "project_id": "6f70656e737461636b20342065766572",
                "user_id": "fake"
            }
        ]
    }
    
  • GET /os-server-groups/{server_group_id}

    更改响应为新的策略格式,并删除空且未使用的metadata字段

    {
        "server_group": {
            "id": "5bbcc3c4-1da2-4437-a48a-66f15b1b13f9",
            "name": "test",
            "policy": {
                "name": "anti-affinity",
                "rules": {
                    "max_server_per_host": 3
                }
            },
            "members": []
        }
    }
    

安全影响

通知影响

server_group.createserver_group.deleteserver_group.add_member版本通知将被更新,以包含新的policy字段,而不是旧的policies字段。

其他最终用户影响

  • python-novaclient 将被修改,以将这个新的rule参数添加到nova server-group-create shell 命令中。

  • python-openstackclient 将被修改,以将这个新的rule参数添加到openstack server group create shell 命令中。

性能影响

其他部署者影响

开发人员影响

升级影响

实现

负责人

主要负责人

江益坤

工作项

  • rules属性添加到InstanceGroupPolicy数据模型。

  • 创建一个新的 API 微版本以支持将rules传递给创建实例组 API。

  • 修改 Nova 客户端以处理新的微版本。

  • 更改ServerGroupAntiAffinityFilter以适应新的策略模型。

  • 更改 after resource tracker claim 中的_validate_instance_group_policy[1]以适应新的策略模型

依赖项

测试

需要新的树内功能和单元测试。

文档影响

需要新的 API 微版本和用量文档。

参考资料

历史

修订

发布名称

描述

Rocky

提议