支持 CNF 的规模化操作¶
https://blueprints.launchpad.net/tacker/+spec/support-cnf-scale
本文档描述了 Tacker 中容器化网络功能 (CNF) 的 VNF 生命周期管理中的“规模化 VNF”操作。
问题描述¶
在 Victoria 版本中,规范 ETSI NFV-SOL003 v2.6.1 中定义的 VNF 生命周期管理中的实例化和终止 VNF 操作,已在规范 container-network-function 中得到支持。 还需要实现符合 ETSI 规范的 CNF 规模化操作。 然而,当前的 ETSI NFV-SOL 文档尚未定义基于 OS 容器的 VNF 的详细规范。 本规范提供了 Tacker 中 CNF 规模化操作的定义以及要实现的设计。
提议的变更¶
本规范提出了规模化操作及其设计的定义。
CNF 规模化的定义¶
我们建议 CNF 的规模化操作是更改 VNF 实例中 VNFC 的数量。 当 VNF 实例由 OS 容器组成,并且 VIM 假定为 Kubernetes 时,VDU 可以映射到 Deployment、DaemonSet、StatefulSet 或 ReplicaSet,而 VNFC 实例可以是 Pod。 规模化操作会更改 VDU 资源的副本数量,Kubernetes 控制器会自动创建或删除 Pod。
注意
也可以定义规模化操作为更改 maxReplicas 或 minReplicas 在 HorizontalPodAutoscaler (HPA) 中,但是,这是未来的工作。 要部署 HPA,还需要定义如何实例化和配置所需的指标服务器。
注意
在缩减规模时,分配的持久卷 (PVC) 和持久卷 (PV) 会保留。 同样,在扩展规模时,如果 Pod 具有 PVC 的规范部分,则用户需要在操作之前配置所需的 PVC 和 PV。
“规模化 CNF”操作的设计¶
在规模化操作之前,需要实例化包含具有副本属性的资源的 CNF。 Kubernetes Infra Driver 需要以下更改
验证目标 Kubernetes 资源以支持规模化操作
从 VNFD 加载
scalingAspect使用
scalingAspect计算所需的副本数量规模化操作完成后,将当前的
scaleLevel存储到 InstantiateVnfInfo.ScaleStatus支持 Kubernetes Python 客户端以更新以下 Kubernetes 资源类型的副本数量
Deployment
ReplicaSet
StatefulSet
注意
DaemonSet 也可以映射到 VDU,但由于它没有副本属性,因此不支持规模化操作。
下图显示了已实例化的 CNF 的 CNF 规模化操作
+--------------------+
| Scale Request with |
| additional Params |
+--------+-----------+
| 1. Request scale
| CNF
+--------+----------------+
| v |
| +-------------------+ |
| | Tacker-server | |
| +-----+-------------+ |
| | |
| v |
| +--------------------+ |
2. Scale CNF | | +--------------+ | |
+--------+-+--| Kubernetes | | |
+------------------+ 3. Change the | | | | Infra Driver | | |
| | number of v | | +--------------+ | |
| +-----+ +-----+ | Pods +------------+ | | | |
| | Pod | | Pod |<-+-------------| Kubernetes | | | | |
| +-----+ +-----+ | | cluster | | | | |
| | | (Master) | | | | |
| Kubernetes | +------------+ | | Tacker-conductor | |
| cluster (Worker) | | +--------------------+ |
+------------------+ +-------------------------+
Tacker-server 接收来自用户的规模化请求。
Kubernetes Infra Driver 调用 Kubernetes 客户端 API 进行规模化。
Kubernetes 集群根据计算出的副本数量增加或减少在工作节点上运行的 Pod 数量。
VNFD 的“规模化 CNF”操作¶
VNFD 需要具有以下示例中的 ScalingAspects 定义
node_templates:
VNF:
type: Company.Tacker.Kubernetes
properties:
flavour_description: The pre_installed flavour
deployment_name:
type: tosca.nodes.nfv.Vdu.Compute
properties:
name: deployment_name
description: Deployment of Kubernetes resource
vdu_profile:
min_number_of_instances: 1
max_number_of_instances: 3
policies:
- scaling_aspects:
type: tosca.policies.nfv.ScalingAspects
properties:
aspects:
deployment_name:
name: deployment_name
description: deployment_name scaling aspect
max_scale_level: 3
step_deltas:
- delta_1
- deployment_name_scaling_aspect_deltas:
type: tosca.policies.nfv.VduScalingAspectDeltas
properties:
aspect: deployment_name
deltas:
delta_1:
number_of_instances: 1
targets: [ deployment_name ]
注意
VDU 和 aspects 的名称应与 Kubernetes 清单文件中定义的 Kubernetes 资源的名称相同。
注意
VNFD 的其他部分在规范 container-network-function 中使用示例进行了描述。
CNF 的缩放/扩展¶
用户在“POST /vnf_instances/{id}/scale”中提供以下请求参数作为 ETSI NFV-SOL003 v2.6.1 中定义的 ScaleVnfRequest 数据类型
属性名称
参数描述
type
指示规模化操作的类型: “SCALE_IN” 或 “SCALE_OUT”
aspectId
指示目标 Kubernetes 资源的名称。 这在 VNFD 中定义,用户可以在“GET /vnf_instances/{id}”的响应中将其作为
InstantiatedVnfInfo.ScaleStatus找到。numberOfSteps
规模化步骤数。
additionalParams
不需要。
以下是用于缩减规模的请求体的示例
{
"type": "SCALE_IN",
"aspectId": "deployment_name",
"numberOfSteps": "1"
}
以下序列图描述了 CNF 规模化操作中涉及的组件和流程
客户端向 CNF 实例发送 POST 请求。
基本上与规范 support-scale-api-based-on-etsi-nfv-sol 中描述的相同序列,但 Tacker-conductor 除外。 在 CNF 规模化操作的情况下,不需要 MgmtDriver 操作。
KubernetesDriver 在 scale() 方法中调用 Kubernetes API 读取当前副本数量。
KubernetesDriver 在 scale() 方法中调用 Kubernetes API 对资源进行缩减/扩展。 要缩减/扩展的 Pod 数量是通过将 Scale VNF 请求中包含的“number_of_steps”乘以 VNFD 中的“number_of_instances”来计算的。
KubernetesDriver 在 scale_wait() 方法中检查规模化结果。
VnfLcmDriver 在规模化操作成功后,将当前的 scaleLevel 保存到 VnfInstance.InstantiatedVnfInfo.scale_status。
注意
规模化操作后的副本数量未存储在 Tacker DB 中,因此修复操作可能会导致 Pod 数量与规模化的 CNF 不同。 副本应导致使用实例化级别的实例化计算出的数量,因为 Tacker 在修复操作中终止并实例化 CNF。
Kubernetes API 支持¶
Kubernetes Infra Driver 调用以下 API 以获取当前副本数量并更新目标资源的副本数量。
API 组
类型
API 方法
apps (AppsV1Api)
GET
read_namespaced_deployment_scale
read_namespaced_replica_set_scale
read_namespaced_stateful_set_scale
PATCH
patch_namespaced_deployment_scale
patch_namespaced_replica_set_scale
patch_namespaced_stateful_set_scale
Read API 的参数是 name 和 namespace,API 的返回类型是 Kubernetes-client docs 中描述的 V1Scale。
Patch API 的参数是 name、namespace 和 body。 body 设置为使用 Read API 中返回的值更新“spec.replicas”的值。
V1Scale 中“spec.replicas”的数量计算如下
缩减规模:update_replicas = current_replicas - scaling_step * number_of_steps
扩展规模:update_replicas = current_replicas + scaling_step * number_of_steps
计算中使用的参数定义如下
current_replicas:“spec.replicas”来自通过 Read API 获取的 V1Scale
scaling_spec:“number_of_instances”在 VNFD 中定义的 scalingAspect 中
number_of_steps:ScaleVnfRequest 中给定的参数
备选方案¶
无
数据模型影响¶
无
REST API 影响¶
无
安全影响¶
无
通知影响¶
无
其他最终用户影响¶
无
性能影响¶
无
其他部署者影响¶
无
开发人员影响¶
无
实现¶
负责人¶
- 主要负责人
- 其他贡献者
Ayumu Ueha <ueha.ayumu@fujitsu.com>
LiangLu <lu.liang@fujitsu.com>
工作项¶
验证目标 Kubernetes 资源以支持规模化操作。
Kubernetes Infra Driver 将被修改以实现
从 VNFD 加载
scalingAspect使用
scalingAspect计算所需的副本数量规模化操作完成后,将当前的
scaleLevel存储到 InstantiateVnfInfo.ScaleStatus支持 Kubernetes Python 客户端以更新以下 Kubernetes 资源类型的副本数量
Deployment
ReplicaSet
StatefulSet
添加新的单元和功能测试。
依赖项¶
无
测试¶
将添加单元和功能测试,以涵盖规范所需的用例。
文档影响¶
将添加完整的用户指南来解释 CNF 规模化。
参考资料¶
无