ETSI NFV-SOL CNF 变更当前 VNF 包

本文档描述了在 Tacker v2 API 中如何更改 CNF 的当前 VNF 包。

概述

下图显示了更改当前 VNF 包的概述。

  1. 请求更改当前 VNF 包

    用户通过请求 change current VNF package,向 tacker-server 请求更改 VNF 实例的当前 VNF 包,tacker-server 通过 tacker-client 发起请求。

  2. 调用 Kubernetes API

    收到来自 tacker-client 的请求后,tacker-server 会将其重定向到 tacker-conductor。在 tacker-conductor 中,请求会再次根据 VNF 实例的内容重定向到适当的 infra-driver(在本例中为 Kubernetes infra-driver)。然后,Kubernetes infra-driver 调用 Kubernetes API。

  3. 更改 Deployment manifest 文件中定义的 Container 的镜像

    Kubernetes Master 根据 API 调用更新 Deployment manifest 文件中定义的 Container 的镜像。

../../../../_images/chg_vnfpkg.svg

先决条件

应安装以下软件包

  • tacker

  • python-tackerclient

至少需要一个状态为 INSTANTIATED 的 VNF 实例。有关实例化 VNF 的过程,请参阅 ETSI NFV-SOL CNF(容器化 VNF)部署

您还可以参考 VNF 包,了解上传 VNF 包的操作。

可以从以下链接获取 CNF 的示例包。

更改当前 VNF 包

如前提条件中所述,在执行更改当前 VNF 包之前,必须先创建 VNF。

在执行变更当前 VNF 包之前,需要上传您想要更改的 VNF 包。

CLI 命令的详细信息在 v2 Tacker 的 VNF 生命周期管理 中描述。

为了更改当前 VNF 包,您需要在运行更改 VNF 包的命令之前准备一个 JSON 格式的定义文件。

sample_param_file_for_specified_resources.json

{
  "vnfdId": "c6595341-a5bb-8246-53c4-7aeb843d60c5",
  "additionalParams": {
    "upgrade_type": "RollingUpdate",
    "lcm-kubernetes-def-files": [
      "Files/kubernetes/namespace.yaml",
      "Files/new_kubernetes/new_deployment.yaml"
    ],
    "vdu_params": [{
      "vdu_id": "VDU2"
    }]
  },
  "vimConnectionInfo": {
    "vim1": {
      "vimId": "8bc6f536-e5fb-4e4f-96f7-f55b16d35850",
      "vimType": "ETSINFV.KUBERNETES.V_1",
      "interfaceInfo": {
        "endpoint": "https://192.168.56.10:6443"
      },
      "accessInfo": {
        "bearer_token": "bearer_token"
      },
      "extra": {
        "dummy-key": "dummy-val"
      }
    }
  },
  "vnfConfigurableProperties": {
    "key": "value"
  },
  "extensions": {
    "key": "value"
  }
}

注意

与 VNF 的变更当前 VNF 包不同,CNF 不支持协调脚本。因此,无需通过 additionalParams 指定 lcm-operation-coordinate 文件。

您可以在 additionalParams 中设置以下参数

additionalParams

属性名称

基数

参数描述

upgrade_type

1

文件更新操作方法的类型。指定 Blue-Green 或 Rolling update。

lcm-kubernetes-def-files

0..N

部署资源 manifest 文件的文件路径。

vdu_params

1..N

要更新的目标 VDU 的 VDU 信息。

> vdu_id

1

要更新的目标 VDU 的 VDU 名称。

注意

sample_param_file_for_specified_resources.json 包含所有可选参数。

  • vnfdId 是您上传的新 VNF 包的 VNFD id。

  • lcm-kubernetes-def-files 仅在 Kubernetes VIM 中使用,不在 OpenStack VIM 中使用。并且您仅需要在需要更新部署资源 manifest 文件的路径时设置此参数。

  • vimConnectionInfo 是一个可选参数。此操作可以为 VNF 实例指定 vimConnectionInfo。即使此操作指定与一个 VNF 实例关联的多个 vimConnectionInfo,也只会使用其中一个用于生命周期管理操作。无法删除已注册的 vimConnectionInfo 的键。

  • vnfConfigurablePropertiesextensions 是可选参数。与更新操作一样,这些值通过对请求参数中设置的值进行 JSON Merge Patch 与当前值进行更新。

注意

当前,此操作仅支持 Change Current VNF Package 的某些功能。

  • 有几种方法可以更新部署,但 Bobcat 版本的 Tacker 仅支持 RollingUpdate 类型。您可以通过 upgrade_type 参数进行设置。

  • 目前仅支持更新部署的镜像。

  • 当前不支持的更新

    • 此 API 当前不支持根据 VNF 包增加或减少 Pod 的数量。

    • 不支持整个部署的添加和删除操作。

    • 在 ETSI 的定义中,可以修改外部网络(例如 extVirtualLinks、extManagedVirtualLinks)。此 API 当前不支持修改、添加和删除这些网络的操作。

如何使用指定资源变更当前 VNF 包

您可以通过在 lcm-kubernetes-def-files 中指定 Kubernetes 定义文件的文件路径,并在 change current VNF package 请求参数文件(例如 sample_param_file_for_specified_resources.json)的 vdu_params 中指定 VDU 信息,来仅更新特定的 Kubernetes 资源(例如 deployment)。

执行变更当前 VNF 包 CLI 命令。完成此变更操作后,您应该通过 Kubernetes CLI 命令检查资源状态。

1. 检查 deployment 的镜像信息。这是为了确认 deployment 的镜像在操作前后是否已更改。

2. 检查 deployment 及其下的 pod 的年龄。这是为了确认 deployment 在操作前后是否已重新部署,以及 deployment 下的 pod 是否已重新部署。

