支持 CNF 的 Heal 操作

https://blueprints.launchpad.net/tacker/+spec/support-cnf-heal

本文档描述了 Tacker 中容器化网络功能 (CNF) 的 VNF 生命周期管理中的“Heal VNF”操作。

问题描述

Victoria 版本中,spec ETSI NFV-SOL003 v2.6.1 中定义的 VNF 生命周期管理中的实例化和终止 VNF 操作,已在 spec container-network-function 中得到支持。也需要实现符合 ETSI 规范的 CNF heal 操作。但是,当前的 ETSI NFV-SOL 文档尚未定义基于 OS 容器的 VNF 的详细规范。本文档提供了 Tacker 中 CNF heal 操作的定义以及要实现的设计。

根据 ETSI NFV-SOL 文档,定义了两种不同类型的 heal 操作

  • 使用 SOL003 Heal VNF 实例

  • 使用 SOL002 Heal VNFC

提议的变更

本文档提出了 heal 操作及其设计的定义。

CNF healing 的定义

对于“使用 SOL003 Heal VNF 实例”,heal 操作被定义为 VNF 的终止和实例化。

对于“使用 SOL002 Heal VNFC”,Pod 映射到 VNFC。Pod 可以是单例,也可以使用 Kubernetes 中的控制器资源(例如 Deployment、DaemonSet、StatefulSet 或 ReplicaSet)创建。heal 操作被定义为删除 Pod。当 Pod 是单例时,需要创建一个新的 Pod,而对于控制器资源,则不需要 Pod 的重生,因为 Kubernetes 会自动创建一个新的 Pod。

注意

以下是在 Kubernetes 中定义为控制器资源

  • Deployment

  • DaemonSet

  • StatefulSet

  • ReplicaSet

  • Job

  • CronJob

Tacker 将支持单例 Pod 或使用 Deployment、DaemonSet、StatefulSet 和 ReplicaSet 创建的 Pod 的 heal 操作。使用 Job 和 CronJob 创建的 Pod 超出范围,因为不需要 heal 操作。

当用户执行“使用 SOL003 Heal VNF 实例”时,VNF 包中描述的所有 Kubernetes 资源将被重新创建,但是对于 StatefulSet 的情况,Kubernetes 自动创建的 PersistentVolumeClaim 分配的 PersistentVolume 不会被删除。此外,在“使用 SOL002 Heal VNFC”中,只有使用提供的 VNFC ID 指定的 Pod 会被重新创建,其他相关资源不会被删除。

heal 操作的设计

在执行 heal 操作之前,需要实例化包含资源的 CNF。Kubernetes Infra Driver 需要以下更改

  1. 验证目标 Kubernetes 资源以支持 heal 操作

  2. 通过重新创建单例 Pod 来 heal VNFC。

  3. 通过删除使用以下 Kubernetes 控制器资源创建的 Pod 来 heal VNFC

    • Deployment

    • DaemonSet

    • StatefulSet

    • ReplicaSet

  4. 存储和更新 VNFC 资源信息以进行 heal 操作

注意

使用 SOL003 的 VNF 实例 heal 操作已经实现为 VNF 的终止和实例化。

下图显示了已实例化的 CNF 的 CNF heal 操作

                                                 +--------------------+
                                                 | Heal Request with  |
                                                 | additional Params  |
                                                 +--------+-----------+
                                                          | 1. Request heal
                                                          |    CNF
                                                 +--------+----------------+
                                                 |        v                |
                                                 |  +-------------------+  |
                                                 |  |   Tacker-server   |  |
                                                 |  +-----+-------------+  |
                                                 |        |                |
                                                 |        v                |
                                                 | +--------------------+  |
                                    2. Heal CNF  | |  +--------------+  |  |
                                        +--------+-+--| Kubernetes   |  |  |
+------------------+ 3. Re-create       |        | |  | Infra Driver |  |  |
|                  |    VNF or VNFC     v        | |  +--------------+  |  |
| +-----+ +-----+  |             +------------+  | |                    |  |
| | Pod | | Pod |<-+-------------| Kubernetes |  | |                    |  |
| +-----+ +-----+  |             | cluster    |  | |                    |  |
|                  |             | (Master)   |  | |                    |  |
| Kubernetes       |             +------------+  | | Tacker conductor   |  |
| cluster (Worker) |                             | +--------------------+  |
+------------------+                             +-------------------------+
  1. Tacker-server 接收来自用户的 heal 请求

  2. Kubernetes Infra Driver 调用 Kubernetes 客户端 API 进行 heal(删除 Pod 或删除并创建 Kubernetes 资源)

  3. Kubernetes Master 节点在 worker 节点上重新创建 Pod

示例 VNFD 文件

VNFD 需要将 VDU 定义为资源名称。以下是 Deployment 的示例。

tosca_definitions_version: tosca_simple_yaml_1_2

