如何使用OpenStack将云主机部署到特定的计算节点上-程序员宅基地

技术标签: OpenStack  云计算  

背景

Openstack已经成为主流IaaS云计算平台,国内多数云计算厂商提供的云计算服务底层都是使用的OpenStack。这里我们讲的“如何将实例部署到特定的计算节点上”是基于标准的Openstack平台。

通过Openstack我们可以申请以实例为核心的各类资源。通常情况下,我们只需要指定实例配置,如多少CPU、多大内存、挂多大数据盘、连接什么样的网络即可,Openstack会帮助我们将实例部署到指定的计算节点上。但是,需求往往是多样性的,有时候我们需要将实例部署到特定的计算节点上。例如Openstack资源池中的计算节点同时存在高性能的机架服务器和刀片服务器,我们希望将运行数据库的实例部署到机架服务器上,将运行中间件的实例部署到刀片服务器上。(这里的实例指的是虚拟主机实例,而非数据库实例或中间件实例)

Openstack的nova-scheduler服务可以帮我们实现这样个性化的需求。接下来我将介绍nova-scheduler如何帮助我们实现上述需求的工作原理,并且我会以两个示例分别用两种方法来实现“如何将实例部署到特定的计算节点上”。

原理(Nova Scheduler)

Openstack通过nova-scheduler来实现将实例部署到哪台计算节点上。Filter scheduler 是 nova-scheduler 默认的调度器,调度过程分为两步:

第一步:通过过滤器(filter)选择满足条件的计算节点(运行nova-compute)

第二步:通过权重计算(weighting)选择在最优(权重值最大)的计算节点上创建 Instance。

图 0‑1过滤



图0-2分析权重

 

Filters的调度策略有以下几种:

AggregateCoreFilter

AggregateDiskFilter

AggregateImagePropertiesIsolation

AggregateInstanceExtraSpecsFilter

AggregateIoOpsFilter

AggregateMultiTenancyIsolation

AggregateNumInstancesFilter

AggregateRamFilter

AggregateTypeAffinityFilter

AllHostsFilter

AvailabilityZoneFilter

ComputeCapabilitiesFilter

ComputeFilter

CoreFilter

NUMATopologyFilter

DifferentHostFilter

DiskFilter

GroupAffinityFilter

GroupAntiAffinityFilter

ImagePropertiesFilter

IsolatedHostsFilter

IoOpsFilter

JsonFilter

MetricsFilter

NumInstancesFilter

PciPassthroughFilter

RamFilter

RetryFilter

SameHostFilter

ServerGroupAffinityFilter

ServerGroupAntiAffinityFilter

SimpleCIDRAffinityFilter

TrustedFilter

TypeAffinityFilter

计算服务Filters的策略通过配置nova.conf配置文件中的配置项scheduler_available_filters完成。默认配置的是所有filters。配置如下:

scheduler_available_filters = nova.scheduler.filters.all_filters

这个配置项可以在nova.conf中多次出现,比如你可以通过Python实现自定义的filter(myFilter.MyFilter),只需要在配置文件中增加这个filter即可。

scheduler_available_filters = nova.scheduler.filters.all_filters

scheduler_available_filters = myfilter.MyFilter

详细介绍请参见这里

下面通过两个示例来实现将Openstack的示例部署到指定的主机中。

示例一:通过主机聚合的metadata实现将云主机部署到使用ssd的主机聚合中

假设我在公司的OpenStack环境中创建了一个主机聚合fast-io,这个聚合中,所有的计算节点都连接了SSD类型的本地磁盘。我想创建一个Flavor ssd.large,通过该Flavor申请的云主机全部部署到fast-io这个主机聚合中。

要完成这个任务,我们需要做6步工作:

1.    将AggregateInstanceExtraSpecsFilter添加到nova.conf文件的scheduler_default_filters配置项中,即:

scheduler_default_filters=AggregateInstanceExtraSpecsFilter,RetryFilter,AvailabilityZoneFilter,RamFilter,ComputeFilter,ComputeCapabilitiesFilter,ImagePropertiesFilter,ServerGroupAntiAffinityFilter,ServerGroupAffinityFilter

2.    创建一个主机聚合,命名为fast-io,可用域为nova

