ETSI NFV-SOL CNF (容器化 VNF) 部署¶
本节介绍如何使用 Kubernetes VIM 在 Tacker v1 API 中部署 ETSI NFV-SOL 容器化 VNF。
注意
这是 Tacker v1 API 的文档。有关 Tacker v2 API,请参阅 ETSI NFV-SOL CNF (容器化 VNF) 部署。
有关支持的 Kubernetes 版本信息,请参阅 Tacker 架构。
概述¶
下图显示了 CNF 部署的概述。
请求创建 VNF
用户通过上传 VNF 包并请求
create VNF,向 tacker-server 请求创建 VNF。VNF 包除了VNFD之外,还应包含CNF Definition。有关CNF Definition和VNFD的详细说明,请分别参阅 2. 创建 Kubernetes 对象文件 和 5. 创建 VNFD。请求实例化 VNF
用户通过请求
instantiate VNF并提供实例化参数,向 tacker-server 请求实例化创建的 VNF。调用 Kubernetes API
收到 tacker-client 的请求后,tacker-server 会将其重定向到 tacker-conductor。在 tacker-conductor 中,请求会根据实例化参数的内容再次重定向到适当的 infra-driver(在本例中为 Kubernetes infra-driver)。然后,Kubernetes infra-driver 调用 Kubernetes API 以创建 Pod 作为 VNF。
创建 Pod
Kubernetes Master 根据 API 调用创建 Pod。
准备 Kubernetes VIM¶
1. 创建配置文件¶
在将 Kubernetes VIM 注册到 tacker 之前,我们应该创建配置文件。以下 vim-k8s.yaml 文件提供注册 Kubernetes VIM 的必要信息。此示例指定了可以从 Kubernetes Master 节点获取的 bearer_token 和 ssl_ca_cert 参数的值。有关获取“bearer_token”和“ssl_ca_cert”的具体方法,请参阅 Kubernetes VIM 安装。
通过使用 extra 字段,我们可以注册 Helm 安装为 Tacker 控制目标的 VIM。
注意
extra是一个可选参数。对于使用 Helm 的 VIM,需要满足以下先决条件
使用指定的用户通过 ssh 登录以执行 Helm 的 CLI 命令。
指定的用户对 mkdir/chown/rm 命令具有 sudo 执行权限,并且不需要密码。
在 VIM 上创建 /var/tacker/helm 目录作为 Helm 图表文件的传输目标。
$ cat vim-k8s.yaml
auth_url: "https://192.168.33.100:6443"
project_name: "default"
bearer_token: "eyJhbGciOiJSUzI1NiIsImtpZCI6IlBRVDgxQkV5VDNVR1M1WGEwUFYxSXFkZFhJWDYzNklvMEp2WklLMnNFdk0ifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlLXN5c3RlbSIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJhZG1pbi10b2tlbi12cnpoaiIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50Lm5hbWUiOiJhZG1pbiIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50LnVpZCI6ImNhY2VmMzEzLTMzYjYtNDQ5MS1iMWUyLTg0NmQ2N2E0OTdkNSIsInN1YiI6InN5c3RlbTpzZXJ2aWNlYWNjb3VudDprdWJlLXN5c3RlbTphZG1pbiJ9.R76VIWVZnQxa9NG02HIqux1xTJG4i7dkXsp52T4UU8bvNfsfi18kW_p3ZvaNTxw0yABBcmkYZoOBe4MNP5cTP6TtR_ERZoA5QCViasW_u36rSTBT0-MHRPbkXjJYetzYaFYUO-DlJd3194yOtVHtrxUd8D31qw0f1FlP8BHxblDjZkYlgYSjHCxcwEdwlnYaa0SiH2kl6_oCBRFg8cUfXDeTOmH9XEfdrJ6ubJ4OyqG6YjfiKDDiEHgIehy7s7vZGVwVIPy6EhT1YSOIhY5aF-G9nQSg-GK1V9LIq7petFoW_MIEt0yfNQVXy2D1tBhdJEa1bgtVsLmdlrNVf-m3uA"
ssl_ca_cert: "-----BEGIN CERTIFICATE-----
MIICwjCCAaqgAwIBAgIBADANBgkqhkiG9w0BAQsFADASMRAwDgYDVQQDEwdrdWJl
LWNhMB4XDTIwMDgyNjA5MzIzMVoXDTMwMDgyNDA5MzIzMVowEjEQMA4GA1UEAxMH
a3ViZS1jYTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALxkeE16lPAd
pfJj5GJMvZJFcX/CD6EB/LUoKwGmqVoOUQPd3b/NGy+qm+3bO9EU73epUPsVaWk2
Lr+Z1ua7u+iib/OMsfsSXMZ5OEPgd8ilrTGhXOH8jDkif9w1NtooJxYSRcHEwxVo
+aXdIJhqKdw16NVP/elS9KODFdRZDfQ6vU5oHSg3gO49kgv7CaxFdkF7QEHbchsJ
0S1nWMPAlUhA5b8IAx0+ecPlMYUGyGQIQgjgtHgeawJebH3PWy32UqfPhkLPzxsy
TSxk6akiXJTg6mYelscuxPLSe9UqNvHRIUoad3VnkF3+0CJ1z0qvfWIrzX3w92/p
YsDBZiP6vi8CAwEAAaMjMCEwDgYDVR0PAQH/BAQDAgKkMA8GA1UdEwEB/wQFMAMB
Af8wDQYJKoZIhvcNAQELBQADggEBAIbv2ulEcQi019jKz4REy7ZyH8+ExIUBBuIz
InAkfxNNxV83GkdyA9amk+LDoF/IFLMltAMM4b033ZKO5RPrHoDKO+xCA0yegYqU
BViaUiEXIvi/CcDpT9uh2aNO8wX5T/B0WCLfWFyiK+rr9qcosFYxWSdU0kFeg+Ln
YAaeFY65ZWpCCyljGpr2Vv11MAq1Tws8rEs3rg601SdKhBmkgcTAcCzHWBXR1P8K
rfzd6h01HhIomWzM9xrP2/2KlYRvExDLpp9qwOdMSanrszPDuMs52okXgfWnEqlB
2ZrqgOcTmyFzFh9h2dj1DJWvCvExybRmzWK1e8JMzTb40MEApyY=
-----END CERTIFICATE-----"
type: "kubernetes"
extra:
helm_info:
masternode_ip:
- "192.168.33.100"
masternode_username: "helm_user"
masternode_password: "helm_pass"
除了使用 bearer_token 进行 Kubernetes 身份验证外,还支持 OpenID Connect Tokens。以下示例指定了 oidc_token_url、client_id、client_secret、username、password 代替 bearer_token 以进行 OpenID 令牌身份验证。
在使用 OpenID 令牌身份验证之前,需要进行其他设置。请参阅 Kubernetes VIM OpenID Token Auth 使用指南,以及如何获取 oidc_token_url、client_id、client_secret、username、password 和 ssl_ca_cert 参数的文档。
Kubernetes 和 OpenID 提供商的 SSL 证书在 ssl_ca_cert 中连接。
$ cat vim-k8s.yaml
auth_url: "https://192.168.33.100:6443"
project_name: "default"
oidc_token_url: "https://192.168.33.100:8443/realms/oidc/protocol/openid-connect/token"
client_id: "tacker"
client_secret: "A93HfOUpySm6BjPug9PJdJumjEGUJMhc"
username: "end-user"
password: "end-user"
ssl_ca_cert: "-----BEGIN CERTIFICATE-----
MIICwjCCAaqgAwIBAgIBADANBgkqhkiG9w0BAQsFADASMRAwDgYDVQQDEwdrdWJl
LWNhMB4XDTIwMDgyNjA5MzIzMVoXDTMwMDgyNDA5MzIzMVowEjEQMA4GA1UEAxMH
a3ViZS1jYTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALxkeE16lPAd
pfJj5GJMvZJFcX/CD6EB/LUoKwGmqVoOUQPd3b/NGy+qm+3bO9EU73epUPsVaWk2
Lr+Z1ua7u+iib/OMsfsSXMZ5OEPgd8ilrTGhXOH8jDkif9w1NtooJxYSRcHEwxVo
+aXdIJhqKdw16NVP/elS9KODFdRZDfQ6vU5oHSg3gO49kgv7CaxFdkF7QEHbchsJ
0S1nWMPAlUhA5b8IAx0+ecPlMYUGyGQIQgjgtHgeawJebH3PWy32UqfPhkLPzxsy
TSxk6akiXJTg6mYelscuxPLSe9UqNvHRIUoad3VnkF3+0CJ1z0qvfWIrzX3w92/p
YsDBZiP6vi8CAwEAAaMjMCEwDgYDVR0PAQH/BAQDAgKkMA8GA1UdEwEB/wQFMAMB
Af8wDQYJKoZIhvcNAQELBQADggEBAIbv2ulEcQi019jKz4REy7ZyH8+ExIUBBuIz
InAkfxNNxV83GkdyA9amk+LDoF/IFLMltAMM4b033ZKO5RPrHoDKO+xCA0yegYqU
BViaUiEXIvi/CcDpT9uh2aNO8wX5T/B0WCLfWFyiK+rr9qcosFYxWSdU0kFeg+Ln
YAaeFY65ZWpCCyljGpr2Vv11MAq1Tws8rEs3rg601SdKhBmkgcTAcCzHWBXR1P8K
rfzd6h01HhIomWzM9xrP2/2KlYRvExDLpp9qwOdMSanrszPDuMs52okXgfWnEqlB
2ZrqgOcTmyFzFh9h2dj1DJWvCvExybRmzWK1e8JMzTb40MEApyY=
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIIC7TCCAdWgAwIBAgIUQK2k5uNvlRLx43LI/t3a2/A/3iQwDQYJKoZIhvcNAQEL
BQAwFTETMBEGA1UEAxMKa3ViZXJuZXRlczAeFw0yMjA4MDQwNjIwNTFaFw0yMzA4
MDQwNjIwNTFaMBMxETAPBgNVBAMMCEtleWNsb2FrMIIBIjANBgkqhkiG9w0BAQEF
AAOCAQ8AMIIBCgKCAQEAni7HWLn2IpUImGO1sbBf/XuqATkXSeIIRuQuFymwYPoX
BP7RowzrbfF9KUwdIKlz9IXjqb1hplumiqNy1Sc7MmrTY9Fj87MNAMlnCIvyWkjE
XVXWxGef49mqc85P2K1iuAsr2R7sDrv7SC0ch+lHclOjGDmCjKOk8qF3kD1LATWg
zf42aXb4nNF9kyIOPEbI+jX4PWhAQpEz5nIG+xIRjTHGfacjpeg0+XOK21wLAuQB
fqebJ6GxX4OzB37ZtLLgrKyBYWaWuYkWbexVRM3wEvQu8ENkvhV017iPuPHSxNWx
Y8z072XMs9j8XRQD65EVqObXyizotPRJF4slEJ9qMQIDAQABozcwNTAJBgNVHRME
AjAAMAsGA1UdDwQEAwIF4DAbBgNVHREEFDAShwR/AAABhwTAqAIhhwQKCgCMMA0G
CSqGSIb3DQEBCwUAA4IBAQBebjmNHd8sJXjvPQc3uY/3KSDpk9AYfYzhUZvcvLNg
z0llFqXHaFlMqHTsz1tOH4Ns4PDKKoRT0JIKC1FkvjzqgL+X2jWFS0NRoNyd3W3B
yHLEL7MdQqDR+tZX02EGfaGXjuy8GHIU4J2hXhohmpn6ntfiRONfY8jaEjIecPFS
IwZWXNhsDESa1zuDe0PatES/Ati8bAUpN2rb/7rsE/AeM5GXpQfOKV0XxdIeBZ82
Vf5cUDWPipvq2Q9KS+yrTvEObGtA6gKhQ4bpz3MieU3N8AtQpEKtROH7mJWMHyl2
roD1k8KeJlfvR/XcVTGFcgIdNLfKIdd99Xfi4gSaIKuw
-----END CERTIFICATE-----"
type: "kubernetes"
2. 注册 Kubernetes VIM¶
我们可以通过运行以下命令将 Kubernetes VIM 注册到 tacker
$ openstack vim register --config-file CONFIG_FILE KUBERNETES_VIM_NAME --fit-width
第 1 章中的配置文件需要通过参数 –config-file 输入。执行成功后,将显示 VIM 信息。例如,id。我们还可以使用用户名和密码等身份验证方法来注册 Kubernetes VIM。有关详细信息,请参阅 1. 创建配置文件 章中的超链接。
$ cat vim-k8s.yaml
auth_url: "https://192.168.56.10:6443"
bearer_token: "eyJhbGciOiJSUzI1NiIsImtpZCI6IkdVazBPakx4Q2NsUjJjNHhsZFdaaXJMSHVQMUo4NkdMS0toamlSaENiVFUifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJkZWZhdWx0Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZWNyZXQubmFtZSI6ImRlZmF1bHQtdG9rZW4tazhzdmltIiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQubmFtZSI6ImRlZmF1bHQiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC51aWQiOiJhNTIzYzFhMi1jYmU5LTQ1Y2YtYTc5YS00ZDA4MDYwZDE3NmEiLCJzdWIiOiJzeXN0ZW06c2VydmljZWFjY291bnQ6ZGVmYXVsdDpkZWZhdWx0In0.BpKAAQLjXMIpJIjqQDsGtyh1a-Ij8e-YOVRv0md_iOGXd1KLR-qreM6xA-Ni8WFILzq3phaZU6npET8PlfhQ6csF5u20OT2SoZ7iAotHXpCcYkRdrUd2oO5KxSFTkOhasaN1pQ3pZyaFYUZbwwmLK3I31rG4Br2VbZQ7Qu8wFOXUK-syBGF48vIPZ5JQ3K00KNxpuEcGybMK5LtdSKZ25Ozp_I2oqm3KBZMPMfWwaUnvuRnyly13tsiXudPt_9H78AxLubMo3rcvECJU2y_zZLiavcZKXAz-UmHulxtz_XZ80hMu-XOpYWEYrOB0Lt0hB59ZoY1y3OvJElTfPyrwWw"
ssl_ca_cert: "-----BEGIN CERTIFICATE-----
MIIDBTCCAe2gAwIBAgIIa76wZDxLNAowDQYJKoZIhvcNAQELBQAwFTETMBEGA1UE
AxMKa3ViZXJuZXRlczAeFw0yMzExMDYwMDA3MzBaFw0zMzExMDMwMDEyMzBaMBUx
EzARBgNVBAMTCmt1YmVybmV0ZXMwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK
AoIBAQDd0LBXGxVexr09mVFNSXWQq3TN66IIcXCBAMbIWI4EiQ8Y0zI4hSwADdK2
ltYSdWw7wq3/YTFHK8/YTY7Jvd9/k3UJrqkZ6kBtL20pJUPXNJVLE/hRzsqEnHHv
cfqYZTHvTY4g7qNcMOcfl/oDUGUMfpQT2gs6xoNl0WX/1+QeQbadx1kWaD2Ii45F
d8TR+c4wccxNaLArk3ok4h1PNeAwra4mRmBHQQ2wFjkTYGl4+ss3v1yoUJkrQjXL
RgzLufeXaz8eRTi36HkjudGKfS3OnUeke3uBN7usW58FFJ8TdKOhuoguRm53kj6+
TwXtZCOPzn4gNxq6xJE1Xj2hwFfpAgMBAAGjWTBXMA4GA1UdDwEB/wQEAwICpDAP
BgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRdmQ4r63pXBHIO8ODqxROE7x+aizAV
BgNVHREEDjAMggprdWJlcm5ldGVzMA0GCSqGSIb3DQEBCwUAA4IBAQBeQ/9+bzRe
qbA02MfYnN3vycGhDObcAoiDIMIutojFTpx4hGZjqVgTRpLH5ReddwR4kkxn3NRg
weCVkNkhzyGze64nb11qZG71olaOQRMYzyN2hYfmbq7MXSvmJQQYIr1OewaRk+xl
TyG1XRXoD2IEaHEvG0+pQJlDerd5Z6S1fkPaKZtcRbM/E6y5VXMV6hegN4MwHZSI
Ll1uEBTxUzzTm3dnl1KL8GDg05ajoYcyL3X/0aWsb/MFhtIlXe2CMxu5qUkLBhzy
fCfX4cZpI5KFxMgdmAEoaGbNy7iqsGrLFtEmub2gdEBIVNr7vgOk4OeQ9Uodj6K7
jK97z+cupc5G
-----END CERTIFICATE-----"
project_name: "default"
type: "kubernetes"
$ openstack vim register --config-file vim-k8s.yaml test-vim-k8s --fit-width --is-default
+----------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Field | Value |
+----------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| auth_cred | { |
| | "bearer_token": "***", |
| | "ssl_ca_cert": "b'gAAAAABlf7IKBQVoAAJswOd9V2mwGn6nyLWvzTgL_ZeLtDi2jEFKmWDQcmkezbslq1QKnWg2fofvo2gBT18MUznUvyqB8sKuGs4ImvPZkcvdqw7Hf3d1c1PdV8DDxVXtb9CS_- |
| | hod8pkDwg7cUYwgbbpSo3Wd2UbDIn1hbbTOLAJFG4MxfPD_JGPorKd_TGyZyWgRpxBcrkenxTYwc4Cof5ycwC6JNDCcBYnnfD-wnKVpUyVom2GA9pqfwHSzwxteb1gRZOcm2NhUYebnw6IequyD48AD_hjv1xBktSsv7asH- |
| | loIEaSm5DWjCwg60PCkiBEMEAGlJCYaTPf9ZalvpNlDNq8UzCBvlAnG1PrbNyEo2UgaIt0j3_r1-WIViRmsowegdN-vze7NYhTPPdQTbtPNJ3lTyxjuCYWaYr2Dalud4Ioa3KG87uzo5tSSZVxNAWxQV9R6Ts-sbUhGEUJqPgbXPc12ZCOCTywIbiGn9ZLMRJ8W8onSk2H8hBQAO9UHyJPsNCAJDi0SmmhAk8PP- |
| | z-rJb-0WoZrXI-Wxn3prsD5rIG3tgRQgOSSZXIxBEq4yYvlnzqjG4RPEE9eV7RjyZa_NiGJ3EgCcqX-8vAPMPbJF96303VfPpLehsv8wzMc3u8VOczWfKHuX8YsDUIUGseEFhs80D2u5TDIZZCeb5t5OHhiTulMUhdD-uZserNS-38jELoDg-S-TDqWuJLlwnrROMrt0hbNY3SnYrWamn4uZGX6KRjBlQWWky- |
| | dz1kzXWuky_HDb7ziEDgHDkfLy8UFau2BLjkI3wbvjKd9pDUAW8GKC4E18eUGDuIy6xa0HVQidSzmr9WI5GBRRluYKzJ1eGCZHNQYIyLLNq4NLyDH4Y_VTSlh_QdiVaMKMjlV1pbjTVjP-lwoUuroFBE-TLE-PVbGyrrrKw- |
| | Iuosv0avKyS6LoS1pOF6fDR_bk14X1L3JQvt033cYbrRz_Arb2rCkGzpwng0h41ABPlKLwbP2Hy2tv9Vo2Sja8M9mPiRQwtQYMp_QjZmrFkOY0gKtQP5A5wW8kurrZAMEgVuoifDTJyyiW20E_eAlQX0ByXgE1FwWD-gqXzkmAy-YnKWQs4ZZjC4Jodv8oCo7gC50yp0fq4UrsTx-YnaOBRWIN8b6y_63MKFIYXq8 |
| | WNOUBvo7L3YA0UymAh3vn8yfayHf9YvhxCDIpaRS0g2W6FZtgdNxSiCyLzscKwosJyX69lmSTN9oJSJez0kkObm9akR6X-KK1jer0JqHXNcpIo4wKuRXfpsPT9ieXelYd5Oydj8- |
| | ZYaI_Sy2UqOVfdKAMsi7rn3_ReLXLA21t3o_bbxgsvczXfIcKTCuJyInv08nBWslSUCxBvewNrCxsf8Z6mitapojOFICYmb7sAY8AGd4sMZCE03joHEdLZb8neoGk8gSCaMD6v5DPsMpR6xXrqypfhkY2g8nerlC3z_yCJ3QDDgWuNu3wawQxM_QMTCvIg4Lmx12y3mEdTb6lk2pbUvQgLnIoyH8Krdexr5L0KIQE |
| | q8H9yfWvQhGYmCLhOCQ9NX2iMRFIQEgFDi7w=='", |
| | "auth_url": "https://192.168.56.10:6443", |
| | "username": "None", |
| | "key_type": "barbican_key", |
| | "secret_uuid": "***" |
| | } |
| auth_url | https://192.168.56.10:6443 |
| created_at | 2023-12-18 02:44:27.272153 |
| description | |
| extra | |
| id | 43176042-ca97-4954-9bd5-0a9c054885e1 |
| is_default | True |
| name | test-vim-k8s |
| placement_attr | { |
| | "regions": [ |
| | "default", |
| | "kube-node-lease", |
| | "kube-public", |
| | "kube-system" |
| | ] |
| | } |
| project_id | ebbc6cf1a03d49918c8e408535d87268 |
| status | ACTIVE |
| type | kubernetes |
| updated_at | None |
| vim_project | { |
| | "name": "default" |
| | } |
+----------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
我们还可以通过 openstack vim list 命令检查 VIM 的状态是否为 ACTIVE。
$ openstack vim list
+--------------------------------------+--------------+----------------------------------+------------+------------+--------+
| ID | Name | Tenant_id | Type | Is Default | Status |
+--------------------------------------+--------------+----------------------------------+------------+------------+--------+
| 43176042-ca97-4954-9bd5-0a9c054885e1 | test-vim-k8s | ebbc6cf1a03d49918c8e408535d87268 | kubernetes | True | ACTIVE |
+--------------------------------------+--------------+----------------------------------+------------+------------+--------+
准备 VNF 包¶
如果想通过 helm 部署 CNF,可以参考 如何将 Helm 安装到 Kubernetes 集群并使用 Helm 图表部署 CNF。
1. 创建 VNF 包的目录¶
TOSCA YAML CSAR 文件是使用 ZIP 文件格式的归档文件,其结构符合 TOSCA Simple Profile YAML v1.2 规范。以下是构建 VNF 包 CSAR 目录的示例
$ mkdir -p deployment/{TOSCA-Metadata,Definitions,Files/kubernetes}
2. 创建 Kubernetes 对象文件¶
CSAR VNF 包应具有一个定义要部署的 Kubernetes 资源的对象文件。文件名应具有“.yaml”扩展名。根据不同 yaml 文件的内容,可以创建不同的 Kubernetes api 资源。
注意
请参阅 kubernetes_api_resource 以获取每个资源的示例 yaml 文件。
以下是 deployment 资源的简单示例。
$ cat ./deployment/Files/kubernetes/deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: curry-probe-test001
namespace: default
spec:
replicas: 1
selector:
matchLabels:
selector: curry-probe-test001
template:
metadata:
labels:
selector: curry-probe-test001
app: webserver
spec:
containers:
- name: nginx-liveness-probe
image: nginx
imagePullPolicy: IfNotPresent
ports:
- containerPort: 80
protocol: TCP
- image: nginx
imagePullPolicy: IfNotPresent
name: nginx-readiness-probe
ports:
- containerPort: 8080
protocol: TCP
注意
如果实例化参数不包含 vdu_mapping,则此文件中的 metadata.name 应与部署 flavor 定义文件中的相应 VDU 的 properties.name 相同。对于本过程中的示例,metadata.name 与 helloworld3_df_simple.yaml 文件中的 topology_template.node_templates.VDU1.properties.name 相同。
注意
在版本 2 API 中,将 tacker_vnf_instance_id 键和 VNF 实例 ID 值添加到 metadata.labels 中,以标识创建资源的 VNF 实例。请注意,如果您提前定义了 tacker_vnf_instance_id 标签,则该值将被 VNF 实例 ID 覆盖。
3. 创建 TOSCA.meta 文件¶
TOSCA.Meta 文件包含 TOSCA.Meta 文件、CSAR、Definitions 文件和 artifact 文件的版本信息。Artifact 文件的名称、content-Type、加密方法和哈希值需要在 TOSCA.Meta 文件中提供。这是一个 TOSCA.meta 文件的示例
$ cat ./deployment/TOSCA-Metadata/TOSCA.meta
TOSCA-Meta-File-Version: 1.0
Created-by: dummy_user
CSAR-Version: 1.1
Entry-Definitions: Definitions/helloworld3_top.vnfd.yaml
Name: Files/kubernetes/deployment.yaml
Content-Type: test-data
Algorithm: SHA-256
Hash: 4154adca79b0dc3829f69c82758736df674ffdd89603b4e827bd81afab6b4028
4. 下载 ETSI 定义文件¶
下载官方文档。ETSI GS NFV-SOL 001 [i.4] 规定了基于 TOSCA 规范的 VNFD 的结构和格式。
$ cd deployment/Definitions
$ wget https://forge.etsi.org/rep/nfv/SOL001/raw/v2.6.1/etsi_nfv_sol001_common_types.yaml
$ wget https://forge.etsi.org/rep/nfv/SOL001/raw/v2.6.1/etsi_nfv_sol001_vnfd_types.yaml
5. 创建 VNFD¶
如何创建由多个部署 flavor 组成的 VNFD 在 基于 ETSI NFV-SOL001 的 VNF 描述符 (VNFD) 中描述。
VNFD 不会包含任何 Kubernetes 资源信息,例如 VDU、连接点、虚拟链路,因为 CNF 的所有必需组件都将在 Kubernetes 资源文件中指定。
以下是包含 VNF 定义的 VNFD 文件的示例。
$ cat helloworld3_top.vnfd.yaml
tosca_definitions_version: tosca_simple_yaml_1_2
description: Sample VNF
imports:
- etsi_nfv_sol001_common_types.yaml
- etsi_nfv_sol001_vnfd_types.yaml
- helloworld3_types.yaml
- helloworld3_df_simple.yaml
topology_template:
inputs:
selected_flavour:
type: string
description: VNF deployment flavour selected by the consumer. It is provided in the API
node_templates:
VNF:
type: company.provider.VNF
properties:
flavour_id: { get_input: selected_flavour }
descriptor_id: b1bb0ce7-ebca-4fa7-95ed-4840d70a1177
provider: Company
product_name: Sample VNF
software_version: '1.0'
descriptor_version: '1.0'
vnfm_info:
- Tacker
requirements:
#- virtual_link_external # mapped in lower-level templates
#- virtual_link_internal # mapped in lower-level templates
helloworld3_types.yaml 文件定义了 VNF 的参数类型和默认值。
$ cat helloworld3_types.yaml
tosca_definitions_version: tosca_simple_yaml_1_2
description: VNF type definition
imports:
- etsi_nfv_sol001_common_types.yaml
- etsi_nfv_sol001_vnfd_types.yaml
node_types:
company.provider.VNF:
derived_from: tosca.nodes.nfv.VNF
properties:
descriptor_id:
type: string
constraints: [ valid_values: [ b1bb0ce7-ebca-4fa7-95ed-4840d70a1177 ] ]
default: b1bb0ce7-ebca-4fa7-95ed-4840d70a1177
descriptor_version:
type: string
constraints: [ valid_values: [ '1.0' ] ]
default: '1.0'
provider:
type: string
constraints: [ valid_values: [ 'Company' ] ]
default: 'Company'
product_name:
type: string
constraints: [ valid_values: [ 'Sample VNF' ] ]
default: 'Sample VNF'
software_version:
type: string
constraints: [ valid_values: [ '1.0' ] ]
default: '1.0'
vnfm_info:
type: list
entry_schema:
type: string
constraints: [ valid_values: [ Tacker ] ]
default: [ Tacker ]
flavour_id:
type: string
constraints: [ valid_values: [ simple ] ]
default: simple
flavour_description:
type: string
default: ""
requirements:
- virtual_link_external:
capability: tosca.capabilities.nfv.VirtualLinkable
- virtual_link_internal:
capability: tosca.capabilities.nfv.VirtualLinkable
interfaces:
Vnflcm:
type: tosca.interfaces.nfv.Vnflcm
helloworld3_df_simple.yaml 定义了 VNF 输入的参数类型。
$ cat helloworld3_df_simple.yaml
tosca_definitions_version: tosca_simple_yaml_1_2
description: Simple deployment flavour for Sample VNF
imports:
- etsi_nfv_sol001_common_types.yaml
- etsi_nfv_sol001_vnfd_types.yaml
- helloworld3_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.provider.VNF
properties:
flavour_id: simple
requirements:
virtual_link_external: []
node_templates:
VNF:
type: company.provider.VNF
properties:
flavour_description: A simple flavour
VDU1:
type: tosca.nodes.nfv.Vdu.Compute
properties:
name: VDU1
description: VDU1 compute node
vdu_profile:
min_number_of_instances: 1
max_number_of_instances: 3
policies:
- scaling_aspects:
type: tosca.policies.nfv.ScalingAspects
properties:
aspects:
vdu1_aspect:
name: vdu1_aspect
description: vdu1 scaling aspect
max_scale_level: 2
step_deltas:
- delta_1
- VDU1_initial_delta:
type: tosca.policies.nfv.VduInitialDelta
properties:
initial_delta:
number_of_instances: 1
targets: [ VDU1 ]
- VDU1_scaling_aspect_deltas:
type: tosca.policies.nfv.VduScalingAspectDeltas
properties:
aspect: vdu1_aspect
deltas:
delta_1:
number_of_instances: 1
targets: [ VDU1 ]
- instantiation_levels:
type: tosca.policies.nfv.InstantiationLevels
properties:
levels:
instantiation_level_1:
description: Smallest size
scale_info:
vdu1_aspect:
scale_level: 0
instantiation_level_2:
description: Largest size
scale_info:
vdu1_aspect:
scale_level: 2
default_level: instantiation_level_1
- VDU1_instantiation_levels:
type: tosca.policies.nfv.VduInstantiationLevels
properties:
levels:
instantiation_level_1:
number_of_instances: 1
instantiation_level_2:
number_of_instances: 3
targets: [ VDU1 ]
注意
如果实例化参数不包含 vdu_mapping,则 VDU1.properties.name 应与 Kubernetes 对象文件中定义的 metadata.name 相同。因此,VDU1.properties.name 应遵循 Kubernetes 资源名称的命名规则。有关命名规则的详细信息,请参阅 Kubernetes 文档 DNS 子域名。
6. 压缩 VNF 包¶
CSAR 包应压缩为 ZIP 文件进行上传。以下命令是压缩 VNF 包的示例
$ cd -
$ cd ./deployment
$ zip deployment.zip -r Definitions/ Files/ TOSCA-Metadata/
$ ls deployment
deployment.zip Definitions Files TOSCA-Metadata
创建并上传 VNF 包¶
我们需要在 tacker 中创建一个空的 VNF 包对象,并上传之前章节中创建的压缩 VNF 包。
1. 创建 VNF 包¶
可以使用命令 openstack vnf package create 创建一个空的 vnf 包。成功创建 VNF 包后,将返回一些信息,包括 ID、链接、Onboarding 状态、Operational 状态和 Usage 状态。当 Onboarding 状态为 CREATED、Operational 状态为 DISABLED 并且 Usage 状态为 NOT_IN_USE 时,表示创建成功。
$ openstack vnf package create
+-------------------+-------------------------------------------------------------------------------------------------+
| Field | Value |
+-------------------+-------------------------------------------------------------------------------------------------+
| ID | 094c8abf-b5c8-45a1-9332-3952a710c65c |
| Links | { |
| | "self": { |
| | "href": "/vnfpkgm/v1/vnf_packages/094c8abf-b5c8-45a1-9332-3952a710c65c" |
| | }, |
| | "packageContent": { |
| | "href": "/vnfpkgm/v1/vnf_packages/094c8abf-b5c8-45a1-9332-3952a710c65c/package_content" |
| | } |
| | } |
| Onboarding State | CREATED |
| Operational State | DISABLED |
| Usage State | NOT_IN_USE |
| User Defined Data | {} |
+-------------------+-------------------------------------------------------------------------------------------------+
2. 上传 VNF 包¶
通过运行以下命令将上述创建的 VNF 包上传到 VNF 包:openstack vnf package upload --path <vnf 包路径> <vnf 包 ID>。这是一个上传 VNF 包的示例
$ openstack vnf package upload --path deployment/deployment.zip 094c8abf-b5c8-45a1-9332-3952a710c65c
Upload request for VNF package 094c8abf-b5c8-45a1-9332-3952a710c65c has been accepted.
3. 检查 VNF 包状态¶
通过 openstack vnf package list 命令检查 VNF 包状态。找到 id 与创建的 vnf 包 id 相同的项目,当 Onboarding 状态为 ONBOARDED、Operational 状态为 ENABLED、Usage 状态为 NOT_IN_USE 时,表示 VNF 包已成功上传。
$ openstack vnf package list
+--------------------------------------+------------------+------------------+-------------+-------------------+-------------------------------------------------------------------------------------------------+
| Id | Vnf Product Name | Onboarding State | Usage State | Operational State | Links |
+--------------------------------------+------------------+------------------+-------------+-------------------+-------------------------------------------------------------------------------------------------+
| 094c8abf-b5c8-45a1-9332-3952a710c65c | Sample VNF | ONBOARDED | NOT_IN_USE | ENABLED | { |
| | | | | | "self": { |
| | | | | | "href": "/vnfpkgm/v1/vnf_packages/094c8abf-b5c8-45a1-9332-3952a710c65c" |
| | | | | | }, |
| | | | | | "packageContent": { |
| | | | | | "href": "/vnfpkgm/v1/vnf_packages/094c8abf-b5c8-45a1-9332-3952a710c65c/package_content" |
| | | | | | } |
| | | | | | } |
+--------------------------------------+------------------+------------------+-------------+-------------------+-------------------------------------------------------------------------------------------------+
创建 VNF¶
1. 获取 VNFD ID¶
可以通过 openstack vnf package show <VNF 包 ID> 命令找到上传的 vnf 包的 VNFD ID。以下是检查 VNFD-ID 值的示例
$ openstack vnf package show 094c8abf-b5c8-45a1-9332-3952a710c65c
+----------------------+-------------------------------------------------------------------------------------------------------------------------------------------------+
| Field | Value |
+----------------------+-------------------------------------------------------------------------------------------------------------------------------------------------+
| Additional Artifacts | [ |
| | { |
| | "artifactPath": "Files/kubernetes/deployment.yaml", |
| | "checksum": { |
| | "algorithm": "SHA-256", |
| | "hash": "9c4f41c52a0bf0f84d238ae36d5161dba3f9bafd4d94b76c507434c0e0035fcf" |
| | }, |
| | "metadata": {} |
| | } |
| | ] |
| Checksum | { |
| | "hash": "72073506b70e49879a93e2934703b747c104189c9bf22fd1bd953bfd396baca98d88fb87cb63afbe5109c1cecb1bcc6c866ff9479b5957776c62acc88e7369be", |
| | "algorithm": "sha512" |
| | } |
| ID | 094c8abf-b5c8-45a1-9332-3952a710c65c |
| Links | { |
| | "self": { |
| | "href": "/vnfpkgm/v1/vnf_packages/094c8abf-b5c8-45a1-9332-3952a710c65c" |
| | }, |
| | "packageContent": { |
| | "href": "/vnfpkgm/v1/vnf_packages/094c8abf-b5c8-45a1-9332-3952a710c65c/package_content" |
| | } |
| | } |
| Onboarding State | ONBOARDED |
| Operational State | ENABLED |
| Software Images | |
| Usage State | NOT_IN_USE |
| User Defined Data | {} |
| VNF Product Name | Sample VNF |
| VNF Provider | Company |
| VNF Software Version | 1.0 |
| VNFD ID | b1bb0ce7-ebca-4fa7-95ed-4840d7000003 |
| VNFD Version | 1.0 |
+----------------------+-------------------------------------------------------------------------------------------------------------------------------------------------+
2. 执行创建 VNF 命令¶
我们可以通过运行 openstack vnflcm create <VNFD ID> 来创建 VNF。执行该命令后,生成的 ID 是 VNF 实例 ID。
$ openstack vnflcm create b1bb0ce7-ebca-4fa7-95ed-4840d70a1177
+-----------------------------+------------------------------------------------------------------------------------------------------------------+
| Field | Value |
+-----------------------------+------------------------------------------------------------------------------------------------------------------+
| ID | 30d7c432-8ad3-4b05-81df-c5c7f340c62b |
| Instantiation State | NOT_INSTANTIATED |
| Links | { |
| | "self": { |
| | "href": "https://:9890/vnflcm/v1/vnf_instances/30d7c432-8ad3-4b05-81df-c5c7f340c62b" |
| | }, |
| | "instantiate": { |
| | "href": "https://:9890/vnflcm/v1/vnf_instances/30d7c432-8ad3-4b05-81df-c5c7f340c62b/instantiate" |
| | } |
| | } |
| VNF Configurable Properties | |
| VNF Instance Description | |
| VNF Instance Name | vnf-30d7c432-8ad3-4b05-81df-c5c7f340c62b |
| VNF Package ID | 094c8abf-b5c8-45a1-9332-3952a710c65c |
| VNF Product Name | Sample VNF |
| VNF Provider | Company |
| VNF Software Version | 1.0 |
| VNFD ID | b1bb0ce7-ebca-4fa7-95ed-4840d70a1177 |
| VNFD Version | 1.0 |
+-----------------------------+------------------------------------------------------------------------------------------------------------------+
实例化 VNF¶
如果想通过 helm 部署 CNF,可以参考 如何将 Helm 安装到 Kubernetes 集群并使用 Helm 图表部署 CNF。
1. 设置请求参数文件中的值¶
获取目标 VIM 的 ID。
$ openstack vim list
+--------------------------------------+--------------+----------------------------------+------------+------------+--------+
| ID | Name | Tenant_id | Type | Is Default | Status |
+--------------------------------------+--------------+----------------------------------+------------+------------+--------+
| 43176042-ca97-4954-9bd5-0a9c054885e1 | test-vim-k8s | ebbc6cf1a03d49918c8e408535d87268 | kubernetes | True | ACTIVE |
+--------------------------------------+--------------+----------------------------------+------------+------------+--------+
实例化容器化 VNF 时,应提供包含 Kubernetes 资源定义文件路径和 Kubernetes VIM 信息的 json 文件。这是一个 json 文件的示例
additionalParams 包含 Kubernetes 资源定义文件的路径,请注意 lcm-kubernetes-def-files 应该是一个列表。用户还可以指定 namespace,资源需要在该命名空间中部署。
注意
VNF 实例化的 namespace 由以下优先级确定:
如果在实例化请求的 additionalParams 中指定了
namespace,则使用指定的namespace。如果未通过第 1 步中描述的方法指定
namespace,则使用 2. 创建 Kubernetes 对象文件 中定义的 metadata 中的namespace。如果未通过第 2 步中描述的方法指定
namespace,则使用默认命名空间default。
警告
如果通过第 2 节中描述的方法在 manifest 中指定了多个命名空间,则 VNF 实例化将失败。
vimConnectionInfo 包含可以自主定义的 id 值、vimId 和 vimType。
$ cat ./instance_kubernetes.json
{
"flavourId": "simple",
"additionalParams": {
"lcm-kubernetes-def-files": [
"Files/kubernetes/deployment.yaml"
],
"namespace": "default"
},
"vimConnectionInfo": [
{
"id": "8a3adb69-0784-43c7-833e-aab0b6ab4470",
"vimId": "43176042-ca97-4954-9bd5-0a9c054885e1",
"vimType": "kubernetes"
}
]
}
注意
此操作可以指定 VNF 实例的 vimConnectionInfo。即使此操作指定与一个 VNF 实例关联的多个 vimConnectionInfo,也只会使用其中一个用于生命周期管理操作。
注意
资源的创建顺序由 kinds 排序。
在版本 1 API 的情况下,additionalParams 还可以包含 vdu_mapping 参数。在这种情况下,将 VNFD 中定义的 VDU ID 对应的资源的类型和名称指定如下
$ cat ./instance_kubernetes.json
{
"flavourId": "simple",
"additionalParams": {
"lcm-kubernetes-def-files": [
"Files/kubernetes/deployment.yaml"
],
"vdu_mapping": {
"VDU1": {
"kind": "Deployment",
"name": "curry-probe-test001"
}
}
},
"vimConnectionInfo": [
{
"id": "8a3adb69-0784-43c7-833e-aab0b6ab4470",
"vimId": "43176042-ca97-4954-9bd5-0a9c054885e1",
"vimType": "kubernetes"
}
]
}
2. 执行实例化命令¶
运行 openstack vnflcm instantiate <VNF 实例 ID> <json 文件> 来实例化 VNF。
VNF 实例 ID 是在执行 openstack vnflcm create 命令后生成的 ID。我们可以在 2. 执行创建 VNF 命令 章中找到它。
$ openstack vnflcm instantiate 30d7c432-8ad3-4b05-81df-c5c7f340c62b instance_kubernetes.json
Instantiate request for VNF Instance 30d7c432-8ad3-4b05-81df-c5c7f340c62b has been accepted.
3. 检查实例化状态¶
我们可以通过运行以下命令检查实例化状态。当实例化状态为 INSTANTIATED 时,表示实例化成功。
$ openstack vnflcm show 30d7c432-8ad3-4b05-81df-c5c7f340c62b
+-----------------------------+----------------------------------------------------------------------------------------------------------------------+
| Field | Value |
+-----------------------------+----------------------------------------------------------------------------------------------------------------------+
| ID | 30d7c432-8ad3-4b05-81df-c5c7f340c62b |
| Instantiated Vnf Info | { |
| | "flavourId": "simple", |
| | "vnfState": "STARTED", |
| | "scaleStatus": [ |
| | { |
| | "aspectId": "vdu1_aspect", |
| | "scaleLevel": 0 |
| | } |
| | ], |
| | "extCpInfo": [], |
| | "vnfcResourceInfo": [ |
| | { |
| | "id": "97c403c9-46dd-4154-a1a2-86cf0b62ede0", |
| | "vduId": "VDU1", |
| | "computeResource": { |
| | "vimConnectionId": null, |
| | "resourceId": "curry-probe-test001-578866f694-hmsbh", |
| | "vimLevelResourceType": "Deployment" |
| | }, |
| | "storageResourceIds": [] |
| | } |
| | ], |
| | "additionalParams": { |
| | "vdu_mapping": { |
| | "VDU1": { |
| | "kind": "Deployment", |
| | "name": "curry-probe-test001" |
| | } |
| | }, |
| | "lcm-kubernetes-def-files": [ |
| | "Files/kubernetes/deployment.yaml" |
| | ] |
| | } |
| | } |
| Instantiation State | INSTANTIATED |
| Links | { |
| | "self": { |
| | "href": "https://:9890/vnflcm/v1/vnf_instances/30d7c432-8ad3-4b05-81df-c5c7f340c62b" |
| | }, |
| | "terminate": { |
| | "href": "https://:9890/vnflcm/v1/vnf_instances/30d7c432-8ad3-4b05-81df-c5c7f340c62b/terminate" |
| | }, |
| | "scale": { |
| | "href": "https://:9890/vnflcm/v1/vnf_instances/30d7c432-8ad3-4b05-81df-c5c7f340c62b/scale" |
| | }, |
| | "heal": { |
| | "href": "https://:9890/vnflcm/v1/vnf_instances/30d7c432-8ad3-4b05-81df-c5c7f340c62b/heal" |
| | }, |
| | "changeExtConn": { |
| | "href": "https://:9890/vnflcm/v1/vnf_instances/30d7c432-8ad3-4b05-81df-c5c7f340c62b/change_ext_conn" |
| | } |
| | } |
| VIM Connection Info | [ |
| | { |
| | "id": "8a3adb69-0784-43c7-833e-aab0b6ab4470", |
| | "vimId": "43176042-ca97-4954-9bd5-0a9c054885e1", |
| | "vimType": "kubernetes", |
| | "interfaceInfo": {}, |
| | "accessInfo": {}, |
| | "extra": {} |
| | }, |
| | { |
| | "id": "408c90a2-950f-4241-bf1a-56216ae07ef4", |
| | "vimId": "43176042-ca97-4954-9bd5-0a9c054885e1", |
| | "vimType": "kubernetes", |
| | "interfaceInfo": {}, |
| | "accessInfo": {}, |
| | "extra": {} |
| | } |
| | ] |
| VNF Configurable Properties | |
| VNF Instance Description | |
| VNF Instance Name | vnf-30d7c432-8ad3-4b05-81df-c5c7f340c62b |
| VNF Package ID | 094c8abf-b5c8-45a1-9332-3952a710c65c |
| VNF Product Name | Sample VNF |
| VNF Provider | Company |
| VNF Software Version | 1.0 |
| VNFD ID | b1bb0ce7-ebca-4fa7-95ed-4840d70a1177 |
| VNFD Version | 1.0 |
| metadata | namespace=default, tenant=default |
+-----------------------------+----------------------------------------------------------------------------------------------------------------------+
4. 检查 Kubernetes 中的部署¶
为了测试容器化 VNF 是否正在目标 Kubernetes VIM 环境中运行,我们可以通过运行以下命令进行检查。当 READY 为 1/1 时,表示部署创建成功。
$ kubectl get deploy
NAME READY UP-TO-DATE AVAILABLE AGE
curry-probe-test001 1/1 1 1 11m
如果要在默认命名空间中检查资源是否部署,可以在命令行中追加 -A。
$ kubectl get deploy -A
NAMESPACE NAME READY UP-TO-DATE AVAILABLE AGE
default curry-probe-test001 1/1 1 1 11m
kube-system coredns 2/2 2 2 28h
注意
如果在实例化期间为命名空间指定了除 default 之外的其他值,则部署的资源将在相应的命名空间中实例化。
终止 VNF¶
1. 执行终止命令¶
执行以下 CLI 命令以终止 VNF 实例。
$ openstack vnflcm terminate 30d7c432-8ad3-4b05-81df-c5c7f340c62b
Terminate request for VNF Instance '30d7c432-8ad3-4b05-81df-c5c7f340c62b' has been accepted.
2. 检查实例化状态¶
我们可以通过运行以下命令来检查实例化状态。当实例化状态为 NOT_INSTANTIATED 时,表示终止成功。
$ openstack vnflcm show 30d7c432-8ad3-4b05-81df-c5c7f340c62b \
-c 'Instantiation State'
+---------------------+------------------+
| Field | Value |
+---------------------+------------------+
| Instantiation State | NOT_INSTANTIATED |
+---------------------+------------------+
删除 VNF 标识符¶
1. 执行删除命令¶
执行以下 CLI 命令以删除 VNF 实例。
$ openstack vnflcm delete 30d7c432-8ad3-4b05-81df-c5c7f340c62b
Vnf instance '30d7c432-8ad3-4b05-81df-c5c7f340c62b' is deleted successfully
2. 检查状态¶
执行以下 CLI 命令并确认 VNF 实例删除成功。
确认 VNF 包的“Usage State”为“NOT_IN_USE”。
确认未找到 VNF 实例。
$ openstack vnf package show 094c8abf-b5c8-45a1-9332-3952a710c65c \
-c 'Usage State'
+-------------+------------+
| Field | Value |
+-------------+------------+
| Usage State | NOT_IN_USE |
+-------------+------------+
$ openstack vnflcm show 30d7c432-8ad3-4b05-81df-c5c7f340c62b
Can not find requested vnf instance: 30d7c432-8ad3-4b05-81df-c5c7f340c62b