支持 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。

注意

也可以定义规模化操作为更改 maxReplicasminReplicasHorizontalPodAutoscaler (HPA) 中,但是,这是未来的工作。 要部署 HPA,还需要定义如何实例化和配置所需的指标服务器。

注意

在缩减规模时,分配的持久卷 (PVC) 和持久卷 (PV) 会保留。 同样,在扩展规模时,如果 Pod 具有 PVC 的规范部分,则用户需要在操作之前配置所需的 PVC 和 PV。

“规模化 CNF”操作的设计

在规模化操作之前,需要实例化包含具有副本属性的资源的 CNF。 Kubernetes Infra Driver 需要以下更改

  1. 验证目标 Kubernetes 资源以支持规模化操作

  2. 从 VNFD 加载 scalingAspect

  3. 使用 scalingAspect 计算所需的副本数量

  4. 规模化操作完成后,将当前的 scaleLevel 存储到 InstantiateVnfInfo.ScaleStatus

  5. 支持 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) |                             | +--------------------+  |
+------------------+                             +-------------------------+
  1. Tacker-server 接收来自用户的规模化请求。

  2. Kubernetes Infra Driver 调用 Kubernetes 客户端 API 进行规模化。

  3. 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 ]

注意

VDUaspects 的名称应与 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 规模化操作中涉及的组件和流程

../../_images/0127.png
  1. 客户端向 CNF 实例发送 POST 请求。

  2. 基本上与规范 support-scale-api-based-on-etsi-nfv-sol 中描述的相同序列,但 Tacker-conductor 除外。 在 CNF 规模化操作的情况下,不需要 MgmtDriver 操作。

  3. KubernetesDriver 在 scale() 方法中调用 Kubernetes API 读取当前副本数量。

  4. KubernetesDriver 在 scale() 方法中调用 Kubernetes API 对资源进行缩减/扩展。 要缩减/扩展的 Pod 数量是通过将 Scale VNF 请求中包含的“number_of_steps”乘以 VNFD 中的“number_of_instances”来计算的。

  5. KubernetesDriver 在 scale_wait() 方法中检查规模化结果。

  6. 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 的参数是 namenamespace,API 的返回类型是 Kubernetes-client docs 中描述的 V1Scale。

Patch API 的参数是 namenamespacebody。 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 影响

安全影响

通知影响

其他最终用户影响

性能影响

其他部署者影响

开发人员影响

实现

负责人

主要负责人

伊藤良人 <yoshito.itou.dr@hco.ntt.co.jp>

其他贡献者

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 规模化。

参考资料