ETSI NFV-SOL VNF 部署为虚拟机,使用 TOSCA¶
本文档描述了如何使用 CLI 命令在 Tacker v1 API 中使用 TOSCA 部署 VNF 作为虚拟机。
注意
这是 Tacker v1 API 的文档。请注意,Tacker v2 API 不支持此功能。
概述¶
下图显示了 VNF 部署的概述。
请求创建 VNF
用户通过上传 VNF 包并请求
create VNF,向 tacker-server 请求创建 VNF。VNF 包应包含VNFD。有关VNFD的详细说明,请参阅 VNF 包。请求实例化 VNF
用户通过请求
instantiate VNF并提供实例化参数,向 tacker-server 请求实例化创建的 VNF。调用 OpenStack Heat API
收到 tacker-client 的请求后,tacker-server 会将其重定向到 tacker-conductor。在 tacker-conductor 中,请求会根据实例化参数的内容再次重定向到适当的基础设施驱动程序(在本例中为 OpenStack 基础设施驱动程序)。然后,OpenStack 基础设施驱动程序调用 OpenStack Heat API 以创建虚拟机作为 VNF。
创建 VM
OpenStack Heat 根据 API 调用创建 VM。
先决条件¶
应安装以下软件包
tacker
python-tackerclient
应根据 VIM 管理 注册默认 VIM。
例如,您可以按如下方式注册默认 VIM。
$ cat vim_config.yaml
auth_url: "http://192.168.56.10/identity"
username: "admin"
password: "devstack"
project_name: "admin"
domain_name: "default"
project_domain_name: "default"
user_domain_name: "default"
cert_verify: "True"
$ openstack vim register --config-file vim_config.yaml \
--is-default openstack-admin-vim
+----------------+-----------------------------------------------------+
| Field | Value |
+----------------+-----------------------------------------------------+
| auth_cred | { |
| | "username": "admin", |
| | "user_domain_name": "default", |
| | "cert_verify": "True", |
| | "project_id": null, |
| | "project_name": "admin", |
| | "project_domain_name": "default", |
| | "auth_url": "http://192.168.56.10/identity/v3", |
| | "key_type": "barbican_key", |
| | "secret_uuid": "***", |
| | "password": "***" |
| | } |
| auth_url | http://192.168.56.10/identity/v3 |
| created_at | 2023-12-21 07:39:09.617234 |
| description | |
| extra | |
| id | 662e5f4f-3b16-4ca6-b560-28b62dd0e13b |
| is_default | True |
| name | openstack-admin-vim |
| placement_attr | { |
| | "regions": [ |
| | "RegionOne" |
| | ] |
| | } |
| project_id | 1994d69783d64c00aadab564038c2fd7 |
| status | ACTIVE |
| type | openstack |
| updated_at | None |
| vim_project | { |
| | "name": "admin", |
| | "project_domain_name": "default" |
| | } |
+----------------+-----------------------------------------------------+
下面使用的 VNF 包(sample_vnf_package_csar.zip)是通过参考 VNF 包 准备的。
例如,您可以按如下方式创建 VNF 包。 在本文档中,TACKER_ROOT 是服务器上 tacker 仓库的根目录。
$ cd TACKER_ROOT/samples/etsi_getting_started/tosca/sample_vnf_package_csar
$ zip sample_vnf_package_csar.zip -r Definitions/ Files/ TOSCA-Metadata/
updating: Definitions/ (stored 0%)
updating: Definitions/sample_vnfd_types.yaml (deflated 71%)
updating: Definitions/etsi_nfv_sol001_vnfd_types.yaml (deflated 84%)
updating: Definitions/etsi_nfv_sol001_common_types.yaml (deflated 77%)
updating: Definitions/sample_vnfd_df_simple.yaml (deflated 66%)
updating: Definitions/sample_vnfd_top.yaml (deflated 55%)
updating: Files/ (stored 0%)
updating: Files/images/ (stored 0%)
updating: Files/images/cirros-0.5.2-x86_64-disk.img (deflated 3%)
updating: TOSCA-Metadata/ (stored 0%)
updating: TOSCA-Metadata/TOSCA.meta (deflated 15%)
$ ll
...
drwxr-xr-x 2 stack stack 4096 Dec 21 08:50 Definitions/
drwxr-xr-x 3 stack stack 4096 Dec 21 03:53 Files/
-rw-rw-r-- 1 stack stack 15761428 Dec 21 08:50 sample_vnf_package_csar.zip
drwxr-xr-x 2 stack stack 4096 Dec 21 07:41 TOSCA-Metadata/
完成上述操作后,您将获得示例 VNF 包 sample_vnf_package_csar.zip。
VNF 部署过程(作为虚拟机)¶
为了将 VNF 部署为虚拟机,有必要执行以下步骤。CLI 命令的详细信息在 VNF 包管理 和 使用 v1 Tacker 进行 VNF 生命周期管理 中描述。
1. 创建 VNF 包信息¶
执行以下 CLI 命令以创建 VNF 包。
$ openstack vnf package create
结果
+-------------------+-------------------------------------------------------------------------------------------------+
| Field | Value |
+-------------------+-------------------------------------------------------------------------------------------------+
| ID | 156f1c4f-bfe2-492b-a079-a1bad32c0c3d |
| Links | { |
| | "self": { |
| | "href": "/vnfpkgm/v1/vnf_packages/156f1c4f-bfe2-492b-a079-a1bad32c0c3d" |
| | }, |
| | "packageContent": { |
| | "href": "/vnfpkgm/v1/vnf_packages/156f1c4f-bfe2-492b-a079-a1bad32c0c3d/package_content" |
| | } |
| | } |
| Onboarding State | CREATED |
| Operational State | DISABLED |
| Usage State | NOT_IN_USE |
| User Defined Data | {} |
+-------------------+-------------------------------------------------------------------------------------------------+
之后,执行以下 CLI 命令并确认 VNF 包创建成功。
确认“Onboarding State”(入职状态)为“CREATED”(已创建)。
确认“Operational State”(运行状态)为“DISABLED”(禁用)。
确认“Usage State”为“NOT_IN_USE”。
$ openstack vnf package show VNF_PACKAGE_ID \
-c 'Onboarding State' -c 'Operational State' -c 'Usage State'
结果
+-------------------+------------+
| Field | Value |
+-------------------+------------+
| Onboarding State | CREATED |
| Operational State | DISABLED |
| Usage State | NOT_IN_USE |
+-------------------+------------+
2. 上传 VNF 包¶
执行以下 CLI 命令以上传 VNF 包。
$ openstack vnf package upload --path sample_vnf_package_csar.zip VNF_PACKAGE_ID
结果
Upload request for VNF package 156f1c4f-bfe2-492b-a079-a1bad32c0c3d has been accepted.
之后,执行以下 CLI 命令并确认 VNF 包上传成功。
确认“Onboarding State”为“ONBOARDED”。
确认“Operational State”为“ENABLED”。
确认“Usage State”为“NOT_IN_USE”。
记下“VNFD ID”,因为您将在下一个“Create VNF Identifier”(创建 VNF 标识符)中需要它。
注意
“Onboarding State”(入职状态)的状态变化顺序为“UPLOADING”(上传中)、“PROCESSING”(处理中)、“ONBOARDED”(已入职)。
$ openstack vnf package show VNF_PACKAGE_ID \
-c 'Onboarding State' -c 'Operational State' -c 'Usage State' -c 'VNFD ID'
结果
+-------------------+--------------------------------------+
| Field | Value |
+-------------------+--------------------------------------+
| Onboarding State | ONBOARDED |
| Operational State | ENABLED |
| Usage State | NOT_IN_USE |
| VNFD ID | b1bb0ce7-ebca-4fa7-95ed-4840d70a1177 |
+-------------------+--------------------------------------+
3. 创建 VNF 标识符¶
执行以下 CLI 命令以创建 VNF 实例。
$ openstack vnflcm create VNFD_ID
结果
+-----------------------------+------------------------------------------------------------------------------------------------------------------+
| Field | Value |
+-----------------------------+------------------------------------------------------------------------------------------------------------------+
| ID | 810d8c9b-e467-4b06-9265-ac9dce015fce |
| Instantiation State | NOT_INSTANTIATED |
| Links | { |
| | "self": { |
| | "href": "https://:9890/vnflcm/v1/vnf_instances/810d8c9b-e467-4b06-9265-ac9dce015fce" |
| | }, |
| | "instantiate": { |
| | "href": "https://:9890/vnflcm/v1/vnf_instances/810d8c9b-e467-4b06-9265-ac9dce015fce/instantiate" |
| | } |
| | } |
| VNF Configurable Properties | |
| VNF Instance Description | |
| VNF Instance Name | vnf-810d8c9b-e467-4b06-9265-ac9dce015fce |
| VNF Package ID | 156f1c4f-bfe2-492b-a079-a1bad32c0c3d |
| VNF Product Name | Sample VNF |
| VNF Provider | Company |
| VNF Software Version | 1.0 |
| VNFD ID | b1bb0ce7-ebca-4fa7-95ed-4840d70a1177 |
| VNFD Version | 1.0 |
+-----------------------------+------------------------------------------------------------------------------------------------------------------+
之后,执行以下 CLI 命令并确认 VNF 实例创建成功。
确认 VNF 包的“Usage State”为“IN_USE”。
确认 VNF 实例的“Instantiation State”为“NOT_INSTANTIATED”。
$ openstack vnf package show VNF_PACKAGE_ID -c 'Usage State'
结果
+-------------+--------+
| Field | Value |
+-------------+--------+
| Usage State | IN_USE |
+-------------+--------+
$ openstack vnflcm show VNF_INSTANCE_ID -c 'Instantiation State'
结果
+---------------------+------------------+
| Field | Value |
+---------------------+------------------+
| Instantiation State | NOT_INSTANTIATED |
+---------------------+------------------+
4. 实例化 VNF¶
使用以下格式创建 sample_param_file.json 文件。 这是定义实例化请求参数的文件。 这些参数将在实例化请求的主体中设置。
必需参数
flavourId
注意
有关 flavourId 的详细信息,请参阅 基于 ETSI NFV-SOL001 的 VNF 描述符 (VNFD)。
可选参数
instantiationLevelId
extVirtualLinks
extManagedVirtualLinks
vimConnectionInfo
localizationLanguage
additionalParams
extensions
注意
只有在您拥有 VIM 管理 中描述的默认 VIM 时,才能跳过 vimConnectionInfo。
注意
此操作可以指定 VNF 实例的 vimConnectionInfo。即使此操作指定与一个 VNF 实例关联的多个 vimConnectionInfo,也只会使用其中一个用于生命周期管理操作。
仅包含必需参数的参数文件的示例
{
"flavourId": "simple"
}
包含可选参数的参数文件的示例
{
"flavourId": "simple",
"instantiationLevelId": "instantiation_level_1",
"extVirtualLinks": [
{
"id": "279b0e12-2cc7-48d3-89dc-c58369841763",
"vimConnectionId": "4db40866-054f-472d-b559-811e5aa7195c",
"resourceProviderId": "Company",
"resourceId": "6a3aeb3a-fb8b-4d27-a5f1-4f148aeb303f",
"extCps": [
{
"cpdId": "VDU1_CP1",
"cpConfig": {
"VDU1_CP1": {
"parentCpConfigId": "a9d72e2b-9b2f-48b8-9ca0-217ab3ba6f33",
"cpProtocolData": [
{
"layerProtocol": "IP_OVER_ETHERNET",
"ipOverEthernet": {
"ipAddresses": [
{
"type": "IPV4",
"numDynamicAddresses": 1,
"subnetId": "649c956c-1516-4d92-a6bc-ce936d8a880d"
}
]
}
}
]
}
}
}
],
"extLinkPorts": [
{
"id": "2871f033-5e38-4f5f-af26-09c6390648a8",
"resourceHandle": {
"resourceId": "389ade82-7618-4b42-bc90-5ebbac0863cf"
}
}
]
}
],
"extManagedVirtualLinks": [
{
"id": "c381e923-6208-43ac-acc9-f3afec76535a",
"vnfVirtualLinkDescId": "internalVL1",
"vimConnectionId": "4db40866-054f-472d-b559-811e5aa7195c",
"resourceProviderId": "Company",
"resourceId": "9a94da3c-239f-469d-8cf9-5313a4e3961a",
"extManagedMultisiteVirtualLinkId": "f850522e-c124-4ed9-8027-f15abc22e21d"
}
],
"vimConnectionInfo": [
{
"id": "e24f9796-a8e9-4cb0-85ce-5920dcddafa1",
"vimId": "8a0fd79d-e224-4c27-85f5-ee79c6e0d870",
"vimType": "ETSINFV.OPENSTACK_KEYSTONE.V_2"
}
],
"localizationLanguage": "ja",
"additionalParams": {
"key": "value"
},
"extensions": {
"key": "value"
}
}
本文档中使用的 samlple_param_file.json 如下所示。
{
"flavourId": "simple",
"vimConnectionInfo": [
{
"id": "e24f9796-a8e9-4cb0-85ce-5920dcddafa1",
"vimId": "${vim_uuid}",
"vimType": "ETSINFV.OPENSTACK_KEYSTONE.V_2"
}
]
}
执行以下 CLI 命令以实例化 VNF 实例。
$ openstack vnflcm instantiate VNF_INSTANCE_ID ./sample_param_file.json
结果
Instantiate request for VNF Instance 810d8c9b-e467-4b06-9265-ac9dce015fce has been accepted.
之后,执行以下 CLI 命令并确认 VNF 实例实例化成功。
确认“Instantiation State”为“INSTANTIATED”。
$ openstack vnflcm show VNF_INSTANCE_ID -c 'Instantiation State'
结果
+---------------------+--------------+
| Field | Value |
+---------------------+--------------+
| Instantiation State | INSTANTIATED |
+---------------------+--------------+
1. 终止 VNF¶
执行以下 CLI 命令以终止 VNF 实例。
$ openstack vnflcm terminate VNF_INSTANCE_ID
结果
Terminate request for VNF Instance '810d8c9b-e467-4b06-9265-ac9dce015fce' has been accepted.
之后,执行以下 CLI 命令并确认 VNF 实例终止成功。
确认“Instantiation State”(实例化状态)为“NOT_INSTANTIATED”(未实例化)。
$ openstack vnflcm show VNF_INSTANCE_ID \
-c 'Instantiation State'
结果
+---------------------+------------------+
| Field | Value |
+---------------------+------------------+
| Instantiation State | NOT_INSTANTIATED |
+---------------------+------------------+
6. 删除 VNF 标识符¶
执行以下 CLI 命令以删除 VNF 实例。
$ openstack vnflcm delete VNF_INSTANCE_ID
结果
Vnf instance '810d8c9b-e467-4b06-9265-ac9dce015fce' is deleted successfully
之后,执行以下 CLI 命令并确认 VNF 实例删除成功。
确认 VNF 包的“Usage State”为“NOT_IN_USE”。
确认未找到 VNF 实例。
$ openstack vnf package show VNF_PACKAGE_ID \
-c 'Usage State'
结果
+-------------+------------+
| Field | Value |
+-------------+------------+
| Usage State | NOT_IN_USE |
+-------------+------------+
$ openstack vnflcm show VNF_INSTANCE_ID
结果
Can not find requested vnf instance: 810d8c9b-e467-4b06-9265-ac9dce015fce