$ nova aggregate-create fast-io nova

+----+---------+-------------------+-------+----------+

| Id | Name    | Availability Zone | Hosts | Metadata |

+----+---------+-------------------+-------+----------+

| 1  | fast-io | nova              |       |          |

+----+---------+-------------------+-------+----------+

3.    设置集群元数据ssd=true

$ nova aggregate-set-metadata 1 ssd=true

+----+---------+-------------------+-------+-------------------+

| Id | Name    | Availability Zone | Hosts | Metadata          |

+----+---------+-------------------+-------+-------------------+

| 1  | fast-io | nova              | []    | {u'ssd': u'true'} |

+----+---------+-------------------+-------+-------------------+

 

4.    在主机聚合fast-io中增加两台主机node1和node2

$ nova aggregate-add-host 1 node1

+----+---------+-------------------+-----------+-------------------+

| Id | Name    | Availability Zone | Hosts      | Metadata          |

+----+---------+-------------------+------------+-------------------+

| 1  | fast-io | nova              | [u'node1'] | {u'ssd': u'true'} |

+----+---------+-------------------+------------+-------------------+

 

$ nova aggregate-add-host 1 node2

+----+---------+-------------------+---------------------+-------------------+

| Id | Name    | Availability Zone | Hosts                | Metadata          |

+----+---------+-------------------+----------------------+-------------------+

| 1  | fast-io | nova              | [u'node1', u'node2'] | {u'ssd': u'true'} |

+----+---------+-------------------+----------------------+-------------------+

5.    使用novaflavor-create命令创建flavor ssd.large,配置为4个vCPU、8GB内存和80GB root盘。

$ nova flavor-create ssd.large68192804

+----+-----------+-----------+------+-----------+------+-------+-------------+-----------+

| ID | Name      | Memory_MB | Disk | Ephemeral | Swap | VCPUs | RXTX_Factor | Is_Public |

+----+-----------+-----------+------+-----------+------+-------+-------------+-----------+

| 6  | ssd.large | 8192      | 80   | 0         |      | 4     | 1.0         | True      |

+----+-----------+-----------+------+-----------+------+-------+-------------+-----------+

 

6.    设置flavor ssd.large的元数据为ssd=true

$ nova flavor-key ssd.large set  aggregate_instance_extra_specs:ssd=true

完成以上6步工作后,当用户通过ssd.large这个flavor创建云主机时,nova-scheduler将会把这个云主机调度到元数据为ssd=true这个主机聚合的主机上。

示例二:通过配置flavor的Capability实现将云主机部署到厂商为intel的主机上

某些情况下,我们希望将申请的云主机与某些厂商的主机绑定。例如我想把使用flavor为vendor.intel的云主机全部部署到intel生产的主机上。

首先我们把compute-host-capabilities.json这个文件导入到元数据信息中。

其次我们创建一个flavor vendor.intel,并把元数据指定为cpu.info:vendor=intel。

此时申请flavor为vendor.intel的云主机会自动部署到intel生产的主机上。

compute-host-capabilities.json文件内容:

{

    "namespace":"OS::Compute::HostCapabilities",

    "display_name": "ComputeHost Capabilities",

    "description": "Hardwarecapabilities provided by the compute host. This provides the ability to finetune the hardware specification required when an instance is requested. TheComputeCapabilitiesFilter should be enabled in the Nova scheduler to use theseproperties. When enabled, this filter checks that the capabilities provided bythe compute host satisfy any extra specifications requested. Only hosts thatcan provide the requested capabilities will be eligible for hosting theinstance.",

    "visibility": "public",

    "protected": true,

    "resource_type_associations": [

        {

            "name":"OS::Nova::Flavor",

            "prefix":"capabilities:"

        },

        {

            "name":"OS::Nova::Aggregate",

            "prefix":"aggregate_instance_extra_specs:"

        }

    ],

    "properties": {

        "cpu_info:vendor": {

            "title":"Vendor",

            "description":"Specifies the CPU manufacturer.",

            "operators":["<or>"],

            "type":"string",

            "enum": [

                "Intel",

                "AMD"

            ]

        },

        "cpu_info:model": {

            "title":"Model",

            "description":"Specifies the CPU model. Use this property to ensure that your vm runs ona a specific cpu model.",

            "operators":["<or>"],

            "type":"string",

            "enum": [

                "Conroe",

                "Core2Duo",

                "Penryn",

                "Nehalem",

                "Westmere",

                "SandyBridge",

                "IvyBridge",

                "Haswell",

                "Broadwell",

                "Delhi",

                "Seoul",

                "Abu Dhabi",

                "Interlagos",

                "Kabini",

                "Valencia",

                "Zurich",

                "Budapest",

                "Barcelona",

                "Suzuka",

                "Shanghai",

                "Istanbul",

                "Lisbon",

                "Magny-Cours",

                "Valencia",

                "Cortex-A57",

                "Cortex-A53",

                "Cortex-A12",

                "Cortex-A17",

                "Cortex-A15",

                "Coretx-A7",

                "X-Gene"

            ]

        },

        "cpu_info:arch": {

            "title": "Architecture",

            "description":"Specifies the CPU architecture. Use this property to specify thearchitecture supported by the hypervisor.",

            "operators":["<or>"],

            "type":"string",

            "enum": [

                "x86",

                "x86_64",

                "i686",

                "ia64",

                "ARMv8-A",

                "ARMv7-A"

            ]

        },

        "cpu_info:topology:cores": {

            "title":"cores",

            "description":"Number of cores.",

            "type":"integer",

            "readonly": false,

            "default": 1

        },

        "cpu_info:topology:threads":{

            "title":"threads",

            "description":"Number of threads.",

            "type":"integer",

            "readonly": false,

            "default": 1

        },

        "cpu_info:topology:sockets":{

            "title":"sockets",

            "description":"Number of sockets.",

            "type":"integer",

            "readonly": false,

            "default": 1

        },

        "cpu_info:features": {

            "title":"Features",

            "description":"Specifies CPU flags/features. Using this property you can specify therequired set of instructions supported by a vm.",

            "operators":["<or>", "<all-in>"],

            "type":"array",

            "items": {

                "type":"string",

                "enum": [

                    "fpu",

                    "vme",

                    "de",

                    "pse",

                    "tsc",

                    "msr",

                    "pae",

                    "mce",

                    "cx8",

                    "apic",

                    "sep",

                    "mtrr",

                    "pge",

                    "mca",

                    "cmov",

                    "pat",

                    "pse36",

                    "pn",

                    "clflush",

                    "dts",

                    "acpi",

                    "mmx",

                    "fxsr",

                    "sse",

                    "sse2",

                    "ss",

                    "ht",

                    "tm",

                    "ia64",

                    "pbe",

                    "syscall",

                    "mp",

                    "nx",

                    "mmxext",

                    "fxsr_opt",

                    "pdpe1gb",

                    "rdtscp",

                    "lm",

                    "3dnowext",

                    "3dnow",

                    "arch_perfmon",

                    "pebs",

                    "bts",

                    "rep_good",

                    "nopl",

                    "xtopology",

                    "tsc_reliable",

                    "nonstop_tsc",

                    "extd_apicid",

                    "amd_dcm",

                    "aperfmperf",

                    "eagerfpu",

                    "nonstop_tsc_s3",

                    "pni",

                    "pclmulqdq",

                    "dtes64",

                    "monitor",

                    "ds_cpl",

                    "vmx",

                    "smx",

                    "est",

                    "tm2",

                    "ssse3",

                    "cid",

                    "fma",

                    "cx16",

                    "xtpr",

                    "pdcm",

                    "pcid",

                    "dca",

                    "sse4_1",

                    "sse4_2",

                    "x2apic",

                    "movbe",

                    "popcnt",

                   "tsc_deadline_timer",

                    "aes",

                    "xsave",

                    "avx",

                    "f16c",

                    "rdrand",

                    "hypervisor",

                    "rng",

                    "rng_en",

                    "ace",

                    "ace_en",

                    "ace2",

                    "ace2_en",

                    "phe",

                    "phe_en",

                    "pmm",

                    "pmm_en",

                    "lahf_lm",

                    "cmp_legacy",

                    "svm",

                    "extapic",

                    "cr8_legacy",

                    "abm",

                    "sse4a",

                    "misalignsse",

                    "3dnowprefetch",

                    "osvw",

                    "ibs",

                    "xop",

                    "skinit",

                    "wdt",

                    "lwp",

                    "fma4",

                    "tce",

                    "nodeid_msr",

                    "tbm",

                    "topoext",

                    "perfctr_core",

                    "perfctr_nb",

                    "bpext",

                    "perfctr_l2",

                    "mwaitx",

                    "ida",

                    "arat",

                    "cpb",

                    "epb",

                    "pln",

                    "pts",

                    "dtherm",

                    "hw_pstate",

                    "proc_feedback",

                    "hwp",

                    "hwp_notify",

                    "hwp_act_window",

                    "hwp_epp",

                    "hwp_pkg_req",

                    "intel_pt",

                    "tpr_shadow",

                    "vnmi",

                    "flexpriority",

                    "ept",

                    "vpid",

                    "npt",

                    "lbrv",

                    "svm_lock",

                    "nrip_save",

                    "tsc_scale",

                    "vmcb_clean",

                    "flushbyasid",

                    "decodeassists",

                    "pausefilter",

                    "pfthreshold",

                    "vmmcall",

                    "fsgsbase",

                    "tsc_adjust",

                    "bmi1",

                    "hle",

                    "avx2",

                    "smep",

                    "bmi2",

                    "erms",

                    "invpcid",

                    "rtm",

                    "cqm",

                    "mpx",

                    "avx512f",

                    "rdseed",

                    "adx",

                    "smap",

                    "pcommit",

                    "clflushopt",

                    "clwb",

                    "avx512pf",

                    "avx512er",

                    "avx512cd",

                    "sha_ni",

                    "xsaveopt",

                    "xsavec",

                    "xgetbv1",

                    "xsaves",

                    "cqm_llc",

                    "cqm_occup_llc",

                    "clzero"

                ]

            }

        }

    },

    "objects": []

}

