您的位置:

深入OpenStack Placement

一、概述

OpenStack Placement是OpenStack组件之一,位于Nova之外,主要用于优化云资源分配。Placement通过集中化管理,搜集云环境中所有计算资源的信息,使得资源分配更为智能化、灵活化。本文将从多个方面对OpenStack Placement进行详细阐述。

二、构建OpenStack Placement

OpenStack Placement可以通过devstack、Docker等方式进行构建,下面以devstack为例:

# 下载devstack
git clone https://github.com/openstack-dev/devstack.git

# 进入devstack目录
cd devstack

# 编辑local.conf文件
touch local.conf
echo "[[local|localrc]]
# Password
ADMIN_PASSWORD=123456
DATABASE_PASSWORD=123456
RABBIT_PASSWORD=123456
SERVICE_PASSWORD=123456

# Horizon
enable_service horizon
# Keystone
enable_service keystone
# Glance
enable_service glance
# Placement
enable_service placement-api
enable_service placement-client

# Nova
enable_service n-api
enable_service n-sch
enable_service placement-client
disable_service n-net
force=yes
" > local.conf

# 开始安装
./stack.sh

三、OpenStack Placement的运行机制

OpenStack启动Placement服务后,API请求会通过placement-api服务转发到placement服务,placement使用SQLAlchemy在nova_placement数据库中存储和管理资源信息。Placement服务数据库中的每个表都反映了资源的某个方面,比如resource_providers表包含云环境中的所有资源提供者的信息,inventory表包含资源提供者的可用资源。通过这些信息,nova-scheduler可以智能地选择最佳的资源使用哪个主机,遗留问题(比如overcommit情况下)的解决。

四、使用OpenStack Placement管理资源

1. 创建资源提供者

资源提供者是指云环境中的计算资源,可以是虚拟化主机、物理主机、容器、GPU等等。在创建虚拟机之前,需要先把相关的资源提供者添加进Placement中。

# 创建资源提供者
export OS_AUTH_TYPE=v3password
export OS_AUTH_URL=http://controller:35357/v3
export OS_PROJECT_DOMAIN_ID=default
export OS_USER_DOMAIN_ID=default
export OS_PROJECT_NAME=admin
export OS_USERNAME=admin
export OS_PASSWORD=123456
openstack resource provider create compute1

2. 给资源提供者添加设备

通过inventory表向资源提供者添加设备,这样nova-scheduler就能根据QOS之类的策略选择最佳的资源主机。

openstack resource provider inventory set \\
    --resource-provider=compute1 \\
    --resource-class=VCPU \\
    --total=24 \\
    --reserved=1 \\
    --allocation-ratio=0.9

openstack resource provider inventory set \\
    --resource-provider=compute1 \\
    --resource-class=MEMORY_MB \\
    --total=32768 \\
    --reserved=2048 \\
    --allocation-ratio=0.95

3. 创建虚拟机

通过nova-scheduler,创建配合需要的虚拟机。nova-scheduler会检查云环境中所有资源提供者的状态,根据配合策略分配资源,最后为该VM分配对应的虚拟化计算资源。

openstack flavor create m1.small --id auto \\
  --ram 1024 --disk 10 --vcpus 1

openstack server create --flavor m1.small --image cirros \\
    --nic net-id=3791572d-ffa6-49ac-a170-7b4be7fe1f81 \\
    --security-group default my_cirros_instance

4. 查看虚拟机资源分配情况

可以通过nova-show命令查看虚拟机分配情况,具体包括哪个资源提供者、CPU、Memory和DIsk等信息。

openstack server show my_cirros_instance

五、OpenStack Placement的优化策略

OpenStack Placement提供了很多灵活的配置方式,可以根据具体的需求进行优化,下面列举几个常用的策略。

1. 资源池预留

为了保证虚机启动过程中所需的资源在任何情况下都不会被用尽,通常需要预留一部分资源。比如下面的设置意味着这个资源池中最多只能有总量的80%的VM,剩余20%的资源预留给内部操作。

