支持使用 MgmtDriver 的 Kubernetes 集群持久卷¶
https://blueprints.launchpad.net/tacker/+spec/pv-k8s-cluster
问题描述¶
Tacker Wallaby 版本支持使用 ETSI NFV-SOL003 [1] VNF 生命周期管理接口,通过 MgmtDriver 管理 Kubernetes 集群作为 VNF 实例,具体参考 “支持使用 MgmtDriver 部署 Kubernetes 集群” [2] 规范。 本规范提出部署的 Kubernetes 集群 VNF 具有一个存储服务器,并使用 Cinder 卷,以便用户可以部署具有持久卷 (PersistentVolume) 的 CNF。
提议的变更¶
Kubernetes 集群 VNF 的 LCM 操作需要以下更改
使用 MgmtDriver 的 Kubernetes 集群实例化操作 [2]。
创建一个带有 Cinder 卷的存储服务器 VM。
MgmtDriver 将 Cinder 卷作为 NFS 共享目录暴露在存储服务器中。
MgmtDriver 将 NFS 共享目录注册为 Kubernetes 持久卷。
使用 MgmtDriver 的整个 Kubernetes 集群的 Heal 操作 [3]。
MgmtDriver 在重新生成的存储服务器中将 Cinder 卷作为 NFS 共享目录暴露。
MgmtDriver 将 NFS 共享目录注册为 Kubernetes 持久卷。
使用 MgmtDriver 的存储服务器 VM 的 Heal 操作。
MgmtDriver 在
heal_start中执行以下过程。检查 Kubernetes 集群中所有已注册的持久卷是否在使用中,否则失败。
删除所有持久卷。
注意
在 Heal 存储服务器 VM 之前,应先删除所有持久卷。 为了避免 Pod 进入失败状态,还需要终止带有持久卷的 Pod。
MgmtDriver 在
heal_end中执行以下过程。MgmtDriver 在重新生成的存储服务器中将 Cinder 卷作为 NFS 共享目录暴露。
MgmtDriver 将 NFS 共享目录注册为 Kubernetes 持久卷。
在所有 LCM 操作中,在新创建的 Master/Worker VM 上安装 NFS 客户端。 以下 LCM 操作需要一些额外的过程,才能在新创建的 Master/Worker VM 上安装 NFS 客户端。
使用 MgmtDriver 的 Kubernetes 集群 Worker 节点的扩展操作 [4]。
MgmtDriver 在
scale_end中安装 NFS 客户端。使用 MgmtDriver 的 Kubernetes 集群中单个节点 (Master/Worker) 的 Heal 操作 [3]。
MgmtDriver 在
heal_end中安装 NFS 客户端。
注意
不支持存储服务器 VM 的扩展操作。
Worker 节点的缩减操作保持不变。
终止操作保持不变。
注意
当用户将其 CNF 作为带有持久卷的 Pod 部署时,应在 Kubernetes 资源文件中定义持久卷声明 (PersistentVolumeClaim)。 持久卷声明和控制器资源,例如 Deployment、ReplicaSet 和 Pod,已在 Victoria 版本中的 “带有 VNFM 和 CISM 的容器网络功能 (CNF)” 中得到支持 [5]。
带有持久卷的 Kubernetes 集群实例化操作¶
将存储服务器 VM 提供的持久卷添加到 “支持使用 MgmtDriver 部署 Kubernetes 集群” [2] 规范。
下图显示了 Kubernetes 集群的创建和持久卷的注册
+---------+ +---------+
| Cluster | | |
| Install | | VNFD |
+-------------------+ | Script | | |
| PersistentVolumes | +-------+-+ +-+-------+
| manifest(yaml) +--+ | |
+-------------------+ | v v
+---------------+ | +----------+ +---------------+
| LCM operation | +--->| | | Instantiation |
| UserData +------>| CSAR | | Request with |
+---------------+ | | | Additional |
+------------+ +--->| | | Params |
| Heat | | +----+-----+ +-+-------------+
| Template +--+ | | 1. Instantiate VNF
| (Base HOT) | | |
+------------+ +-----+----------+-------------+
| v v VNFM |
| +-------------------+ |
| | TackerServer | |
| +-------+-----------+ |
3. Kubernetes Cluster | | |
Installation | v |
6. NFS client | +----------------------+ |
Installation | | +--------------+ | |
+--------------+-----------------------------+--+---+ | | |
| | | | | | | |
+-------+--------------+--------+ | | | | | |
| | | | | | | | | |
| +----+-----+ +----+-----+ | 7. Kubernetes | | | | | |
| | v | | v | | PersistentVolumes | | | | | |
| | +------+ | | +------+ | | Registration | | | MgmtDriver | | |
| | |Worker| | | |Master|<+--+--------------------+--+---+ | | |
| | +------+ | | +------+ | | | | | | | |
| | VM | | VM | | | | | | | |
| +----------+ +----------+ | +-+--+---+ | | |
| +-------------------------+ | 5. NFS server | | | | | | |
| | +---------------+ | | Installation | | | +-+ | | |
| | | NFS |<---+--+------------------+ | | | +--------------+ | |
| | +---------------+ | | 4. Set up Cinder | | | | |
| | +---------------+ | | volume directories | | | | |
| | | Cinder volume |<---+--+--------------------+--+-+ +--------------+ | |
| | +---------------+ | | | | | OpenStack | | |
| | | |<-------------------+--+---+ Infra Driver | | |
| | Storage server VM | | 2. Create VMs | | +--------------+ | |
| +-------------------------+ |(MasterVM/WorkerVM/ | | | |
+-------------------------------+ Storage server VM | | Tacker Conductor | |
+-------------------------------+ with Cinder volume)| +----------------------+ |
| Hardware Resources | | |
+-------------------------------+ +------------------------------+
带有 UserData 的 Kubernetes 集群 VNFD¶
它基本上与用户指南 “如何使用 Mgmt Driver 部署 Kubernetes 集群” [6] 相同,除了以下添加内容。
将与存储服务器 VM 相关的定义添加到 VNFD 和 Heat 模板 (Base HOT),如下所示
VNFD
node_templates:
...
storage_server:
type: tosca.nodes.nfv.Vdu.Compute
...
requirements:
- virtual_storage: storage_server_volume
...
storage_server_volume:
type: tosca.nodes.nfv.Vdu.VirtualBlockStorage
properties:
virtual_block_storage_data:
...
storage_server_CP:
type: tosca.nodes.nfv.VduCp
...
requirements:
- virtual_binding: storage_server
...
Heat 模板 (Base HOT)
resources:
...
storage_server_volume:
type: OS::Cinder::Volume
properties:
...
storage_server_CP:
type: OS::Neutron::Port
properties:
...
storage_server:
type: OS::Nova::Server
properties:
name: storage_server
block_device_mapping_v2:
- device_name: vdb
volume_id: {get_resource: storage_server_volume}
boot_index: -1
networks:
- port: {get_resource: storage_server_CP}
...
带有持久卷的 Kubernetes 集群实例化请求参数¶
将以下属性添加到用户指南 “如何使用 Mgmt Driver 部署 Kubernetes 集群” [6] 中描述的 additionalParams 中。
属性名称 |
基数 |
参数描述 |
|---|---|---|
k8s_cluster_installation_param |
1 |
Kubernetes 集群安装配置。 |
>storage_server |
0..1 |
可选。存储服务器 VM 的配置。 如果未使用本规范的功能,则省略该属性。 |
>>ssh_cp_name |
1 |
MgmtDriver 在通过 SSH/SFTP 访问存储服务器 VM 时使用的 CP 名称。 |
>>username |
1 |
MgmtDriver 在通过 SSH/SFTP 访问存储服务器 VM 时使用的用户名。 |
>>password |
1 |
MgmtDriver 在通过 SSH/SFTP 访问存储服务器 VM 时使用的用户密码。 |
>>cinder_volume_setup_params |
1..N |
存储服务器 VM 上 Cinder 卷目录的配置。 |
>>>volume_resource_id |
1 |
Heat 模板 (Base HOT) 中定义的 Cinder 卷的资源 ID。 MgmtDriver 使用此属性来标识 Cinder 卷。 |
>>>mount_to |
1 |
Cinder 卷将挂载到存储服务器 VM 上的目录路径。 |
>>nfs_server_setup_params |
1..N |
存储服务器 VM 上 NFS 导出的配置。 |
>>>export_dir |
1 |
要通过 NFS 导出的目录路径。 |
>>>export_to |
1 |
目录通过 NFS 导出的网络地址。 |
>pv_registration_params |
0..N |
可选。 Kubernetes 持久卷的配置。 如果未使用本规范的功能,则省略该属性。 |
>>pv_manifest_file_path |
1 |
VNF 包中 Kubernetes 持久卷清单文件的路径。 |
>>nfs_server_cp |
1 |
NFS 服务器的 CP 名称。 如果为 NFS 使用的网络启用了 DHCP,则无法在 Kubernetes 持久卷的清单文件中预配置 NFS 服务器 IP 地址。 因此,清单文件中的 NFS 服务器 IP 地址将替换为由此属性指定的 CP 的 IP 地址。 |
以下是提供到 Instantiate VNF 请求 POST /vnflcm/v1/vnf_instances/{vnfInstanceId}/instantiate 的 body 示例
{
"flavourId": "simple",
"additionalParams": {
"k8s_cluster_installation_param": {
"script_path": "Scripts/install_k8s_cluster.sh",
"vim_name": "kubernetes_vim",
"master_node": {
"aspect_id": "master_instance",
"ssh_cp_name": "masterNode_CP1",
"nic_cp_name": "masterNode_CP1",
"username": "ubuntu",
"password": "ubuntu",
"pod_cidr": "192.168.3.0/16",
"cluster_cidr": "10.199.187.0/24",
"cluster_cp_name": "masterNode_CP1"
},
"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": "https://user2:password2@host2:port2",
"no_proxy": "192.168.246.0/24,10.0.0.1",
"k8s_node_cidr": "10.10.0.0/24"
},
"storage_server": {
"ssh_cp_name": "storage_server_CP",
"username": "ubuntu",
"password": "ubuntu",
"cinder_volume_setup_params": [
{
"volume_resource_id": "storage_server_volume",
"mount_to": "/volume"
}
],
"nfs_server_setup_params": [
{
"export_dir": "/volume/nfs/pv1",
"export_to": "10.10.0.0/24"
},
{
"export_dir": "/volume/nfs/pv2",
"export_to": "10.10.0.0/24"
},
{
"export_dir": "/volume/nfs/pv3",
"export_to": "10.10.0.0/24"
}
]
},
"pv_registration_params": [
{
"pv_manifest_file_path": "Files/kubernetes/nfs-pv1.yaml",
"nfs_server_cp": "storage_server_CP"
},
{
"pv_manifest_file_path": "Files/kubernetes/nfs-pv2.yaml",
"nfs_server_cp": "storage_server_CP"
},
{
"pv_manifest_file_path": "Files/kubernetes/nfs-pv3.yaml",
"nfs_server_cp": "storage_server_CP"
}
]
},
"lcm-operation-user-data": "./UserData/k8s_cluster_user_data.py",
"lcm-operation-user-data-class": "KubernetesClusterUserData"
},
"extVirtualLinks": [
{
"id": "net0_master",
"resourceId": "f0c82461-36b5-4d86-8322-b0bc19cda65f",
"extCps": [
{
"cpdId": "masterNode_CP1",
"cpConfig": [
{
"cpProtocolData": [
{
"layerProtocol": "IP_OVER_ETHERNET"
}
]
}
]
}
]
},
{
"id": "net0_worker",
"resourceId": "f0c82461-36b5-4d86-8322-b0bc19cda65f",
"extCps": [
{
"cpdId": "workerNode_CP2",
"cpConfig": [
{
"cpProtocolData": [
{
"layerProtocol": "IP_OVER_ETHERNET"
}
]
}
]
}
]
},
{
"id": "net0_storage",
"resourceId": "f0c82461-36b5-4d86-8322-b0bc19cda65f",
"extCps": [
{
"cpdId": "storage_server_CP",
"cpConfig": [
{
"cpProtocolData": [
{
"layerProtocol": "IP_OVER_ETHERNET"
}
]
}
]
}
]
}
],
"vimConnectionInfo": [
{
"id": "8a3adb69-0784-43c7-833e-aab0b6ab4470",
"vimId": "8d8373fe-6977-49ff-83ac-7756572ed186",
"vimType": "openstack"
}
]
}
带有持久卷的 Kubernetes 集群实例化序列¶
该过程由上述序列中说明的以下步骤组成。
客户端发送 POST Instantiate VNF 请求。
它基本上与规范 “支持使用 MgmtDriver 部署 Kubernetes 集群” [2] 中描述的相同序列,除了以下额外的过程。
以下过程添加到
instantiate_end中。MgmtDriver 为 Cinder 卷创建文件系统,并将其挂载到存储服务器 VM 上的目录。
MgmtDriver 在存储服务器 VM 上安装 NFS 服务器并设置 NFS 导出。
MgmtDriver 在所有 Master/Worker VM 上安装 NFS 客户端。
MgmtDriver 将 Kubernetes 持久卷的清单文件传输到 Master VM。
MgmtDriver 将 Kubernetes 持久卷的清单文件中的 NFS 服务器 IP 地址替换为实际的 NFS 服务器 IP 地址。
MgmtDriver 使用 CLI 在 Master VM 上注册持久卷。
注意
假设存储服务器 VM 的操作系统是 Ubuntu。 Cinder 卷的文件系统使用 “ext4” 创建。
带有持久卷的整个 Kubernetes 集群的 Heal 操作¶
将存储服务器 VM 提供的持久卷添加到规范 “支持使用 Mgmtdriver Heal Kubernetes Master/Worker 节点” [3]。
下图显示 Heal(整个 Kubernetes 集群) 操作
+---------------+
| Heal Request |
+---+-----------+
| 1. Heal VNF
|
+----------------+-------------+
| v VNFM |
| +-------------------+ |
| | TackerServer | |
| +-------+-----------+ |
5. Kubernetes Cluster | | |
Installation | v |
8. NFS client | +----------------------+ |
Installation | | +--------------+ | |
+--------------+-------------------------------+--+---+ | | |
| | | | | | | |
+-------+--------------+--------+ | | | | | |
| | | | | | | | | |
| +----+-----+ +----+-----+ | 9. Kubernetes | | | | | |
| | v | | v | | PersistentVolumes | | | | | |
| | +------+ | | +------+ | | Registration | | | MgmtDriver | | |
| | |Worker| | | |Master|<+--+----------------------+--+---+ | | |
| | +------+ | | +------+ | | | | | | | |
| | VM | | VM | | | | | | | |
| +----------+ +----------+ | | | | | | |
| +-------------------------+ | 7. NFS server | | | | | |
| | +---------------+ | | Installation | | | | | |
| | | NFS |<---+--+----------------------+--+---+ | | |
| | +---------------+ | | 6. Set up Cinder | | | | | |
| | +---------------+ | | volume directories | | | | | |
| | | Cinder volume |<---+--+----------------------+--+---+ | | |
| | +---------------+ | | | | +--------------+ | |
| | Storage server VM | | | | 2. Delete old | |
| +-------------------------+ | | | Kubernetes cluster | |
| New VMs |<-------------------+ | | information | |
+-------------------------------+ 4. Create VMs | | | 10. Register new | |
+-------------------------------+(MasterVM/WorkerVM/ | | | Kubernetes cluster | |
| +----------+ +----------+ | Storage server VM | | | information | |
| | +------+ | | +------+ | | with Cinder volume)| | | | |
| | |Worker| | | |Master| | | | | | | |
| | +------+ | | +------+ | | | | | | |
| | VM | | VM | | | | | | |
| +----------+ +----------+ | | | | | |
| +-------------------------+ | | | | | |
| | +---------------+ | | | | | +--------------+ | |
| | | NFS | | | +-+--+---+ | | |
| | +---------------+ | | | | | OpenStack | | |
| | +---------------+ | | | | | Infra Driver | | |
| | | Cinder volume | | |<---------------------+--+---+ | | |
| | +---------------+ | | 3. Delete VMs | | +--------------+ | |
| | Storage server VM | |(MasterVM/WorkerVM/ | | | |
| +-------------------------+ | Storage server VM | | | |
| Old VMs | with Cinder volume) | | | |
+-------------------------------+ | | Tacker Conductor | |
+-------------------------------+ | +----------------------+ |
| Hardware Resources | | |
+-------------------------------+ +------------------------------+
Heal(整个 Kubernetes 集群) 操作的 VNFD¶
与规范 “支持使用 Mgmtdriver Heal Kubernetes Master/Worker 节点” [3] 相比没有变化。
Heal(整个 Kubernetes 集群) 操作的请求参数¶
与规范 “支持使用 Mgmtdriver Heal Kubernetes Master/Worker 节点” [3] 相比没有变化。
Heal(整个 Kubernetes 集群) 操作的流程¶
该流程包括以下步骤。
客户端发送 POST Heal VNF 请求。
它基本上与规范 “支持使用 Mgmtdriver Heal Kubernetes Master/Worker 节点” [3] 中描述的相同序列,除了以下额外的过程。
以下过程添加到
heal_end中。MgmtDriver 从 VnfInstance (Tacker DB) 获取 Instantiate VNF 请求的
additionalParams。MgmtDriver 为新的 Cinder 卷创建文件系统,并将其挂载到新的存储服务器 VM 上的目录。
MgmtDriver 在新的存储服务器 VM 上安装 NFS 服务器并设置 NFS 导出。
MgmtDriver 在所有新的 Master/Worker VM 上安装 NFS 客户端。
MgmtDriver 将 Kubernetes 持久卷的清单文件传输到新的 Master VM。
MgmtDriver 将 Kubernetes 持久卷的清单文件中的 NFS 服务器 IP 地址替换为实际的 NFS 服务器 IP 地址。
MgmtDriver 使用 CLI 在新的 Master VM 上注册 Kubernetes 持久卷。
存储服务器 VM 的 Heal 操作
下图显示了存储服务器 VM 的 Heal 操作
+---------------+
| Heal Request |
+---+-----------+
| 1. Heal VNF
|
+----------------+-------------+
| v VNFM |
| +-------------------+ |
| | TackerServer | |
2. Delete old | +-------+-----------+ |
Kubernetes | | |
+-------------------------------+ PersistentVolumes | v |
| +----------+ | 7. Register new | +----------------------+ |
| | | | Kubernetes | | +--------------+ | |
| | +------+ | | PersistentVolumes | | | | | |
| | |Master|<+--+----------------------+--+---+ | | |
| | +------+ | | | | | | | |
| | VM | | | | | | | |
| +----------+ | | | | | | |
| +-------------------------+ | 6. NFS server | | | MgmtDriver | | |
| | +---------------+ | | Installation | | | | | |
| | | NFS |<---+--+----------------------+--+---+ | | |
| | +---------------+ | | 5. Set up Cinder | | | | | |
| | +---------------+ | | volume directories | | | | | |
| | | Cinder volume |<---+--+----------------------+--+---+ | | |
| | +---------------+ | | | | +--------------+ | |
| | New Storage server VM |<-+--------------------+ | | | |
| +-------------------------+ | 4. Create new | | | | |
| +-------------------------+ | Storage server VM | | | | |
| | +---------------+ | | | | | | |
| | | NFS | | | | | | +--------------+ | |
| | +---------------+ | | +-+--+---+ | | |
| | +---------------+ | | | | | OpenStack | | |
| | | Cinder volume | | | | | | Infra Driver | | |
| | +---------------+ |<-+----------------------+--+---+ | | |
| | Old Storage server VM | | 3. Delete old | | +--------------+ | |
| +-------------------------+ | Storage server VM | | | |
+-------------------------------+ | | Tacker Conductor | |
+-------------------------------+ | +----------------------+ |
| Hardware Resources | | |
+-------------------------------+ +------------------------------+
Heal(存储服务器 VM) 操作的 VNFD¶
VNFD 需要具有 heal_start 和 heal_end 定义。 与规范 “支持使用 Mgmtdriver Heal Kubernetes Master/Worker 节点” [3] 相同。
Heal(存储服务器 VM) 操作的请求参数¶
用户提供 ETSI NFV-SOL002 v2.6.1 [7] 中定义的 HealVnfRequest 数据类型作为请求参数。 与规范 “支持使用 Mgmtdriver Heal Kubernetes Master/Worker 节点” [3] 相同。
Heal(存储服务器 VM) 操作的流程¶
该流程包括以下步骤。
客户端发送 POST Heal VNF 请求。
它基本上与规范 “基于 ETSI NFV-SOL 规范的 VNF REST API” [8] 的 “3) VNF 实例 Heal 的流程” 章节中描述的相同序列,除了 MgmtDriver 之外。
在
heal_start中执行以下过程。MgmtDriver 从 VnfInstance (Tacker DB) 获取 Instantiate VNF 请求的
additionalParams。MgmtDriver 使用 CLI 获取 Kubernetes 持久卷的状态,并检查它们是否在使用中。 如果 Kubernetes 持久卷正在使用中,则引发异常并 Heal 操作失败。
MgmtDriver 使用 CLI 删除 Master VM 上的 Kubernetes 持久卷。
以下流程在
heal_end中执行。MgmtDriver 从 Heat 获取新的存储服务器 VM 的 IP 地址。
MgmtDriver 从 VnfInstance (Tacker DB) 获取 Instantiate VNF 请求的
additionalParams。MgmtDriver 为新的 Cinder 卷创建文件系统,并将其挂载到新的存储服务器 VM 上的目录。
MgmtDriver 在新的存储服务器 VM 上安装 NFS 服务器并设置 NFS 导出。
MgmtDriver 将 Kubernetes 持久卷的清单文件传输到 Master VM。
MgmtDriver 将 Kubernetes 持久卷的清单文件中的 NFS 服务器 IP 地址替换为实际的 NFS 服务器 IP 地址。
MgmtDriver 使用 CLI 在 Master VM 上注册 Kubernetes 持久卷。
备选方案¶
无
数据模型影响¶
无
REST API 影响¶
无
安全影响¶
无
通知影响¶
无
其他最终用户影响¶
无
性能影响¶
无
其他部署者影响¶
无
开发人员影响¶
无
实现¶
负责人¶
- 主要负责人
Masaki Ueno <masaki.ueno.up@hco.ntt.co.jp>
- 其他贡献者
伊藤良人 <yoshito.itou.dr@hco.ntt.co.jp>
Yoshiyuki Katada <katada.yoshiyuk@fujitsu.com>
Ayumu Ueha <ueha.ayumu@fujitsu.com>
陆梁 <lu.liang@fujitsu.com>
工作项¶
提供基于 Wallaby 发布版本的 Kubernetes 集群示例脚本,MgmtDriver 执行以下更改
将存储服务器 VM 的 Cinder 卷作为 NFS 共享目录暴露,并将 NFS 共享目录注册为 Kubernetes 持久卷。
在所有 Master/Worker VM 上安装 NFS 客户端。
在 Heal 存储服务器 VM 时,重新注册 Kubernetes 持久卷。
添加新的单元和功能测试。
依赖项¶
Kubernetes集群的LCM操作取决于以下规范
测试¶
将添加单元和功能测试,以涵盖规范所需的用例。
文档影响¶
将添加完整的用户指南,以解释如何使用包含 Cinder 卷的存储服务器的 Kubernetes 集群。