参考资料

http://www.codexiu.cn/openstack/blog/14729/#OSC_h2_9

http://docs.openstack.org/kilo/config-reference/content/section_compute-scheduler.html

 

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/zztflyer/article/details/51770634

智能推荐

第三十六篇、基于Arduino uno,获取红外寻迹传感器的原始值——结果导向_怎么检测红外寻迹模块返回值-程序员宅基地

文章浏览阅读385次。基于Arduino uno,获取红外寻迹传感器的原始值_怎么检测红外寻迹模块返回值

基于单片机的无线投票显示系统设计-程序员宅基地

文章浏览阅读494次,点赞5次,收藏9次。单片机(Microcontroller)是一种集成了微处理器核心、存储器、输入/输出接口和定时器等功能模块的集成电路芯片,具有体积小、功耗低、性价比高等特点,被广泛应用于各个领域。单片机的发展历史可以追溯到20世纪70年代,当时的单片机功能有限,主要用于简单的控制任务。

生成对抗网络GAN_生成对抗网络 python代码-程序员宅基地

文章浏览阅读412次。https://zhuanlan.zhihu.com/p/54096381_生成对抗网络 python代码

html——网页上添加表格_怎样在网站中添加表格别人可以下载-程序员宅基地

文章浏览阅读5.2k次,点赞7次,收藏18次。有时候我们需要在网页上展示一些数据,如某公司想在网页上展示公司的库存清单。如下表:想在网页上展示上述表格效果可以使用以下代码:创建表格的四个元素:table、tbody、tr、th、td1、…:整个表格以标记开始、标记结束。2、…:当表格内容非常多时,表格会下载一点显示一点,但如果加上标签后,这个表格就要等表格内容全部下载完才会显示。如右侧代码编辑器中的代码。3、…_怎样在网站中添加表格别人可以下载

《Qt MOOC系列教程》第五章第三节:创建新的QML类型_qmlregisteruncreatabletype-程序员宅基地

