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 部署的概述。

  1. 请求创建 VNF

    用户通过上传 VNF 包并请求 create VNF,向 tacker-server 请求创建 VNF。VNF 包除了 VNFD 之外,还应包含 CNF Definition。有关 CNF DefinitionVNFD 的详细说明,请分别参阅 2. 创建 Kubernetes 对象文件5. 创建 VNFD

  2. 请求实例化 VNF

    用户通过请求 instantiate VNF 并提供实例化参数,向 tacker-server 请求实例化创建的 VNF。

  3. 调用 Kubernetes API

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

  4. 创建 Pod

    Kubernetes Master 根据 API 调用创建 Pod。

../_images/etsi_containerized_vnf_usage_guide.png

准备 Kubernetes VIM

1. 创建配置文件

在将 Kubernetes VIM 注册到 tacker 之前,我们应该创建配置文件。以下 vim-k8s.yaml 文件提供注册 Kubernetes VIM 的必要信息。此示例指定了可以从 Kubernetes Master 节点获取的 bearer_tokenssl_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_urlclient_idclient_secretusernamepassword 代替 bearer_token 以进行 OpenID 令牌身份验证。

在使用 OpenID 令牌身份验证之前,需要进行其他设置。请参阅 Kubernetes VIM OpenID Token Auth 使用指南,以及如何获取 oidc_token_urlclient_idclient_secretusernamepasswordssl_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 由以下优先级确定:

  1. 如果在实例化请求的 additionalParams 中指定了 namespace,则使用指定的 namespace

  2. 如果未通过第 1 步中描述的方法指定 namespace,则使用 2. 创建 Kubernetes 对象文件 中定义的 metadata 中的 namespace

  3. 如果未通过第 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