3. 检查 deployment 下的 pod 的状态和名称。这是为了确认 deployment 下的 pod 的状态为运行中,pod 的名称在操作前后已更改。

操作前的 Deployment 信息

$ kubectl get deployment -o wide -n curry

结果

NAME   READY   UP-TO-DATE   AVAILABLE   AGE     CONTAINERS   IMAGES   SELECTOR
vdu2   2/2     2            2           6m40s   nginx        nginx    app=webserver

操作前的 Deployment 详细信息

$ kubectl describe deployment vdu2 -n curry

结果

Name:                   vdu2
Namespace:              curry
CreationTimestamp:      Thu, 07 Dec 2023 01:22:43 +0000
Labels:                 <none>
Annotations:            deployment.kubernetes.io/revision: 1
Selector:               app=webserver
Replicas:               2 desired | 2 updated | 2 total | 2 available | 0 unavailable
StrategyType:           RollingUpdate
MinReadySeconds:        0
RollingUpdateStrategy:  25% max unavailable, 25% max surge
Pod Template:
  Labels:  app=webserver
  Containers:
   nginx:
    Image:      nginx
    Port:       80/TCP
    Host Port:  0/TCP
    Limits:
      memory:  200Mi
    Requests:
      memory:     100Mi
    Environment:  <none>
    Mounts:       <none>
  Volumes:        <none>
Conditions:
  Type           Status  Reason
  ----           ------  ------
  Available      True    MinimumReplicasAvailable
  Progressing    True    NewReplicaSetAvailable
OldReplicaSets:  <none>
NewReplicaSet:   vdu2-749bb6cbbf (2/2 replicas created)
Events:
  Type    Reason             Age    From                   Message
  ----    ------             ----   ----                   -------
  Normal  ScalingReplicaSet  7m21s  deployment-controller  Scaled up replica set vdu2-749bb6cbbf to 2

操作前的 Pods 信息

$ kubectl get pods -o wide -n curry

结果

NAME                    READY   STATUS    RESTARTS   AGE     IP           NODE      NOMINATED NODE   READINESS GATES
vdu2-749bb6cbbf-dcjpn   1/1     Running   0          9m11s   10.0.0.98    vagrant   <none>           <none>
vdu2-749bb6cbbf-hmsbh   1/1     Running   0          9m11s   10.0.0.116   vagrant   <none>           <none>

整个 VNF 的更改当前 VNF 包执行

$ openstack vnflcm change-vnfpkg VNF_INSTANCE_ID \
  ./sample_param_file_for_specified_resources.json \
  --os-tacker-api-version 2

结果

Change Current VNF Package for VNF Instance 63936f24-d43c-42d9-b38d-3c8eff85c445 has been accepted.

操作后的 Deployment 信息

$ kubectl get deployment -o wide -n curry

结果

NAME   READY   UP-TO-DATE   AVAILABLE   AGE   CONTAINERS   IMAGES         SELECTOR
vdu2   2/2     2            2           13m   nginx        nginx:alpine   app=webserver

操作后的 Deployment 详细信息

$ kubectl describe deployment vdu2 -n curry

结果

Name:                   vdu2
Namespace:              curry
CreationTimestamp:      Thu, 07 Dec 2023 01:22:43 +0000
Labels:                 <none>
Annotations:            deployment.kubernetes.io/revision: 2
Selector:               app=webserver
Replicas:               2 desired | 2 updated | 2 total | 2 available | 0 unavailable
StrategyType:           RollingUpdate
MinReadySeconds:        0
RollingUpdateStrategy:  25% max unavailable, 25% max surge
Pod Template:
  Labels:  app=webserver
  Containers:
   nginx:
    Image:      nginx:alpine
    Port:       80/TCP
    Host Port:  0/TCP
    Limits:
      memory:  200Mi
    Requests:
      memory:     100Mi
    Environment:  <none>
    Mounts:       <none>
  Volumes:        <none>
Conditions:
  Type           Status  Reason
  ----           ------  ------
  Available      True    MinimumReplicasAvailable
  Progressing    True    NewReplicaSetAvailable
OldReplicaSets:  <none>
NewReplicaSet:   vdu2-8556bbb5d8 (2/2 replicas created)
Events:
  Type    Reason             Age   From                   Message
  ----    ------             ----  ----                   -------
  Normal  ScalingReplicaSet  14m   deployment-controller  Scaled up replica set vdu2-749bb6cbbf to 2
  Normal  ScalingReplicaSet  104s  deployment-controller  Scaled up replica set vdu2-8556bbb5d8 to 1
  Normal  ScalingReplicaSet  91s   deployment-controller  Scaled down replica set vdu2-749bb6cbbf to 1 from 2
  Normal  ScalingReplicaSet  91s   deployment-controller  Scaled up replica set vdu2-8556bbb5d8 to 2 from 1
  Normal  ScalingReplicaSet  83s   deployment-controller  Scaled down replica set vdu2-749bb6cbbf to 0 from 1

注意

image 已从 nginx 更改为 nginx:alpine。deployment vdu2 的年龄未重置,因此 deployment vdu2 未重新部署。

操作后的 Pods 信息

$ kubectl get pods -o wide -n curry

结果

NAME                    READY   STATUS    RESTARTS   AGE     IP           NODE      NOMINATED NODE   READINESS GATES
vdu2-8556bbb5d8-2wvxj   1/1     Running   0          3m57s   10.0.0.76    vagrant   <none>           <none>
vdu2-8556bbb5d8-tj4vx   1/1     Running   0          3m44s   10.0.0.120   vagrant   <none>           <none>

注意

name of pods 在操作前后已更改。deployment 下的 pod 的年龄已重置,因此 deployment 下的 pod 在操作前后已重新部署。