支持 Kubernetes VIM 的 Helm 图表¶
https://blueprints.launchpad.net/tacker/+spec/helmchart-k8s-vim
问题描述¶
Tacker Wallaby 版本支持在 CNF 的 VNF 生命周期管理中将 Kubernetes 资源文件作为托管容器基础设施对象包 (MCIOP)。 另一方面,由于云原生应用程序开发的趋势,Helm 图表也应作为 MCIOP 支持。
本规范为 Kubernetes VIM 提出新的接口,用于支持 Helm 图表。 它使用户能够在他们的 VNF 包中包含 Helm 图表文件,并实例化、扩展/缩减以及修复 CNF。
提议的变更¶
当用户使用 ETSI NFV-SOL003 VNF 生命周期管理将 Kubernetes 集群作为 VNF 实例管理时,还必须更新 MgmtDriver 以支持 Helm 图表。 否则,用户需要在他们的 Kubernetes 集群中安装和配置 Helm 图表环境。
本规范描述了 Tacker 仓库中 MgmtDriver 示例 [1] 的更改方式,以及 CNF 操作(例如实例化、扩展和修复)需要进行的更改。
Kubernetes 集群 VNF 的 MgmtDriver 需要进行以下更改
实例化 Kubernetes 集群 VNF
在
instantiate_end方法中添加新的逻辑来安装 Helm 相关软件包。将 Master 节点 SSH 连接信息存储到
VIM表和VnfInstance.vimConnectionInfo中,在instantiate_end方法中。
注意
由于管理多个连接信息带来的挑战,在规范“支持使用 MgmtDriver 进行 HA Kubernetes Master 部署” [2] 中描述的 HA Master 节点可能不受支持。
修复 Kubernetes 集群 VNF 中的 Master 节点
在
heal_end方法中添加新的逻辑来安装 Helm 相关软件包。
修复整个 Kubernetes 集群 VNF
将新的 Master 节点 SSH 连接信息存储到
VIM表和VnfInstance.vimConnectionInfo中,在heal_end方法中。
CNF 操作需要进行以下更改
CNF 常见操作
在 Kubernetes InfraDriver 中,根据
InstantiateVnfRequest.vimConnectionInfo检测 Helm 图表模式。实现 Helm 图表客户端。
CNF 实例化
将 Helm 图表注册到 Helm 仓库。
从 Kubernetes InfraDriver 调用 Helm 图表客户端。
将部署的 Kubernetes 资源信息存储到 Helm 图表中,并保存到数据库中。
CNF 终止
从 Helm 仓库注销 Helm 图表。
从 Kubernetes InfraDriver 调用 Helm 图表客户端。
CNF 扩展
从 Kubernetes InfraDriver 调用 Helm 图表客户端。
注意
扩展操作可能需要使用 Kubernetes PythonClient,而不是 Helm 图表客户端。副本数可能未在 Helm 图表的 values.yaml 中公开。在这种情况下,Tacker 需要将与 Kubernetes Python Client 实例化操作相同的数据存储到数据库中。
CNF 修复
从 Kubernetes InfraDriver 调用 Helm 图表客户端
注意
修复操作可能需要使用 Kubernetes PythonClient,而不是 Helm 图表客户端。Helm cli 不支持修复操作。在这种情况下,Tacker 需要将与 Kubernetes Python Client 实例化操作相同的数据存储到数据库中。
实例化 Kubernetes 集群 VNF¶
+--------------+ +---------+
| Helm | | |
| Install | | VNFD |
| Script | | |
+-------+------+ +-+-------+
| |
+-----v v +---------------+
+----------+ | Instantiation |
| | | Request |
| CSAR | | Additional |
| | | Params |
+----+-----+ +-+-------------+
| |
| |
+-----+----------+--------------+
| v v VNFM |
| +-------------------+ |
| | Tackerserver | |
| +-------+-----------+ |
| | |
| v |
2. Kubernetes Cluster | +----------------------+ |
& Helm Installation | | +-------------+ | |
+-------------+------------------------+--+----| MgmtDriver | | |
| | | | +-------------+ | |
+-------|-------------|------------+ | | | |
| | | | | | | |
| +----|------+ +---|-------+ | | | | |
| | v | | v | | | | +-------------+ | |
| | +------+ | | +------+ | | 1. Create | | |OpenStack | | |
| | |Worker| | | |Master| |<---------------+--+----|Infra Driver | | |
| | +------+ | | +------+ | | VMs | | +-------------+ | |
| | VM | | VM | | | | | |
| +-----------+ +-----------+ | | | | |
+----------------------------------+ | | Tacker Conductor| |
+----------------------------------+ | +----------------------+ |
| Hardware Resources | | |
+----------------------------------+ +-------------------------------+
该图显示了 Kubernetes 集群 VNF 的实例化操作。当 MgmtDriver 调用 instantiate_end 时,将添加以下步骤
MgmtDriver 使用 shell 脚本安装 Helm。
MgmtDriver 将 Master 节点访问信息添加到 TackerDB 作为
VIM和VnfInstance.vimConnectionInfo。
以下序列图描述了涉及的组件以及使用 MgmtDriver 操作安装 Helm 的流程
该过程由上述序列中说明的以下步骤组成。
客户端发送实例化请求。
这基本上与规范“支持使用 MgmtDriver 部署 Kubernetes 集群” [3] 相同。
将在
instantiate_end中添加以下流程。MgmtDriver 通过 shell 脚本在新的 Master 节点上安装 Helm。
通过 SSH 访问 Master 节点
将脚本文件从“helm_installation_script_path”复制到 Master 节点。
运行脚本。
MgmtDriver 将 Master 节点访问信息添加到
VnfInstance.vimConnectionInfo。
支持 Helm 图表的示例请求参数¶
在 InstantiateVnfRequest 中需要以下参数来支持 Helm 图表。
属性名称 |
参数描述 |
|---|---|
helm_installation_script_path |
安装 Helm 的脚本文件的文件路径。 |
以下是请求体的示例
{
"flavourId": "ha_k8s_install",
"extVirtualLinks": [
{
"id": "net0",
"resourceId": "f0c82461-36b5-4d86-8322-b0bc19cda65f",
"extCps": [
{
"cpdId": "CP1",
"cpConfig": [
{
"cpProtocolData": [
{
"layerProtocol": "IP_OVER_ETHERNET"
}
]
}
]
}
]
}
],
"additionalParams": {
"lcm-operation-user-data": "./UserData/lcm_user_data.py",
"lcm-operation-user-data-class": "SampleUserData",
"k8s_cluster_installation_param": {
"script_path": "Scripts/install_k8s_ha.sh",
"vim_name": "kubernetes_vim_all_param",
"master_node": {
"aspect_id": "master_instance",
"ssh_cp_name": "CP1",
"username": "ubuntu",
"password": "ubuntu",
"pod_cidr": "192.168.3.0/16",
"cluster_cidr": "10.199.187.0/24",
"cluster_cp_name": "vrrp_CP"
},
"worker_node": {
"aspect_id": "worker_instance",
"ssh_cp_name": "CP2",
"username": "ubuntu",
"password": "ubuntu"
},
"proxy": {
"http_proxy": "http://user1:password1@host1:port1",
"https_proxy": "https://user2:password2@host2:port2",
"no_proxy": "192.168.10.0/24,10.0.0.1"
},
"helm_installation_script_path": "Scripts/install_helm.sh"
}
},
"vimConnectionInfo": [
{
"id": "8a3adb69-0784-43c7-833e-aab0b6ab4470",
"vimId": "8d8373fe-6977-49ff-83ac-7756572ed186",
"vimType": "openstack"
}
]
}
支持 Helm 图表的示例数据库表¶
以下参数存储在 ETSI NFV-SOL003 v2.6.1 [4] 中定义的 VnfInstance.vimConnectionInfo 的 extra 字段中,作为对 Master 节点的访问信息。该 extra 字段定义为 ETSI NFV-SOL003 v2.6.1 中的键/值对。
属性名称 |
参数描述 |
|---|---|
helm_info |
在 Master 节点中安装 Helm 的访问信息。 |
> masternode_ip |
Master 节点的 IP 地址。 |
> masternode_username |
Master 节点的 SSH 登录用户名。 |
> masternode_password |
Master 节点的 SSH 登录密码。 |
存储在数据库中的表的示例
{
"vim_type": "kubernetes",
"access_info": {
"auth_url":"http://123.124.64.6:8443",
"username": "some-username",
"password": "some-password",
"bearer_token": "value of bearer token",
"ssl_ca_cert_hash": "hash value of ssl ca certification",
"certificate_key": "value of certificate key"
},
"interface_info": {
},
"extra": {
"helm_info": {
"masternode_ip": "192.168.100.100",
"masternode_username": "user1",
"masternode_password": "password",
}
}
}
支持 Helm 图表的 Kubernetes 集群 VNF 修复¶
所需的更改仅限于 MgmtDriver 的 heal_end 方法。Tacker 使用 SOL002 支持 VNFC 修复操作,并使用 SOL003 支持 VNF 修复操作。在两种情况下,都添加了与实例化操作类似的流程。
使用 SOL002 修复 Master 节点¶
将在 heal_end 中添加以下流程。
MgmtDriver 通过 shell 脚本在新的 Master 节点上安装 Helm。
通过 SSH 访问 Master 节点
将脚本文件从“helm_installation_script_path”复制到 Master 节点。
运行脚本。
MgmtDriver 删除已修复 Master 节点的访问信息,并将其添加到
VnfInstance.vimConnectionInfo。
修复整个 Kubernetes 集群 VNF¶
此案例遵循终止和实例化操作中的相同逻辑。值得注意的是,VIM 和 VnfInstance.vimConnectionInfo 表应使用新的 Kubernetes 集群信息进行更新。
使用 Helm 图表实例化 CNF¶
下图显示了使用 Helm 图表进行实例化的操作
+------+ +------------+
| VNFD | | Helm chart |
| | | |
+-+----+ ++-----------+
| |
+-v-------v-+ +-----------------+
| | | Instantiation |
| CSAR | | Request with |
| | | additionalParam |
+-----+-----+ +-----------+-----+
| |
+-----------------------+ | 1. Request with |
| CNF with Helm chart | | Helm chart |
| | +-------------------------------+
| +------+ +------+ | | | | |
| | Pod | | Pod | | | +--v-------------------v--+ |
| | | | | <--------------------+ | | | |
| +------+ +------+ | | | | TackerServer | |
| | | | | | |
+-----------------------+ | | +------+------------------+ |
| | | |
+--------------------------------------------------------+ | +-------------------------+ |
| Kubernetes cluster VNF | | | | | TackerConductor | |
| | | | | | | |
| +-----------------------+ +-----------------------+ | | | +---v---------------+ | |
| | Worker | | Master | | | | | | VnflcmDriver | | |
| | | | | | | | | | | | |
| | | | +--------------+--+ | | | | +---+---------------+ | |
| | | | | kubectl | | | | | | | |
| | | | +--------------^--+ | | | | +---v---------------+ | |
| | | | | | | | | | Kubernetes | | |
| | | | +--------------+--+ | | | | | InfraDriver | | |
| | | | | Helm | | | 3. Helm cli | | | | | |
| | | | +-----------------+ | | via SSH | | | +-------------+ | | |
| | | | | Helm cli <-------+-----------------------+ Helm client | | | |
| | | | +-----------------+ | | | | | | +-------------+ | | |
| | | | | Helm Repository <-------+ | | | | | |
| | | | +-----------------+ | | 2. Register | | +-------------------+ | |
| | | | | | repository | | | |
| +-----------------------+ +-----------------------+ | with Helm | +-------------------------+ |
| | cli via SSH | |
+--------------------------------------------------------+ +-------------------------------+
KubernetesInfraDriver 使用 Helm cli 将 Helm 图表注册到 Helm 仓库。
KubernetesInfraDriver 使用 Helm cli 创建 Kubernetes 资源。
以下序列图描述了使用 Helm 图表进行 CNF 实例化的组件和流程
客户端发送实例化请求。
直到调用 Kubernetes InfraDriver 为止,与现有实现没有变化。
Kubernetes InfraDriver 执行以下步骤。
确定
InstantiateVnfRequest中的“use_helm”参数。从 Tacker 数据库的
VnfInstance.vimConnectionInfo.extra中获取 Master 节点访问信息。(可选:“exthelmchart” == “false”) 从 VNF 包中获取 Helm 图表并将其转发到 Master 节点。
scp /<helmchartfile_path> <masternode username>@<masternode_ip>:/var/tacker/helm/<vnf_instance_id>
注意
<helmchartfile_path>:请求中 Helm 图表文件的路径。
<masternode_username>:存储在
VnfInstance.vimConnectionInfo中的 Master 节点的用户名,用于 SSH 登录。<masternode_ip>:存储在
VnfInstance.vimConnectionInfo中的 Master 节点的 IP 地址。<vnf_instance_id>:TackerAPI 请求中提供的 VNF 实例 ID。
在 Master 节点上提取转发的软件包文件。
tar -xzf /var/tacker/helm/<vnf_instance_id>/<chartfilepackage>
注意
<chartfilepackage>:从 <helmchartfile_path> 获得的转发的
.tgz软件包文件名。
(可选:“exthelmchart” == “true”) 从仓库中获取目标 Helm 图表。
helm repo add <helmrepositoryname> <repositoryURL>
注意
<helmrepositoryname>:指定为仓库名称的目录名称。此参数由
additionalParams中的“helmrepositoryname”字段提供。<repositoryURL>:此参数指定请求参数的“exthelmrepo_url”或本地仓库的 URL,否则。
通过 Helm cli 实例化 CNF。
如果“exthelmchart”为“true”,
helm install <helmreleasename> <helmrepositoryname>/<helmchartname> --namespace <namespace> <helmparameter>
如果“exthelmchart”为“false”,
helm install <helmreleasename> /var/tacker/helm/<vnf_instance_id>/<extracted_package>
注意
<namespace>:此参数从请求参数的“namespace”获得。如果未在请求参数的“namespace”中设置,则此参数未设置。
<helmchartname>:此参数从请求参数的“helmchartname”获得。
<helmreleasename>:此参数从请求参数的“helmreleasename”获得并设置。
<helmparameter>:此参数从请求参数的“helmparameter”获得并设置。这些参数必须使用
helm installcli 命令的--set标志添加。<extracted_package>:此参数将是从 <chartfilepackage> 提取的目录名称。
获取 Kubernetes 资源文件。
helm get manifest <helmreleasename>
注意
<helmreleasename>:此参数从请求参数的“helmreleasename”获得并设置。
将 Kubernetes 资源保存到 TackerDB 中。
注意
数据表应以与 Python 客户端相同的方式生成。
获取并更新已部署资源的的状态。
使用 Helm 图表请求 CNF 实例化数据¶
以下参数将需要实例化使用 Helm 图表的 CNF。这些参数在 ETSI NFV-SOL003 v2.6.1 [4] 中定义的 additionalParams 中指定,作为键值对。
属性名称 |
数据类型 |
参数描述 |
|---|---|---|
namespace |
字符串 |
部署 Kubernetes 资源的命名空间。如果不存在,则使用 Helm 图表中的值为默认值。 |
use_helm |
布尔值 |
如果为“true”,Kubernetes InfraDriver 使用 Helm 客户端,否则,使用 Kubernetes Python 客户端。true:使用 Helm,false:不使用 Helm |
using_helm_install_param |
数组 |
与 Helm 图表相关的步骤的参数。如果“use_helm”为“true”,则必须存在。 |
> exthelmchart |
布尔值 |
如果为 true,Helm 图表不在 VNF 包中。true:外部 Helm 图表,false:在 VNF 包中 |
> helmchartfile_path |
字符串 |
VNF 包中 Helm 图表文件的路径。如果“exthelmchart”为“false”,则必须存在。 |
> helmreleasename |
字符串 |
Helm 图表的实例名称。 |
> helmparameter |
数组 |
Helm 安装期间指定的键值对参数。 |
> helmrepostitoryname |
字符串 |
Helm 仓库名称。如果“exthelmchart”为“true”,则必须存在。 |
> helmchartname |
字符串 |
Helm 图表名称。如果“exthelmchart”为“true”,则必须存在。 |
> exthelmrepo_url |
字符串 |
外部 Helm 仓库的 URL。如果“exthelmchart”为“true”,则必须存在。 |
以下示例显示了 exthelmchart 为“true”的情况下的请求体
{
"additionalParams": {
"namespace": "namespaceA",
"use_helm": "true",
"using_helm_install_param": [
{
"exthelmchart": "true",
"helmreleasename": "myrelease",
"helmparameter": [
"key1=value1",
"key2=value2"
],
"helmrepositoryname": "mychart",
"helmchartname": "example",
"exthelmrepo_url": "http://helmrepo.example.com/sample-charts"
}
]
}
}
以下示例显示了 exthelmchart 为“false”的情况下的请求体
{
"additionalParams": {
"namespace": "namespaceA",
"use_helm": "true",
"using_helm_install_param": [
{
"exthelmchart": "false",
"helmchartfile_path": "Files/kubernetes/example-0.1.0.tgz",
"helmreleasename": "myrelease",
"helmparameter": [
"key1=value1",
"key2=value2"
]
}
]
}
}
使用 Helm 图表终止 CNF¶
在 CNF 的终止操作中,Kubernetes InfraDriver 执行以下步骤以从仓库注销 Helm 图表并删除 Kubernetes 资源。在其他部分,不需要进行更改。
从
VnfInstance.vimConnectionInfo获取 Helm 图表相关信息。通过 Helm cli 删除 Kubernetes 资源。
helm uninstall <helmreleasename>
注意
<helmreleasename>:此参数从 TackerDB 的“Additional Params”表中获得。
讨论: 最好使用其他表,因为根据 ETSI NFV-SOL003,
additionalParams不应在 Tacker DB 中,VnfInstance.instantiatedVnfInfo应该使用。(可选:“exthelmchart” == “true”) 删除 Helm 仓库。
helm repo remove <helmrepositoryname>
注意
讨论: 最好使用其他表,因为根据 ETSI NFV-SOL003,
additionalParams不应在 Tacker DB 中,VnfInstance.instantiatedVnfInfo应该使用。KubernetesInfraDriver 删除 Helm 图表。如果 TackerDB 的“Additional params”表中的“exthelmchart”为“false”,则执行此处理。
rm -f /var/tacker/helm/<vnf_instance_id>
数据模型影响¶
此规范中描述的 Helm chart 支持在 vims 表中添加一个类型为 json 的 extra 列。
REST API 影响¶
无
安全影响¶
无
通知影响¶
无
其他最终用户影响¶
无
性能影响¶
无
其他部署者影响¶
无
开发人员影响¶
无
实现¶
负责人¶
- 主要负责人
- 其他贡献者
Tatsuhiro Furuya <tatu.furuya@fujitsu.com>
Yoshiyuki Katada <katada.yoshiyuk@fujitsu.com>
Ayumu Ueha <ueha.ayumu@fujitsu.com>
陆梁 <lu.liang@fujitsu.com>
工作项¶
实现 MgmtDriver 以提供支持
提供一个示例脚本,用于在实例化 Kubernetes 集群 VNF 和修复 Master 节点 VNF 时执行以安装 Helm 相关软件包。
在实例化 Kubernetes 集群 VNF 和修复整个 Kubernetes 集群 VNF 时存储 Master 节点的 SSH 连接信息。
实现 Kubernetes InfraDriver 以提供支持
在 CNF 实例化时将 Helm chart 注册到 Helm 仓库。
在 CNF 终止时从 Helm 仓库注销 Helm chart。
在 CNF 实例化、扩展、修复和终止时调用 Helm chart 客户端。
在 CNF 实例化时将部署的 Kubernetes 资源信息存储到数据库中的 Helm chart 中。
添加新的单元和功能测试。
依赖项¶
测试¶
将添加单元和功能测试,以涵盖规范所需的用例。
文档影响¶
将添加完整的用户指南,以解释使用 Helm chart 进行 CNF 实例化。