ETSI NFV-SOL CNF 变更当前 VNF 包¶
本文档描述了在 Tacker v2 API 中如何更改 CNF 的当前 VNF 包。
注意
本文档的内容已确认使用以下 VNF 包有效。
概述¶
下图显示了更改当前 VNF 包的概述。
请求更改当前 VNF 包
用户通过请求
change current VNF package,向 tacker-server 请求更改 VNF 实例的当前 VNF 包,tacker-server 通过 tacker-client 发起请求。调用 Kubernetes API
收到来自 tacker-client 的请求后,tacker-server 会将其重定向到 tacker-conductor。在 tacker-conductor 中,请求会再次根据 VNF 实例的内容重定向到适当的 infra-driver(在本例中为 Kubernetes infra-driver)。然后,Kubernetes infra-driver 调用 Kubernetes API。
更改 Deployment manifest 文件中定义的 Container 的镜像
Kubernetes Master 根据 API 调用更新 Deployment manifest 文件中定义的 Container 的镜像。
先决条件¶
应安装以下软件包
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 中设置以下参数
属性名称 |
基数 |
参数描述 |
|---|---|---|
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的键。vnfConfigurableProperties和extensions是可选参数。与更新操作一样,这些值通过对请求参数中设置的值进行 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 在操作前后已重新部署。