description: Deployment flavour for Kubernetes Cluster with
    "pre_installed" flavour ID

imports:
  - etsi_nfv_sol001_common_types.yaml
  - etsi_nfv_sol001_vnfd_types.yaml

topology_template:
  inputs:
    descriptor_id:
      type: string
    descriptor_version:
      type: string
    provider:
      type: string
    product_name:
      type: string
    software_version:
      type: string
    vnfm_info:
      type: list
      entry_schema:
        type: string
    flavour_id:
      type: string
    flavour_description:
      type: string

  substitution_mappings:
    node_type: Company.Tacker.KubernetesCluster
    properties:
      flavour_id: pre_installed

node_templates:
  VNF:
    type: Company.Tacker.Kubernetes
    properties:
      flavour_description: The pre_installed flavour

  curry-test001:
    type: tosca.nodes.nfv.Vdu.Compute
    properties:
      name: curry-test001
      description: Deployment of Kubernetes resource
      vdu_profile:
        min_number_of_instances: 1
        max_number_of_instances: 3

注意

对于 Heal 操作,用户需要在他们的 VNFD 中描述 tosca.nodes.nfv.Vdu.Compute,因为 Tacker 将 VnfcResourceInfo 存储在 VnfInstance.InstantiatedVnfInfo 中,数据类型为此。

示例 Kubernetes 对象文件

这是一个 Deployment 的示例。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: curry-test001
  namespace: curryns
spec:
  replicas: 2
  selector:
    matchLabels:
      app: webserver
  template:
    metadata:
      labels:
        app: webserver
        scaling_name: SP1
    spec:
      containers:
      - env:
        - name: param0
          valueFrom:
            configMapKeyRef:
              key: param0
              name: curry-test001
        - name: param1
          valueFrom:
            configMapKeyRef:
              key: param1
              name: curry-test001
        image: celebdor/kuryr-demo
        imagePullPolicy: IfNotPresent
        name: web-server
        ports:
        - containerPort: 8080
        resources:
          limits:
            cpu: 500m
            memory: 512M
          requests:
            cpu: 500m
            memory: 512M
        volumeMounts:
        - name: curry-claim-volume
          mountPath: /data
      volumes:
      - name: curry-claim-volume
        persistentVolumeClaim:
          claimName: curry-pv-claim
      terminationGracePeriodSeconds: 0

以下 heal 参数用于“POST /vnf_instances/{id}/heal”,需要作为 HealVnfRequest 数据类型定义在 ETSI NFV-SOL002 v2.6.1

属性名称

参数描述

vnfcInstanceId

指示 Kubernetes 资源的 target,用户可以在“GET /vnf_instances/{id}”提供的 InstantiatedVnfInfo.vnfcResourceInfo 中找到“vnfcInstanceId”。

cause

不需要。

additionalParams

不需要。

healScript

不需要。

需要在 CNF 实例化操作期间将 Kubernetes 资源信息存储为“vnfcResourceInfo”在 InstantiatedVnfInfo 中。类型“vnfcResourceInfo”在 ETSI NFV-SOL003 v2.6.1 中定义。Kubernetes 资源信息将按以下方式存储在“vnfcResourceInfo”中

属性名称

基数

参数描述

id

1

vnfc 的 UUID

vduId

1

VNFD 中定义的 VDU 名称

computeResource

1

存储 Pod 信息

> vimConnectionId

0..1

不需要

> resourceProviderId

0..1

不需要

> resourceId

1

Pod 名称,在 Pod 创建后从 Kubernetes 集群获取信息

> vimLevelResourceType

0..1

存储 Kubernetes 资源类型

  • 单例 Pod:“Pod”

  • 由控制器资源创建的 Pod:控制器资源类型,例如“Deployment”等

storageResourceIds

0..N

不需要

reservationId

0..1

不需要

vnfcCpInfo

0..N

不需要

>id

1

不需要

>cpdId

1

不需要

>vnfExtCpId

0..1

不需要

>cpProtocolInfo

0..N

不需要

>vnfLinkPortId

0..1

不需要

>metadata

0..1

不需要

metadata

0..1

Kubernetes 对象文件中的 metadata

“vnfcResourceInfo.metadata”数据类型设计不佳,无法存储 CNF 的信息。因此,metadata 字段需要存储 Kubernetes 对象文件中定义的 metadataspec.template.metadata,以保留控制器资源和 Pod 的 metadata。

{
  "metadata": {
    "Deployment": {
      "name": "curry-test001",
      "namespace": "curryns"
    }
    "Pod": {
      "labels": {
        "app": "webserver",
        "scaling_name": "SP1"
      }
    }
  }
}

以上是 Deployment 的一个例子。

