From 4625e5b3a10b371dfd85ee752551a663e23d875c Mon Sep 17 00:00:00 2001 From: Yi Feng Date: Tue, 12 Apr 2022 16:42:38 +0900 Subject: [PATCH] Add doc of container update Usage guide for how to use Mgmt Driver to update ConfigMap and Secret, as well as Pod and Deployment, while updating CNF. Change-Id: Ia79b6317d441b3430010b0e4adc5bedd952f428a --- .../mgmt_driver_for_container_update.png | Bin 0 -> 61404 bytes .../mgmt_driver_for_container_update.pu | 40 ++ doc/source/user/etsi_use_case_guide.rst | 8 + .../user/mgmt_driver_for_container_update.rst | 516 ++++++++++++++++++ 4 files changed, 564 insertions(+) create mode 100644 doc/source/_images/mgmt_driver_for_container_update.png create mode 100644 doc/source/_images/mgmt_driver_for_container_update.pu create mode 100644 doc/source/user/mgmt_driver_for_container_update.rst diff --git a/doc/source/_images/mgmt_driver_for_container_update.png b/doc/source/_images/mgmt_driver_for_container_update.png new file mode 100644 index 0000000000000000000000000000000000000000..6838d2e14f61afc91d094e2dd7905a2732faf7e9 GIT binary patch literal 61404 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 literal 0 HcmV?d00001 diff --git a/doc/source/_images/mgmt_driver_for_container_update.pu b/doc/source/_images/mgmt_driver_for_container_update.pu new file mode 100644 index 000000000..ba882c0e4 --- /dev/null +++ b/doc/source/_images/mgmt_driver_for_container_update.pu @@ -0,0 +1,40 @@ +@startuml + +frame "python-tackerclient" { + component "tacker-client" as client +} + +frame "tacker" { + component "tacker-server" { + component "server" as serv + } + component "tacker-conductor" { + component "conductor" as cond + component "mgmt-driver" as infra + } +} + +node "Kubernetes\nCluster\n(Master)" as k8s_m +cloud "Hardware Resources" as hw { + node "Kubernetes\nCluster\n(Worker)" as k8s_w { + node "ConfigMap" as ins1 + node "Secret" as ins2 + node "Pod" as ins3 + node "Deployment" as ins4 + } +} + + +'# Relationships +client --> serv: 1. Request\n update VNF +serv --> cond +cond --> infra +infra -right-> k8s_m: 2. Call Kubernetes\n API +k8s_m --> ins1 +k8s_m --> ins2: 3. Update the\n deployed resources +k8s_m --> ins3 +k8s_m --> ins4 +ins1 -[hidden]right-> ins2 +ins2 -[hidden]right-> ins3 +ins3 -[hidden]right-> ins4 +@enduml diff --git a/doc/source/user/etsi_use_case_guide.rst b/doc/source/user/etsi_use_case_guide.rst index 250dec700..05d584156 100644 --- a/doc/source/user/etsi_use_case_guide.rst +++ b/doc/source/user/etsi_use_case_guide.rst @@ -126,6 +126,14 @@ Ansible Driver mgmt_driver_for_ansible_driver_usage_guide +Container Update +~~~~~~~~~~~~~~~~ + +.. toctree:: + :maxdepth: 1 + + mgmt_driver_for_container_update + Sample Usage ^^^^^^^^^^^^ diff --git a/doc/source/user/mgmt_driver_for_container_update.rst b/doc/source/user/mgmt_driver_for_container_update.rst new file mode 100644 index 000000000..4f606a9ac --- /dev/null +++ b/doc/source/user/mgmt_driver_for_container_update.rst @@ -0,0 +1,516 @@ +======================================== +ETSI NFV-SOL CNF Update with Mgmt Driver +======================================== + +This document describes how to update CNF with Mgmt Driver in Tacker. + +Overview +-------- + +The diagram below shows an overview of the CNF updating. + +1. Request update VNF + + A user requests tacker-server to update a CNF with tacker-client + by requesting ``update VNF`` as a Modify VNF information operation. + +2. Call Kubernetes API + + Upon receiving a request from tacker-client, tacker-server redirects it to + tacker-conductor. In tacker-conductor, the request is redirected again to + the matching Mgmt Driver (in this case the Mgmt Driver of container update) + according to the contents of the VNFD in the VNF Package. Then, Mgmt Driver + calls Kubernetes APIs. + +3. Update resources + + Kubernetes Master update resources according to the API calls. + +.. figure:: ../_images/mgmt_driver_for_container_update.png + :align: left + +Mgmt Driver Introduction +~~~~~~~~~~~~~~~~~~~~~~~~ + +Mgmt Driver enables Users to configure their VNF before and/or after +its VNF Lifecycle Management operation. Users can customize the logic +of Mgmt Driver by implementing their own Mgmt Driver and these +customizations are specified by "interface" definition in +`NFV-SOL001 v2.6.1`_. + +The Mgmt Driver in this user guide supports updating CNF with +modify_information_start and modify_information_end operation. + +Use Cases +~~~~~~~~~ + +In this user guide, the provided sample VNF Packages will be instantiated +and then updated. The sample Mgmt Driver will update resources on +Kubernetes during update. Update the ConfigMap and Secret, and also +update the image in the Pod and Deployment, and other resources will +not change. + +Prerequisites +------------- + +The following packages should be installed: + +* tacker +* python-tackerclient + +After installing the above packages, you also need to import the sample +Mgmt Driver file. You can refer to `Set Tacker Configuration`_ in +`How to use Mgmt Driver for deploying Kubernetes Cluster`_ for usage of +Mgmt Driver file. + +.. note:: + + You can find sample Mgmt Driver file in the following path. + `samples/mgmt_driver/kubernetes/container_update/container_update_mgmt.py`_ + +You can also refer to :doc:`./etsi_containerized_vnf_usage_guide` for the +procedure of preparation from "register VIM" to "Instantiate VNF". + +How to Instantiate VNF for Updating +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +You can use the sample VNF package below to instantiate VNF to be updated. + +.. code-block:: console + + $ cd tacker/tests/etc/samples/etsi/nfv/test_cnf_container_update_before + +Download official definition files from ETSI NFV. +`ETSI GS NFV-SOL 001`_ specifies the structure and format of the VNFD +based on TOSCA specifications. + +.. code-block:: console + + $ cd 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 + +CSAR Package should be compressed into a ZIP file for uploading. +Following commands are an example of compressing a VNF Package: + +.. note:: + + The sample Mgmt Driver file also needs to be copied into the CSAR Package. + +.. code-block:: console + + $ cd - + $ mkdir Scripts + $ cp /opt/stack/tacker/samples/mgmt_driver/kubernetes/container_update/container_update_mgmt.py /opt/stack/tacker/tacker/vnfm/mgmt_drivers/ + $ zip deployment.zip -r Definitions/ Files/ TOSCA-Metadata/ Scripts/ + $ ls + Definitions deployment.zip Files Scripts TOSCA-Metadata + +After creating a vnf package with :command:`openstack vnf package create`, some +information including ID, Links, Onboarding State, Operational State, and Usage +State will be returned. When the Onboarding State is CREATED, the Operational +State is DISABLED, and the Usage State is NOT_IN_USE, indicate the creation is +successful. + +.. code-block:: console + + $ openstack vnf package create + +-------------------+-------------------------------------------------------------------------------------------------+ + | Field | Value | + +-------------------+-------------------------------------------------------------------------------------------------+ + | ID | d80b1025-7309-4dbc-8310-f51a24045b08 | + | Links | { | + | | "self": { | + | | "href": "/vnfpkgm/v1/vnf_packages/d80b1025-7309-4dbc-8310-f51a24045b08" | + | | }, | + | | "packageContent": { | + | | "href": "/vnfpkgm/v1/vnf_packages/d80b1025-7309-4dbc-8310-f51a24045b08/package_content" | + | | } | + | | } | + | Onboarding State | CREATED | + | Operational State | DISABLED | + | Usage State | NOT_IN_USE | + | User Defined Data | {} | + +-------------------+-------------------------------------------------------------------------------------------------+ + +Upload the CSAR zip file to the VNF Package by running the following command +:command:`openstack vnf package upload --path ` + +Here is an example of uploading VNF package: + +.. code-block:: console + + $ openstack vnf package upload --path deployment.zip d80b1025-7309-4dbc-8310-f51a24045b08 + Upload request for VNF package d80b1025-7309-4dbc-8310-f51a24045b08 has been accepted. + +Create VNF instance by running :command:`openstack vnflcm create `. + +Here is an example of creating VNF : + +.. code-block:: console + + $ openstack vnflcm create b1bb0ce7-ebca-4fa7-95ed-4840d70a7774 + +-----------------------------+------------------------------------------------------------------------------------------------------------------+ + | Field | Value | + +-----------------------------+------------------------------------------------------------------------------------------------------------------+ + | ID | f21814f0-3e00-4651-a9ac-ec10f3248c19 | + | Instantiation State | NOT_INSTANTIATED | + | Links | { | + | | "self": { | + | | "href": "http://localhost:9890/vnflcm/v1/vnf_instances/f21814f0-3e00-4651-a9ac-ec10f3248c19" | + | | }, | + | | "instantiate": { | + | | "href": "http://localhost:9890/vnflcm/v1/vnf_instances/f21814f0-3e00-4651-a9ac-ec10f3248c19/instantiate" | + | | } | + | | } | + | VNF Configurable Properties | | + | VNF Instance Description | None | + | VNF Instance Name | vnf-f21814f0-3e00-4651-a9ac-ec10f3248c19 | + | VNF Product Name | Sample VNF | + | VNF Provider | Company | + | VNF Software Version | 1.0 | + | VNFD ID | b1bb0ce7-ebca-4fa7-95ed-4840d70a7774 | + | VNFD Version | 1.0 | + | vnfPkgId | | + +-----------------------------+------------------------------------------------------------------------------------------------------------------+ + +The following example shows the yaml files that deploys the Kubernetes +resources. +Please note that ``additionalParams`` includes path of Kubernetes resource +definition file and that ``lcm-kubernetes-def-files`` should be a list. + +.. code-block:: console + + $ cat ./instance_kubernetes.json + { + "flavourId": "simple", + "additionalParams": { + "lcm-kubernetes-def-files": [ + "Files/kubernetes/configmap_1.yaml", + "Files/kubernetes/deployment.yaml", + "Files/kubernetes/pod_env.yaml", + "Files/kubernetes/pod_volume.yaml", + "Files/kubernetes/replicaset.yaml", + "Files/kubernetes/secret_1.yaml" + ], + "namespace": "default" + }, + "vimConnectionInfo": [ + { + "id": "8a3adb69-0784-43c7-833e-aab0b6ab4470", + "vimId": "143897f4-7ab3-4fc5-9a5b-bbff09bdb92f", + "vimType": "kubernetes" + } + ] + } + +Instantiate VNF by running the following command +:command:`openstack vnflcm instantiate `, +after the command above is executed. + +.. code-block:: console + + $ openstack vnflcm instantiate f21814f0-3e00-4651-a9ac-ec10f3248c19 instance_kubernetes.json + Instantiate request for VNF Instance f21814f0-3e00-4651-a9ac-ec10f3248c19 has been accepted. + +CNF Updating Procedure +----------------------- + +As mentioned in Prerequisites, the VNF must be instantiated before performing +updating. + +Next, the user can use the original vnf package as a template to make a new +vnf package, in which the yaml of ConfigMap, Secret, Pod and Deployment can +be changed. + +.. note:: + + * The yaml of ConfigMap and Secret can be changed. The kind, namespace + and name cannot be changed, but the file name and file path can + be changed. + * The yaml of Pod and Deployment can also be changed, but only the + image field can be changed, and no other fields can be changed. + * No other yaml is allowed to be changed. + + * If changes other than images are made to the yaml of Pod and + Deployment, those will not take effect. However, if heal entire + VNF at this time, the resource will be based on the new yaml + during instantiate, and all changes will take effect. + +Then after creating and uploading the new vnf package, you can perform the +update operation. +After the update, the Mgmt Driver will restart the pod to update and +recreate the deployment to update. + +.. note:: + + This document provides the new vnf package, the path is + `tacker/tests/etc/samples/etsi/nfv/test_cnf_container_update_after`_ + +Details of CLI commands are described in :doc:`../cli/cli-etsi-vnflcm`. + +How to Update CNF +~~~~~~~~~~~~~~~~~ + +Execute Update CLI command and check the status of the resources +before and after updating. + +This is to confirm that the resources deployed in Kubernetes are updated +after update CNF. + +The following is an example of the entire process. + +The resources information before update: + +* ConfigMap + + .. code-block:: console + + $ kubectl get configmaps + NAME DATA AGE + cm-data 1 3h55m + kube-root-ca.crt 1 23h + $ + $ kubectl describe configmaps cm-data + Name: cm-data + Namespace: default + Labels: + Annotations: + + Data + ==== + cmKey1.txt: + ---- + configmap data + foo + bar + Events: + +* Secret + + .. code-block:: console + + $ kubectl get secrets + NAME TYPE DATA AGE + default-token-ctq4p kubernetes.io/service-account-token 3 23h + secret-data Opaque 2 3h55m + $ + $ kubectl describe secrets secret-data + Name: secret-data + Namespace: default + Labels: + Annotations: + + Type: Opaque + + Data + ==== + password: 15 bytes + secKey1.txt: 15 bytes + +* Pod + + .. code-block:: console + + $ kubectl get pod -o wide + NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES + env-test 1/1 Running 0 4h28m 10.233.96.4 node2 + vdu1-85dd489b89-w72dr 1/1 Running 0 4h28m 10.233.96.5 node2 + vdu2-mfn78 1/1 Running 0 4h28m 10.233.96.2 node2 + volume-test 1/1 Running 0 4h28m 10.233.96.3 node2 + $ + $ kubectl describe pod volume-test + Name: volume-test + Namespace: default + ... + Containers: + nginx: + Container ID: docker://01273fa7cd595b49d866b755ea6cc2707d90cca70ecb9f5a86c4db3eacad2dde + Image: nginx + Image ID: docker-pullable://nginx@sha256:e9712bdfa40c19cc2cee4f06e5b1215138926250165e26fe69822a9ddc525eaf + ... + Volumes: + cm-volume: + Type: ConfigMap (a volume populated by a ConfigMap) + Name: cm-data + Optional: false + sec-volume: + Type: Secret (a volume populated by a Secret) + SecretName: secret-data + Optional: false + ... + +* Deployment + + .. code-block:: console + + $ kubectl get deployments.apps -o wide + NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR + vdu1 1/1 1 1 4h29m nginx nginx app=webserver + $ + $ kubectl describe pod vdu1-85dd489b89-w72dr + Name: vdu1-85dd489b89-w72dr + Namespace: default + ... + Containers: + nginx: + Container ID: docker://5efe65493ac13ff539f9de30db7c624405ff390df8f5f2e23f22fc0f8b6ad68a + Image: nginx + Image ID: docker-pullable://nginx@sha256:e9712bdfa40c19cc2cee4f06e5b1215138926250165e26fe69822a9ddc525eaf + ... + Environment Variables from: + cm-data ConfigMap with prefix 'CM_' Optional: false + secret-data Secret with prefix 'SEC_' Optional: false + Environment: + CMENV: Optional: false + SECENV: Optional: false + ... + Volumes: + default-token-ctq4p: + Type: Secret (a volume populated by a Secret) + SecretName: default-token-ctq4p + Optional: false + ... + +Update CNF can be executed by the following CLI command. + +.. code-block:: console + + $ openstack vnflcm update VNF_INSTANCE_ID --I sample_param_file.json + +The content of the sample sample_param_file.json in this document is +as follows: + +.. code-block:: console + + { + "vnfdId": "b1bb0ce7-ebca-4fa7-95ed-4840d70a8883", + "vnfInstanceName": "update_vnf_after", + "metadata": { + "configmap_secret_paths": [ + "Files/kubernetes/configmap_2.yaml", + "Files/kubernetes/secret_2.yaml" + ] + } + } + +.. note:: + + If you want to update ConfigMap and Secret, not only need to update + their yaml, but also need to specify the updated yaml file path in + the metadata field of the request input parameter. + +Result: + +.. code-block:: console + + $ openstack vnflcm update 9d2bd0d7-4248-445d-a70f-a14cf57d6f96 --I sample_param_file.json + Update vnf:9d2bd0d7-4248-445d-a70f-a14cf57d6f96 + +The resources information after update: + +* ConfigMap + + .. code-block:: console + + $ kubectl describe configmaps cm-data + Name: cm-data + Namespace: default + Labels: + Annotations: + + Data + ==== + cmKey1.txt: + ---- + configmap2 data2 + foo2 + bar2 + Events: + +* Secret + + .. code-block:: console + + $ kubectl describe secrets secret-data + Name: secret-data + Namespace: default + Labels: + Annotations: + + Type: Opaque + + Data + ==== + password: 16 bytes + secKey1.txt: 18 bytes + +* Pod + + .. code-block:: console + + $ kubectl get pod -o wide + NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES + env-test 1/1 Running 1 5h45m 10.233.96.4 node2 + vdu1-5974f79c95-xs48r 1/1 Running 0 5m17s 10.233.96.7 node2 + vdu2-mfn78 1/1 Running 0 5h45m 10.233.96.2 node2 + volume-test 1/1 Running 1 5h45m 10.233.96.3 node2 + $ kubectl describe pod volume-test + Name: volume-test + Namespace: default + ... + Containers: + nginx: + Container ID: docker://d3b101bff4863eef62c7a89cb07268d236a72c5b47cc46f167a1dbdf7900220f + Image: cirros + Image ID: docker-pullable://cirros@sha256:1e695eb2772a2b511ccab70091962d1efb9501fdca804eb1d52d21c0933e7f47 + ... + Volumes: + cm-volume: + Type: ConfigMap (a volume populated by a ConfigMap) + Name: cm-data + Optional: false + sec-volume: + Type: Secret (a volume populated by a Secret) + SecretName: secret-data + Optional: false + ... + +* Deployment + + .. code-block:: console + + $ kubectl get deployments.apps -o wide + NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR + vdu1 1/1 1 1 5h50m nginx cirros app=webserver + $ kubectl describe pod vdu1-5974f79c95-xs48r + Name: vdu1-5974f79c95-xs48r + Namespace: default + ... + Containers: + nginx: + Container ID: docker://6cad9f692f839d08b53fae58fe2ab06f576271d15aae8744ac0ce57c34510fe0 + Image: cirros + Image ID: docker-pullable://cirros@sha256:1e695eb2772a2b511ccab70091962d1efb9501fdca804eb1d52d21c0933e7f47 + ... + Environment Variables from: + cm-data ConfigMap with prefix 'CM_' Optional: false + secret-data Secret with prefix 'SEC_' Optional: false + Environment: + CMENV: Optional: false + SECENV: Optional: false + ... + Volumes: + default-token-ctq4p: + Type: Secret (a volume populated by a Secret) + SecretName: default-token-ctq4p + Optional: false + ... + +.. _NFV-SOL001 v2.6.1 : https://www.etsi.org/deliver/etsi_gs/NFV-SOL/001_099/001/02.06.01_60/gs_NFV-SOL001v020601p.pdf +.. _Set Tacker Configuration : https://docs.openstack.org/tacker/latest/user/mgmt_driver_deploy_k8s_usage_guide.html#set-tacker-configuration +.. _How to use Mgmt Driver for deploying Kubernetes Cluster : https://docs.openstack.org/tacker/latest/user/mgmt_driver_deploy_k8s_usage_guide.html#mgmt-driver-introduction +.. _samples/mgmt_driver/kubernetes/container_update/container_update_mgmt.py : https://opendev.org/openstack/tacker/src/branch/master/samples/mgmt_driver/kubernetes/container_update/container_update_mgmt.py +.. _tacker/tests/etc/samples/etsi/nfv/test_cnf_container_update_before : https://opendev.org/openstack/tacker/src/branch/master/tacker/tests/etc/samples/etsi/nfv/test_cnf_container_update_before +.. _tacker/tests/etc/samples/etsi/nfv/test_cnf_container_update_after : https://opendev.org/openstack/tacker/src/branch/master/tacker/tests/etc/samples/etsi/nfv/test_cnf_container_update_after +.. _ETSI GS NFV-SOL 001 : https://www.etsi.org/deliver/etsi_gs/NFV-SOL/001_099/001/02.06.01_60/gs_nfv-sol001v020601p.pdf