[[DEFAULT]] 
reserved_host_memory_mb=1024 
cpu_allocation_ratio=16.0 
ram_allocation_ratio=1.5 
max_placement_results=25 
aggregate_image_properties_isolation_namespace= 
aggregate_image_properties_isolation_separator= 
max_io_ops_per_host=8 
max_io_ops_per_instance=5 
max_instances_per_host=50 
retry_backoff=1 
retry_backoff_max=120 
retry_interval=2 
placement_client_retry_backoff=1 
placement_client_retry_backoff_max=120 
placement_client_socket_timeout=5

[[placement]] 
auth_type=v3password 
auth_url=http://controller:35357/v3
project_domain_id=default 
user_domain_id=default 
project_name=admin 
username=admin 
password=123456 
filter_scheduler 
scheduler_driver=nova.scheduler.filter_scheduler.FilterScheduler 
scheduler_host_manager=nova.scheduler.host_manager.HostManager 
available_filters=nova.scheduler.filters.all_filters 
scheduler_use_baremetal_filters=False 
isolation_filtering=False 
isolated_hosts=[] 
scheduler_json_config_location=scheduler.json 
scheduler_default_filters=RetryFilter,AvailabilityZoneFilter,RamFilter,DiskFilter,ComputeFilter,ComputeCapabilitiesFilter,ImagePropertiesFilter,ServerGroupFilter,ServerGroupAntiAffinityFilter,ServerGroupAffinityFilter 
scheduler_round_robin_strategy=constant 
scheduler_tracks_instance_changes=False 
scheduler_weight_classes=nova.scheduler.weights.all_weighers
scheduler_client_timeout=60 
scheduler_max_attempts=3 
scheduler_driver_task_period=60 

[filter_scheduler] 
host_subset_size=1 
host_subset_type=one_of 
ram_weight_multiplier=1.0 
cpu_weight_multiplier=1.0 
request_spec_modifier=nova.scheduler.filters.RequestSpecModifier$filter_scheduler 
ram_allocation_ratio=1.5 
filter_scheduler_use_baremetal_filters=False 
isolation_filtering=False 
scheduler_available_filters=nova.scheduler.filters.all_filters 
scheduler_cpu_allocation_ratio=16 
scheduler_disk_allocation_ratio=1 
scheduler_ram_allocation_ratio=1.5 
scheduler_use_baremetal_filters=False

2. 资源共享

在多租户场景下,通常需要对资源进行共享。这里可以采用共享的方式,来有效利用资源,避免资源浪费。

openstack server create --flavor m1.medium --image cirros \\
    --nic net-id=612cdad6-5fee-422c-bd23-e6a34149b740 --security-group \\
    default --hint group=workload my_cirros_instance

3. Overcommit策略

在云环境中,实际使用的资源可能比配置的资源要少很多。因此,通常会通过Overcommit的方式,优化资源利用率。下面是在Placement中通过Overcommit策略设置的例子。

# 设置核心数量的Overcommit
openstack flavor set m1.small \
  --property hw:cpu_policy=dedicated \
  --property hw:cpu_thread_policy=isolate \
  --property hw:cpu_sockets=1

# 以2倍的方式用更多的内存覆盖实例
openstack flavor set m1.small \
  --property hw:mem_page_size=large \
  --property hw:mem_2048_mb_pages=2

# 确保该节点的空闲内存百分比大于15%
openstack flavor set m1.small \
  --property resources:CUSTOM_BAREMETAL=1 \
  --property resources:MEMORY_MB=2048 \
  --property resources:VCPU=1 \
  --property resources:DISK_GB=20 \
  --property capabilities:boot_option=local \
  --property capabilities:boot_mode=bios \
  --property capabilities:cpu_arch=x86_64 \
  --property capabilities:hypervisor_version_matches_build=True \
  --property capabilities:node_capacity=1 \
  --property capabilities:node_disk_gb=20 \
  --property capabilities:node_memory_mb=2048 \
  --property capabilities:node_cpu_arch=x86_64 \
  --property capabilities:node_cpu_total=2 \
  --property capabilities:node_ram_total=2048 \
  --property capabilities:node_ram_free_percentage=15

六、总结

OpenStack Placement作为OpenStack的重要组件之一,主要用于集中化管理和分配资源。本文从构建、运行机制、使用和优化等多个方面对OpenStack Placement进行了详细的阐述。