“metadata”中的“key”设置为 Kubernetes 资源类型,例如“Deployment”等。而“metadata”中的“value”设置为每个定义中的“metadata”,在本例中设置为以下内容

  • “Deployment”的值设置为 Deployment.metadata(json 格式)

  • “Pod”的值设置为 Deployment.spec.template.metadata(json 格式)

注意

存储在 computeResource 中的 Pod 名称与 Kubernetes 集群中实际的 Pod 名称不同,因为当 Kubernetes 自动 healing 或自动 scaling 工作时,Pod 名称可能会更改。需要在 CNF scaling 和 healing 期间同步 DB。

在 Instantiate VNF 中存储 VNFC 资源信息

在 Instantiate CNF 的操作期间,需要存储上述 VNFC 资源信息。以下序列图描述了相关组件和 CNF 实例化操作的流程

../../_images/0126.png
  1. Tacker 接收用于实例化 CNF 的 POST 请求,并创建 Kubernetes 资源并验证创建,该处理在 Victoria 版本中实现。

  2. 在“post_vnf_instantiation()”方法中,KubernetesDriver 向 KubernetesPythonClient 发送 read API 请求,以存储有关资源(例如 pods、存储等)的信息到 vnfcResourceInfo(如果需要)。

注意

由于 Pod 名称在这些操作之后会更改,因此在 scaling 或 healing CNF 之后也需要更新 DB。

使用 SOL003 Heal VNF 实例

如果用户未指定任何 vnfcInstanceId,则 heal 操作运行终止和实例化操作以重新创建整个 VNF 实例。不需要从 spec etsi-nfv-sol-rest-api-for-VNF-deployment 中描述的当前实现进行更改。

注意

在 heal 操作期间实例化 CNF 时,通过读取 scaling 操作后存储的“InstantiatedVnfInfo.scale_status”来更改副本数。

使用 SOL002 Heal VNFC

如果用户指定 vnfcInstanceId,则 VNFC(Kubernetes 中的控制器资源,例如 Deployment、DaemonSet、StatefulSet 或 ReplicaSet)是 heal 操作的目标,并且可以使 VNFC 实例重生。

以下是 healing 请求体的示例

{
  "vnfcInstanceId": "311485f3-45df-41fe-85d9-306154ff4c8d"
}

以下序列图描述了相关组件和 CNF heal 操作的流程

../../_images/0217.png
  1. 客户端向 Heal CNF 实例资源发送 POST 请求。

  2. 基本上与 spec support-notification-api-based-on-etsi-nfv-sol 中描述的相同序列,除了 Tacker-conductor 之外。在 CNF heal 操作的情况下,不需要 MgmtDriver 操作。

  3. KubernetesDriver 使用 KubernetesPythonClient 向 Kubernetes 发送 delete 和 read API 请求,以删除 Kubernetes 资源并在 heal_vnf() 方法中检查删除是否成功。

  4. 如果删除成功,则从 Kubernetes 对象 YAML 文件中提取 heal 目标资源定义,将其转换为 Kubernetes 模型对象,然后 KubernetesDriver 使用 KubernetesPythonClient 向 Kubernetes 发送 create API 请求以重新创建 Kubernetes 资源。

    注意

    对于 Kubernetes 中控制器资源(例如 Deployment、DaemonSet、StatefulSet 或 ReplicaSet)创建的 Pod,不需要显式的删除过程,因为 Kubernetes 会自动重新生成 Pod。

    注意

    通过读取 scaling 操作后存储的“InstantiatedVnfInfo.scale_status”来更改 Kubernetes 模型对象中的副本数。

  5. KubernetesDriver 使用 KubernetesPythonClient 向 Kubernetes 发送 read API 请求,以在 heal_vnf_wait() 方法中检查创建结果。

  6. VnfLcmDriver 通过读取 Kubernetes 资源,在 post_heal_vnf() 方法中将 VNFC 资源信息更新到“VnfInstance.InstantiatedVnfInfo.vnfcResourceInfo”(如果创建成功)。

备选方案

数据模型影响

REST API 影响

安全影响

通知影响

其他最终用户影响

性能影响

其他部署者影响

开发人员影响

实现

负责人

主要负责人

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

其他贡献者

Ayumu Ueha <ueha.ayumu@fujitsu.com>

LiangLu <lu.liang@fujitsu.com>

工作项

  • 验证目标 Kubernetes 资源以支持 heal 操作

  • Kubernetes Infra Driver 将被修改以实现

    • 通过重新创建单例 Pod 来 Heal VNFC。

    • 通过删除使用以下 Kubernetes 资源类型的 Pod 来 Heal VNFC

      • Deployment

      • DaemonSet

      • StatefulSet

      • ReplicaSet

    • 存储和更新 VNFC 资源信息以进行 heal 操作

  • 添加新的单元和功能测试。

依赖项

测试

将添加单元和功能测试,以涵盖规范所需的用例。

文档影响

将添加完整的用户指南来解释 CNF healing。

参考资料