How to Install Helm to Kubernetes Cluster and Deploy CNF using Helm Chart¶
Overview¶
Tacker supports Helm chart as MCIOP (Managed Container Infrastructure Object Package).
By following this procedures below, users can install and configure Helm environment in the Master Nodes of Kubernetes Cluster deployed by Mgmt Driver, and users can deploy CNF by Helm chart to the deployed Kubernetes Cluster.
Note
This page focuses on changes from the original documentation. If there are no changes, follow the original procedures.
Kubernetes Cluster and Helm Deployment¶
For the original documentation, see How to use Mgmt Driver for deploying Kubernetes Cluster.
Create and Upload VNF Package¶
For the original documentation, see Create and Upload VNF Package. The following changes are required:
Modify the TOSCA.meta file to install Helm
Add Helm install script
1. Directory Structure¶
TOSCA-Metadata/TOSCA.meta¶
To install Helm when deploying a Kubernetes Cluster, add the helm install script information to the “TOSCA.meta” file. The target of “helm install script information” is the script added by the following Scripts/. The sample file is shown below.
TOSCA.meta
TOSCA-Meta-File-Version: 1.0
Created-by: Dummy User
CSAR-Version: 1.1
Entry-Definitions: Definitions/sample_kubernetes_top.vnfd.yaml
Name: Files/images/ubuntu-20.04-server-cloudimg-amd64.img
Content-Type: application/x-iso9066-image
Name: Scripts/install_k8s_cluster.sh
Content-Type: application/sh
Algorithm: SHA-256
Hash: ec6423c8d68ff19e0d44b1437eddefa410a5ed43a434fa51ed07bde5a6d06abe
Name: Scripts/install_helm.sh
Content-Type: application/sh
Algorithm: SHA-256
Hash: 4af332b05e3e85662d403208e1e6d82e5276cbcd3b82a3562d2e3eb80d1ef714
Name: Scripts/kubernetes_mgmt.py
Content-Type: text/x-python
Algorithm: SHA-256
Hash: bf651994ca7422aadeb0a12fed179f44ab709029c2eee9b2b9c7e8cbf339a66d
Scripts/¶
Add the following helm install script to the Scripts/.
$ ls Scripts/
install_helm.sh install_k8s_cluster.sh kubernetes_mgmt.py
Deploy Kubernetes Cluster¶
For the original documentation, see Deploy Kubernetes Cluster. The following change is required:
Add script path information to install Helm
1. Multi-master Nodes¶
1. Create the Parameter File¶
Add helm_installation_script_path
as a KeyValuePairs to the definition of
Explanation of the parameters for deploying a Kubernetes cluster to install
Helm.
Along with this change, the json file should also include the above
KeyValuePairs.
## Request parameter to install Helm
+-------------------------------+-----------------------------------------------+
| Attribute name | Parameter description |
+===============================+===============================================+
| helm_installation_script_path | File path of the script file to install Helm. |
+-------------------------------+-----------------------------------------------+
complex_kubernetes_param_file.json
{
"flavourId": "complex",
"vimConnectionInfo": [{
"id": "3cc2c4ff-525c-48b4-94c9-29247223322f",
"vimId": "8343f55f-6bdf-4c5f-91c4-f6dd145c616d",
"vimType": "openstack"
}],
"additionalParams": {
"k8s_cluster_installation_param": {
"script_path": "Scripts/install_k8s_cluster.sh",
"vim_name": "kubernetes_vim_complex_helm",
"master_node": {
"aspect_id": "master_instance",
"ssh_cp_name": "masterNode_CP1",
"nic_cp_name": "masterNode_CP1",
"username": "ubuntu",
"password": "ubuntu",
"cluster_cp_name": "vip_CP"
},
"worker_node": {
"aspect_id": "worker_instance",
"ssh_cp_name": "workerNode_CP2",
"nic_cp_name": "workerNode_CP2",
"username": "ubuntu",
"password": "ubuntu"
},
"proxy": {
"http_proxy": "http://user1:password1@host1:port1",
"https_proxy": "http://user1:password1@host1:port1",
"k8s_node_cidr": "10.10.0.0/24"
},
"helm_installation_script_path": "Scripts/install_helm.sh"
},
"lcm-operation-user-data": "./UserData/k8s_cluster_user_data.py",
"lcm-operation-user-data-class": "KubernetesClusterUserData"
},
"extVirtualLinks": [{
"id": "net0_master",
"resourceId": "9015848b-8b11-40bd-a918-01138313afa5",
"extCps": [{
"cpdId": "masterNode_CP1",
"cpConfig": [{
"linkPortId": "ed802cb7-15a4-4942-bf42-21511c888e21"
}]
}]
}, {
"id": "net0_worker",
"resourceId": "9015848b-8b11-40bd-a918-01138313afa5",
"extCps": [{
"cpdId": "workerNode_CP2",
"cpConfig": [{
"linkPortId": "ed802cb7-15a4-4942-bf42-21511c888e33"
}]
}]
}]
}
2. Check Results of Instantiation Operations¶
Make sure that VIM with extra field is added to vimConnectionInfo.
$ openstack vnflcm show 7131268c-68ca-4cbe-a881-de4fc339303e --column "VIM Connection Info"
+---------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------+
| Field | Value |
+---------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------+
| VIM Connection Info | [ |
| | { |
| | "id": "3cc2c4ff-525c-48b4-94c9-29247223322f", |
| | "vimId": "8343f55f-6bdf-4c5f-91c4-f6dd145c616d", |
| | "vimType": "openstack", |
| | "interfaceInfo": {}, |
| | "accessInfo": {}, |
| | "extra": {} |
| | }, |
| | { |
| | "id": "7829ce55-86cc-4d02-98a5-4d6ed9214bcb", |
| | "vimId": "690edc6b-7581-48d8-9ac9-910c2c3d7c02", |
| | "vimType": "kubernetes", |
| | "interfaceInfo": null, |
| | "accessInfo": { |
| | "authUrl": "https://10.10.0.91:16443" |
| | }, |
| | "extra": { |
| | "helmInfo": "{'masternode_ip': ['10.10.0.35', '10.10.0.63', '10.10.0.4'], 'masternode_username': 'ubuntu', 'masternode_password': 'ubuntu'}" |
| | } |
| | } |
| | ] |
+---------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------+
2. Single Master Node¶
1. Create the Parameter File¶
As in the case of “Multi Master Node”, add helm_installation_script_path
as
a KeyValuePairs to the definition of
Explanation of the parameters for deploying a Kubernetes cluster.
In addition, you should include KeyValuePairs in the json file.
2. Check Results of Instantiation Operations¶
Verify that Helm has been successfully installed. As in the case of “Multi Master Node”, make sure that VIM with extra field is added to vimConnectionInfo.
ETSI NFV-SOL CNF Deployment by Helm chart¶
For the original documentation, see ETSI NFV-SOL CNF (Containerized VNF) Deployment.
Prepare Kubernetes VIM¶
First, you need to prepare a server with Kubernetes and Helm installed. If the server is deployed by Deploy Kubernetes Cluster, you can skip steps 1 and 2 below.
1. Create a Config File¶
You can refer to the Create a Config File section to create a config file.
2. Register Kubernetes VIM¶
You can refer to the Register Kubernetes VIM section to register VIM.
3. Confirm VIM status¶
For the registered VIM information, confirm that the VIM exists and the Status is “REACHABLE”.
$ openstack vim list
+--------------------------------------+-----------------------------+----------------------------------+------------+------------+-------------+
| ID | Name | Tenant_id | Type | Is Default | Status |
+--------------------------------------+-----------------------------+----------------------------------+------------+------------+-------------+
| 690edc6b-7581-48d8-9ac9-910c2c3d7c02 | kubernetes_vim_complex_helm | 7e757a0cfea940dab100216036212a65 | kubernetes | False | REACHABLE |
| 8343f55f-6bdf-4c5f-91c4-f6dd145c616d | VIM0 | 7e757a0cfea940dab100216036212a65 | openstack | True | REACHABLE |
+--------------------------------------+-----------------------------+----------------------------------+------------+------------+-------------+
Prepare VNF Package¶
The following changes are required from original section Prepare VNF Package:
Skip Kubernetes object file creation
Prepare to use a local Helm chart file
Verify VNFD constraints
1. Create a Kubernetes Object File¶
If you use Helm, this step is not required because the deployment uses Helm chart instead of the deployment.yaml file.
2. Deploy a local Helm chart file¶
When using a local Helm chart file, place the chart file you want to use in “Files/Kubernetes”. If you use external repositories, you do not need to store chart files. Please refer to [1] and [2] for how to create and package a Helm chart file and points to be aware of when creating it.
$ ls Files/kubernetes/
localhelm-0.1.0.tgz
3. Create a TOSCA.meta File¶
For the original documentation, see 3. Create a TOSCA.meta File. If you use a local Helm chart file, enter the relevant information for the chart file instead of “deployment.yaml”.
$ cat TOSCA-Metadata/TOSCA.meta
TOSCA-Meta-File-Version: 1.0
Created-by: dummy_user
CSAR-Version: 1.1
Entry-Definitions: Definitions/sample_vnfd_top.yaml
Name: Files/kubernetes/localhelm-0.1.0.tgz
Content-Type: application/tar+gzip
Algorithm: SHA-256
Hash: 837fcfb73e5fc58572851a80a0143373d9d28ec37bd3bdf52c4d7d34b97592d5
4. Create VNFD¶
For the original documentation, see 5. Create VNFD.
Instantiate VNF¶
For the original documentation, see Instantiate VNF. The following changes are required:
Add parameters for deploying CNF to the json definition file
Verify CNF deployment results
1. Set the Value to the Request Parameter File for Helm chart¶
For the original documentation, see 1. Set the Value to the Request Parameter File. After verifying the identity of the VIM according to the procedure, add the following parameter to the json definition file to deploy CNF by Helm chart.
## List of additional parameters for deploying CNF by Helm chart
+----------------------------+-----------+-----------------------------------------------------------+
| Attribute name | Data type | Parameter description |
+============================+===========+===========================================================+
|namespace | String | Namespace to deploy Kubernetes resources. |
| | | If absent, the value in Helm chart is used as default. |
+----------------------------+-----------+-----------------------------------------------------------+
|use_helm | Boolean | If "true", Kubernetes InfraDriver utilizes Helm client, |
| | | otherwise, Kubernetes Python client is used. |
| | | true: with Helm, false: without Helm |
+----------------------------+-----------+-----------------------------------------------------------+
|using_helm_install_param | Array | Parameters for the step related to Helm chart. |
| | | Shall be present if "use_helm" is "true". |
+----------------------------+-----------+-----------------------------------------------------------+
|> exthelmchart | Boolean | If true, Helm chart is not in VNF Package. |
| | | true: external Helm chart, false: in VNF Package |
+----------------------------+-----------+-----------------------------------------------------------+
|> helmchartfile_path | String | Path of Helm chart files in VNF Package. |
| | | Shall be present if "exthelmchart" is "false". |
| | | |
| | | Note: The "part of helmchartfile_path" that is noted |
| | | above must be unique for VIM. |
+----------------------------+-----------+-----------------------------------------------------------+
|> helmreleasename | String | Name of release as instance of Helm chart. |
| | | |
| | | Note: This parameter must be unique for VIM. |
+----------------------------+-----------+-----------------------------------------------------------+
|> helmparameter | Array | Parameters of KeyValuePairs, |
| | | which is specified during Helm installation. |
+----------------------------+-----------+-----------------------------------------------------------+
|> helmrepostitoryname | String | Helm repository name. |
| | | Shall be present if "exthelmchart" is "true". |
+----------------------------+-----------+-----------------------------------------------------------+
|> helmchartname | String | Helm chart name. |
| | | Shall be present if "exthelmchart" is "true". |
| | | |
| | | Note: This parameter must be unique for VIM. |
+----------------------------+-----------+-----------------------------------------------------------+
|> exthelmrepo_url | String | URL of external Helm repository. |
| | | Shall be present if "exthelmchart" is "true". |
| | | |
| | | Note: Don't specify a different exthelmrepo_url for an |
| | | already registered helmrepositoryname in VIM. |
+----------------------------+-----------+-----------------------------------------------------------+
|helm_replica_values | Dict | Parameters for the number of replicas for each aspectId |
| | | used during scale operation. |
| | | Shall be present if "use_helm" is "true". |
| | | |
| | | key: "aspectId" defined in VNFD and specified during |
| | | scale operation. |
| | | value: Parameter for the number of replicas defined in |
| | | Helm values. |
+----------------------------+-----------+-----------------------------------------------------------+
|vdu_mapping | Dict | Parameters for associating "VDU ID" with resource |
| | | information and helm install parameter. |
| | | "helmreleasename" in value shall be present if "use_helm" |
| | | is "true". |
| | | |
| | | key: "VDU ID" defined in VNFD. |
| | | value: Parameter for mapping resource information |
| | | corresponding to "VDU ID" for key like following: |
| | | "VDU1": { "kind": "Deployment", |
| | | "name": "resource-name", |
| | | "helmreleasename": "vdu1" } |
+----------------------------+-----------+-----------------------------------------------------------+
If you are deploying using a chart file stored in external repository, set
additionalParams.using_helm_install_param.exthelmchart
to true
and set other parameters.
The following is a sample of json definition file for deployment using
a chart file stored in an external repository.
$ cat instance_helm.json
{
"flavourId": "simple",
"additionalParams": {
"namespace": "default",
"use_helm": "true",
"using_helm_install_param": [
{
"exthelmchart": "true",
"helmreleasename": "vdu1",
"helmparameter": [
"key1=value1",
"key2=value2"
],
"helmrepositoryname": "mychart",
"helmchartname": "externalhelm",
"exthelmrepo_url": "http://helmrepo.example.com/sample-charts"
}
],
"helm_replica_values": {
"vdu1_aspect": "replicaCount"
},
"vdu_mapping": {
"VDU1": {
"kind": "Deployment",
"name": "vdu1-externalhelm",
"helmreleasename": "vdu1"
}
}
},
"vimConnectionInfo": [
{
"id": "817954e4-c321-4a31-ae06-cedcc4ddb85c",
"vimId": "690edc6b-7581-48d8-9ac9-910c2c3d7c02",
"vimType": "kubernetes"
}
]
}
If you are deploying using a local Helm chart file, set
additionalParams.using_helm_install_param.exthelmchart
to “false”
and set other parameters.
The following is a sample of json definition file for deployment using
a local Helm chart file.
$ cat instance_helm.json
{
"flavourId": "simple",
"additionalParams": {
"namespace": "default",
"use_helm": "true",
"using_helm_install_param": [
{
"exthelmchart": "false",
"helmreleasename": "vdu1",
"helmparameter": [
"key1=value1",
"key2=value2"
],
"helmchartfile_path": "Files/kubernetes/localhelm-0.1.0.tgz"
}
],
"helm_replica_values": {
"vdu1_aspect": "replicaCount"
},
"vdu_mapping": {
"VDU1": {
"kind": "Deployment",
"name": "vdu1-localhelm",
"helmreleasename": "vdu1"
}
}
},
"vimConnectionInfo": [
{
"id": "817954e4-c321-4a31-ae06-cedcc4ddb85c",
"vimId": "690edc6b-7581-48d8-9ac9-910c2c3d7c02",
"vimType": "kubernetes"
}
]
}
2. Check the Deployment in Kubernetes¶
For the original documentation, see 4. Check the Deployment in Kubernetes .
In addition to checkpoints before modifying the procedure, ensure that the NAME
of the deployed CNF matches the value of
vdu_mapping.VDUxx.name
in `additionalParams
.
$ kubectl get deploy
NAME READY UP-TO-DATE AVAILABLE AGE
vdu1-localhelm 1/1 1 1 5m1s
3. Check the Deployment in Helm¶
Run the following command to verify that it is deployed by the Helm chart. If NAME matches “helmreleasename” then deployment is succeeded.
$ helm list --all
NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION
vdu1 default 1 2021-09-10 09:26:02.091007332 +0000 UTC deployed localhelm-0.1.0 1.16.0