文章浏览阅读770次。到目前为止,我们已经讨论了如何将对象实例公开给QML上下文。有时我们还希望在QML中可以使用注册类本身。注册允许将类当作QML中的数据类型来使用。此外,注册还可以提供其他功能,比如允许在QML中将类用作可实例化的QML对象类型,或者允许在QML中导入和使用类的单例实例。通常我们使用Q_OBJECT宏注册从QObject派生的类,也可以用Q_GADGET宏声明一个比QObject“更轻”的版本。在这些更轻的类中,我们可以访问它们的属性、枚举和可调用的方法,但不能使用信号槽系统,我们稍后会进行介绍。1. 注_qmlregisteruncreatabletype

头文件与命名空间的关系_c#中命名空间和c语言中头文件之间的关系-程序员宅基地

文章浏览阅读2.1k次,点赞7次,收藏15次。头文件与命名空间的关系 Q:有些书说有些头文件不在std里是什么意思?std里包含些什么?为什么不用std就不能使用cout?头文件中声明的东西为什么在使用的时候需要先using namespace std;一下?如果我不用#include和其他头文件。只用using namespace std 的话,是不能用cout的。这说明cout是在iostream里声明_c#中命名空间和c语言中头文件之间的关系

随便推点

python实现矩阵乘法(实现文件读写操作)_python 读取csv矩阵乘法-程序员宅基地

文章浏览阅读1.2k次,点赞2次,收藏8次。注释dtype=np.int代表导入数据的格式为整数delimiter=’,'代表原始数据的存储格式为以‘,’为间隔原始文件中以‘#’开头的行代表被注释,不会被np.loadtxt读取通过[[0] * b for i in range(a)]的方式初始化一个x[a][b]的二维数组np.savetxt()函数可以用来保存数据,第一个参数为保存数据的路径,其中C是自定义的文件名,如果该文..._python 读取csv矩阵乘法

《军团要塞2》绘画渲染_军团要塞画师-程序员宅基地

文章浏览阅读1.4k次。军团要塞2绘画渲染(a)美术概念 (b)游戏内玩家看到的角色摘要在《军团要塞2》中我们提出了一整套美术方案和新的实时渲染技术,这种技术能实现出一种独一无二的渲染风格。《军团要塞2》由美术和程序基于20世纪初时商业插画中的传统风格合作完成。在这篇论文中,我们会结合美术方向与技术选择,来讨论如何支持美术目标和玩法限制。除了实现一种有冲击力的风格外,我们也设计了边缘光照和亮度与色调变化的着色器技..._军团要塞画师

【数字图像处理实验二】:RGB图3个通道的提取、RGB图转灰度图、图片反转、图片亮度调整、直方图显示_jupter rgb灰度直方图提取-程序员宅基地

文章浏览阅读9.6k次,点赞8次,收藏65次。这里介绍:RGB图3个通道的提取、RGB图转灰度图、图片反转、图片亮度调整具体操作,需导入的库如下:原图如下:结果如下,从左到右分别是:Red,Green,Blue这里借助skimage库中的exposure函数来进行图像亮度的调整结果如下:........._jupter rgb灰度直方图提取

2023年地级、省级、县级、国界、九段线的shp数据_九段线shp数据-程序员宅基地

文章浏览阅读931次。2023年地级、省级、县级、国界、九段线的shp数据_九段线shp数据

python高校本科生学习成长记录系统的设计与实现flask-django-php-nodejs-程序员宅基地

文章浏览阅读797次,点赞16次,收藏19次。二十一世纪我们的社会进入了信息时代,信息管理系统的建立,大大提高了人们信息化水平。传统的管理方式对时间、地点的限制太多,而在线管理系统刚好能满足这些需求,在线管理系统突破了传统管理方式的局限性。于是本文针对这一需求设计并实现了一个基于django高校本科生学习成长记录系统,为了简捷并有效的解决学习各方面的问题。

redis实现分布式session共享_redis分布式session共享-程序员宅基地

文章浏览阅读7.7k次。为什么要共享session?我们使用单台Tomcat的时候不会有共享sesssion的疑虑,只要使用Tomcat的默认配置即可,session即可存储在Tomcat上。但是随着业务的扩大,增加Tomcat节点构成Tomcat集群大势所趋,分布式带来了增加更大规模并发请求的优势,但是也随之到来了一个问题,每个Tomcat只存储来访问自己的请求产生的session,如果Tomcat-A已经为客..._redis分布式session共享

推荐文章

热门文章

相关标签