ETSI NFV-SOL CNF 自动伸缩,通过 PM Job 接口与 Prometheus¶
本文档描述了如何在 Tacker v2 API 中通过性能管理 Job 接口,使用 Prometheus 实现 CNF 的自动伸缩。
注意
本文档的内容已确认在使用 Prometheus 2.45 和 Alertmanager 0.26 时有效。
概述¶
下图显示了 CNF 自动伸缩的概述。
创建 PM job
NFVO 向 Tacker 发送请求以创建 PM job。
设置 PM job
Prometheus 插件将 PM job 设置到 Prometheus。
触发事件
Prometheus 收集指标并决定是否需要触发事件。
POST 事件
Prometheus 向 Tacker 发送带有指定 URI 的 POST 请求。Tacker 收集与 PM 事件相关的数据。
将事件转换为报告
Tacker 接收到通知事件,将其转换为报告并保存到数据库。Tacker 还保存事件的时间戳。
发送报告通知
VnfPmDriverV2 在数据库中找到所有 job,并将报告与 job 匹配。如果有一个 job 可以成功匹配,则报告将发送到 NFVO 的指定路径。如果匹配不成功,则处理结束。
获取 PM 报告
NFVO 请求报告内容,然后做出伸缩决策。
规模
收到来自 NFVO 的 VNF 伸缩请求后,tacker-server 会将其重定向到 tacker-conductor。
调用 Kubernetes API
在 tacker-conductor 中,请求会根据实例化参数的内容再次重定向到适当的基础设施驱动程序(在本例中为 Kubernetes 基础设施驱动程序)。然后,Kubernetes 基础设施驱动程序调用 Kubernetes API。
更改 Pod 的数量
Kubernetes 集群根据 API 调用更改 Pod 的数量。
先决条件¶
应安装以下软件包
tacker
python-tackerclient
至少需要一个状态为
INSTANTIATED的 VNF 实例。有关实例化 VNF 的过程,请参阅 ETSI NFV-SOL CNF(容器化 VNF)部署。使用的 VNF 包可以参考 示例。
应安装以下第三方服务
NFVO
Prometheus(包括 Alertmanager)
每个运营商都有自己的 NFVO,这里没有限制,只要符合 ETSI NFV-SOL 002 v3.3.1 和 ETSI NFV-SOL 003 v3.3.1,就可以使用。
有关 Prometheus 和 Alertmanager 的安装,请参考 官方网站。
注意
Tacker 通过向
/-/reload端点发送 HTTP POST 请求来重新加载 Prometheus 配置。因此,Prometheus 需要启用--web.enable-lifecycle标志。有关详细信息,请参阅 Prometheus 配置。
如何配置 Prometheus 插件¶
Tacker 中的 Prometheus 插件默认情况下是禁用的。要使其工作,我们需要在 tacker.conf 中找到 performance_management 并将其值更改为 True。
$ vi /etc/tacker/tacker.conf
...
[prometheus_plugin]
performance_management = True
[v2_vnfm]
# Enable https access to notification server from Tacker (boolean value)
notification_verify_cert = true
...
修改配置文件后,请不要忘记重启 Tacker 服务以使更改生效。
$ sudo systemctl stop devstack@tacker
$ sudo systemctl restart devstack@tacker-conductor
$ sudo systemctl start devstack@tacker
如何创建 PM job¶
在拥有可以伸缩的 CNF 后,我们需要创建一个 PM job。它确定 Prometheus 使用的监控指标和监控资源。
注意
在拥有 NFVO 客户端时,请求由 NFVO 发送。
创建 PM job 的接口在 ETSI NFV-SOL 002 v3.3.1 和 ETSI NFV-SOL 003 v3.3.1 中定义。
以下是此接口所需的参数。
属性名称 |
数据类型 |
基数 |
描述 |
|---|---|---|---|
objectType |
字符串 |
1 |
被测量对象的类型。适用于测量的对象类型在 ETSI GS NFV-IFA 027 的 7.2 条中定义。 |
objectInstanceIds |
标识符 |
1..N |
请求收集性能信息的被测对象实例的标识符。 |
subObjectInstanceIds |
IdentifierInVnf |
0..N |
对于结构化的被测对象,被测对象实例的标识符。 |
criteria |
PmJobCriteria |
1 |
性能信息收集的标准。 |
performanceMetric |
字符串 |
0..N |
这定义了指定对象实例的性能指标类型。有效值在 ETSI GS NFV-IFA 027 的 7.2 条中指定为“测量名称”值。至少存在两个属性中的一个(性能指标或组)。 |
performanceMetricGroup |
字符串 |
0..N |
性能指标组。指标组是预定义的指标列表,API 生产者知道它可以将其分解为单个指标。有效值在 ETSI GS NFV-IFA 027 的 7.2 条中指定为“测量组”值。至少存在两个属性中的一个(性能指标或组)。 |
collectionPeriod |
UnsignedInt |
1 |
指定 API 生产者将收集性能信息的周期性。单位为秒。 |
reportingPeriod |
UnsignedInt |
1 |
指定 API 生产者将向 API 消费者报告性能信息的周期性。单位为秒。reportingPeriod 应该等于或 collectionPeriod 的倍数。 |
reportingBoundary |
DateTime |
0..1 |
标识一个时间边界,在此之后将停止报告。边界应允许单个报告以及直到边界的周期性报告。 |
callbackUri |
Uri |
1 |
发送通知的端点的 URI。 |
authentication |
SubscriptionAuthentication |
0..1 |
配置使用授权发送与此订阅对应的通知时的身份验证参数。请参阅 ETSI GS NFV-SOL 013 的 8.3.4 条。 |
metadata |
结构 |
1 |
创建 PM job 的附加参数。 |
监控 |
结构 |
1 |
处理诸如监控系统和驱动程序信息等内容。 |
monitorName |
字符串 |
1 |
如果指定“prometheus”,监控功能的后端将是 Prometheus。 |
driverType |
字符串 |
1 |
“external”: SCP/SFTP 用于配置文件传输。 |
targetsInfo |
结构 |
1..N |
有关目标监控系统的信息。 |
prometheusHost |
字符串 |
1 |
目标 PrometheusServer 的 FQDN 或 IP 地址。 |
prometheusHostPort |
Int |
1 |
ssh 目标 PrometheusServer 的端口。 |
alertRuleConfigPath |
字符串 |
1 |
目标 Prometheus 的 alertRuleConfig 路径。 |
prometheusReloadApiEndpoint |
字符串 |
1 |
目标 Prometheus 的重新加载 API 的端点 URL。 |
authInfo |
结构 |
1 |
定义访问主机的身份验证信息。 |
ssh_username |
字符串 |
1 |
目标主机的 ssh 用户名。 |
ssh_password |
字符串 |
1 |
目标主机的 ssh 密码。 |
注意
如果存在
subObjectInstanceIds,则objectInstanceIds属性的基数应为 1。performanceMetric和performanceMetricGroup,至少存在两个属性中的一个。objectType只有以下值:Vnf、Vnfc、VnfIntCp、VnfExtCp。
可以使用以下 CLI 命令创建 PM job。
$ openstack vnfpm job create sample_param_file.json --os-tacker-api-version 2
本文档中示例 sample_param_file.json 的内容如下
{
"objectType": "Vnf",
"objectInstanceIds": ["a0205e7c-fdeb-4f6c-b266-962246e32626"],
"criteria": {
"performanceMetric": ["VCpuUsageMeanVnf.a0205e7c-fdeb-4f6c-b266-962246e32626"],
"performanceMetricGroup": [],
"collectionPeriod": 30,
"reportingPeriod": 60
},
"callbackUri": "http://127.0.0.1:9990/notification/callbackuri/a0205e7c-fdeb-4f6c-b266-962246e32626",
"metadata": {
"monitoring": {
"monitorName": "prometheus",
"driverType": "external",
"targetsInfo": [
{
"prometheusHost": "192.168.121.35",
"prometheusHostPort": 22,
"authInfo": {
"ssh_username": "vagrant",
"ssh_password": "vagrant"
},
"alertRuleConfigPath":
"/etc/prometheus/rules",
"prometheusReloadApiEndpoint":
"http://192.168.121.35:9090/-/reload"
}
]
}
}
}
以下是创建 PM job 的示例
$ openstack vnfpm job create sample_param_file.json --os-tacker-api-version 2
+-------------------------+----------------------------------------------------------------------------------------------------------+
| Field | Value |
+-------------------------+----------------------------------------------------------------------------------------------------------+
| Callback Uri | http://127.0.0.1:9990/notification/callbackuri/a0205e7c-fdeb-4f6c-b266-962246e32626 |
| Criteria | { |
| | "performanceMetric": [ |
| | "VCpuUsageMeanVnf.a0205e7c-fdeb-4f6c-b266-962246e32626" |
| | ], |
| | "collectionPeriod": 30, |
| | "reportingPeriod": 60 |
| | } |
| ID | 84b227dc-5ed0-411a-aff6-c830528eaec5 |
| Links | { |
| | "self": { |
| | "href": "http://127.0.0.1:9890/vnfpm/v2/pm_jobs/84b227dc-5ed0-411a-aff6-c830528eaec5" |
| | }, |
| | "objects": [ |
| | { |
| | "href": "http://127.0.0.1:9890/vnflcm/v2/vnf_instances/a0205e7c-fdeb-4f6c-b266-962246e32626" |
| | } |
| | ] |
| | } |
| Object Instance Ids | [ |
| | "a0205e7c-fdeb-4f6c-b266-962246e32626" |
| | ] |
| Object Type | Vnf |
| Reports | [] |
| Sub Object Instance Ids | |
+-------------------------+----------------------------------------------------------------------------------------------------------+
创建 PM job 时,Tacker 将根据 metadata 修改指定的 Prometheus 上的配置文件。然后 Prometheus 将监控指定的资源并将监控信息发送到 Tacker。
以下是 Prometheus 发送信息的请求体的示例
{
"receiver": "receiver",
"status": "firing",
"alerts": [
{
"status": "firing",
"labels": {
"receiver_type": "tacker",
"function_type": "vnfpm",
"job_id": "84b227dc-5ed0-411a-aff6-c830528eaec5",
"metric": "VCpuUsageMeanVnf.a0205e7c-fdeb-4f6c-b266-962246e32626",
"object_instance_id": "a0205e7c-fdeb-4f6c-b266-962246e32626"
},
"annotations": {
"value": 99
},
"startsAt": "2022-06-21T23:47:36.453Z",
"endsAt": "0001-01-01T00:00:00Z",
"generatorURL": "http://192.168.121.35:9090/graph?g0.expr=up%7Bjob%3D%22node%22%7D+%3D%3D+0&g0.tab=1",
"fingerprint": "5ef77f1f8a3ecb8d"
}
],
"groupLabels": {},
"commonLabels": {
"alertname": "NodeInstanceDown",
"job": "node"
},
"commonAnnotations": {
"description": "sample"
},
"externalURL": "http://192.168.121.35:9093",
"version": "4",
"groupKey": "{}:{}",
"truncatedAlerts": 0
}
Tacker 将接收到的监控信息转换为报告并向 NFVO 发送通知请求。
以下是示例通知请求的请求体。
{
"id": "29de3afc-0547-4f43-b921-1d6ceaf16bd4",
"notificationType": "PerformanceInformationAvailableNotification",
"timeStamp": "2023-11-20T14:25:04Z",
"pmJobId": "84b227dc-5ed0-411a-aff6-c830528eaec5",
"objectType": "Vnf",
"objectInstanceId": "a0205e7c-fdeb-4f6c-b266-962246e32626",
"_links": {
"objectInstance": {
"href": "http://127.0.0.1:9890/vnflcm/v2/vnf_instances/a0205e7c-fdeb-4f6c-b266-962246e32626"
},
"pmJob": {
"href": "http://127.0.0.1:9890/vnfpm/v2/pm_jobs/84b227dc-5ed0-411a-aff6-c830528eaec5"
},
"performanceReport": {
"href": "http://127.0.0.1:9890/vnfpm/v2/pm_jobs/84b227dc-5ed0-411a-aff6-c830528eaec5/reports/eab93857-eb72-49ce-9173-628a3f00ba2d"
}
}
}
注意
此通知请求的目标 URL 是 PM job 中的 Callback Uri 字段。
NFVO 如何自动伸缩 CNF¶
NFVO 将根据通知请求中的报告 URL 向 Tacker 发送获取 PM 报告的请求。
Tacker 返回的响应如下
{
"entries": [{
"objectType": "Vnf",
"objectInstanceId": "a0205e7c-fdeb-4f6c-b266-962246e32626",
"performanceMetric": "VCpuUsageMeanVnf.a0205e7c-fdeb-4f6c-b266-962246e32626",
"performanceValues": [{
"timeStamp": "2023-11-20T14:25:04Z",
"value": "1.0002889206831795"
}]
}]
}
NFVO 将根据报告数据确定是否需要伸缩操作。如果需要,将向 Tacker 发送伸缩请求。
如何使用 PM 接口的 CLI¶
创建 PM job¶
PM job 的创建已经在 如何创建 PM job 中介绍,CLI 命令的使用案例可以在那里参考。
获取所有 PM job¶
可以使用以下 CLI 命令获取所有 PM job。
$ openstack vnfpm job list --os-tacker-api-version 2
以下是获取所有 PM job 的示例
$ openstack vnfpm job list --os-tacker-api-version 2
+--------------------------------------+-------------+----------------------------------------------------------------------------------------------------------+
| Id | Object Type | Links |
+--------------------------------------+-------------+----------------------------------------------------------------------------------------------------------+
| 84b227dc-5ed0-411a-aff6-c830528eaec5 | Vnf | { |
| | | "self": { |
| | | "href": "http://127.0.0.1:9890/vnfpm/v2/pm_jobs/84b227dc-5ed0-411a-aff6-c830528eaec5" |
| | | }, |
| | | "objects": [ |
| | | { |
| | | "href": "http://127.0.0.1:9890/vnflcm/v2/vnf_instances/a0205e7c-fdeb-4f6c-b266-962246e32626" |
| | | } |
| | | ] |
| | | } |
+--------------------------------------+-------------+----------------------------------------------------------------------------------------------------------+
获取指定的 PM job¶
可以使用以下 CLI 命令获取指定的 PM job。
$ openstack vnfpm job show JOB_ID --os-tacker-api-version 2
以下是获取指定 PM job 的示例
$ openstack vnfpm job show 84b227dc-5ed0-411a-aff6-c830528eaec5 --os-tacker-api-version 2
+-------------------------+----------------------------------------------------------------------------------------------------------+
| Field | Value |
+-------------------------+----------------------------------------------------------------------------------------------------------+
| Callback Uri | http://127.0.0.1:9990/notification/callbackuri/a0205e7c-fdeb-4f6c-b266-962246e32626 |
| Criteria | { |
| | "performanceMetric": [ |
| | "VCpuUsageMeanVnf.a0205e7c-fdeb-4f6c-b266-962246e32626" |
| | ], |
| | "collectionPeriod": 30, |
| | "reportingPeriod": 60 |
| | } |
| ID | 84b227dc-5ed0-411a-aff6-c830528eaec5 |
| Links | { |
| | "self": { |
| | "href": "http://127.0.0.1:9890/vnfpm/v2/pm_jobs/84b227dc-5ed0-411a-aff6-c830528eaec5" |
| | }, |
| | "objects": [ |
| | { |
| | "href": "http://127.0.0.1:9890/vnflcm/v2/vnf_instances/a0205e7c-fdeb-4f6c-b266-962246e32626" |
| | } |
| | ] |
| | } |
| Object Instance Ids | [ |
| | "a0205e7c-fdeb-4f6c-b266-962246e32626" |
| | ] |
| Object Type | Vnf |
| Reports | [] |
| Sub Object Instance Ids | |
+-------------------------+----------------------------------------------------------------------------------------------------------+
更改目标 PM job¶
更新 PM job 只能更改两个字段,callbackUri 和 authentication。可以使用以下 CLI 命令执行此操作。
$ openstack vnfpm job update JOB_ID sample_param_file.json --os-tacker-api-version 2
本文档中示例 sample_param_file.json 的内容如下
{
"callbackUri": "http://127.0.0.1:9990/notification/callbackuri/a0205e7c-fdeb-4f6c-b266-962246e32626-update"
}
以下是更改目标 PM job 的示例
$ openstack vnfpm job update 84b227dc-5ed0-411a-aff6-c830528eaec5 sample_param_file.json --os-tacker-api-version 2
+----------------+--------------------------------------------------------------------------------------------+
| Field | Value |
+----------------+--------------------------------------------------------------------------------------------+
| Callback Uri | http://127.0.0.1:9990/notification/callbackuri/a0205e7c-fdeb-4f6c-b266-962246e32626-update |
+----------------+--------------------------------------------------------------------------------------------+
删除指定的 PM job¶
可以使用以下 CLI 命令删除指定的 PM job。
$ openstack vnfpm job delete JOB_ID --os-tacker-api-version 2
以下是删除指定 PM job 的示例
$ openstack vnfpm job delete 84b227dc-5ed0-411a-aff6-c830528eaec5 --os-tacker-api-version 2
VNF PM job '84b227dc-5ed0-411a-aff6-c830528eaec5' deleted successfully
获取指定的 PM 报告¶
可以使用以下 CLI 命令获取指定的 PM 报告。
$ openstack vnfpm report show JOB_ID REPORT_ID --os-tacker-api-version 2
以下是获取指定 PM 报告的示例
$ openstack vnfpm report show 84b227dc-5ed0-411a-aff6-c830528eaec5 eab93857-eb72-49ce-9173-628a3f00ba2d --os-tacker-api-version 2
+---------+---------------------------------------------------------------------------------------+
| Field | Value |
+---------+---------------------------------------------------------------------------------------+
| Entries | [ |
| | { |
| | "objectType": "Vnf", |
| | "objectInstanceId": "a0205e7c-fdeb-4f6c-b266-962246e32626", |
| | "performanceMetric": "VCpuUsageMeanVnf.a0205e7c-fdeb-4f6c-b266-962246e32626", |
| | "performanceValues": [ |
| | { |
| | "timeStamp": "2023-11-20T14:25:04Z", |
| | "value": "1.0002889206831795" |
| | } |
| | ] |
| | } |
| | ] |
+---------+---------------------------------------------------------------------------------------+