MgmtDriver 与 Kubernetes 集群管理 OSS¶
https://blueprints.launchpad.net/tacker/+spec/k8s-mgmtdriver-kubespray
本文档提出 MgmtDriver 使用 Ansible 接口来管理 Kubernetes 集群 VNF。作为示例实现,Tacker 提供了 kubespray [1] 作为 Ansible playbook,用于在 MgmtDriver 中安装和配置 Kubernetes 集群 VNF。此外,还将支持负载均衡器,以暴露 Kubernetes 集群 VNF 上的 CNF。
问题描述¶
如 specs [2] [3] [4] 中所述,用户可以使用 ETSI NFV-SOL003 v2.6.1 中的 VNF 生命周期管理操作来管理他们的 Kubernetes 集群 VNF。[5] 在这些 specs 中,MgmtDriver 负责在主要操作之前/之后执行预处理和后处理操作。MgmtDriver 允许用户在 <operation>_start() 或 <operation>_end() 方法中执行任何配置逻辑。此外,这些方法支持在 VNF 生命周期管理操作中部署的每个 VM 中执行 shell 脚本。
另一方面,云原生计算基金会 (CNCF) [6] 托管了一些 Kubernetes 集群管理解决方案。 在本文档中,新的 MgmtDriver 支持 kubespray [1] 作为 Ansible playbook 的示例。
将支持以下新功能
使用 kubespray Ansible playbook 进行 Kubernetes 集群管理。
用于暴露 Kubernetes 集群上 CNF 的负载均衡器的 VNF 生命周期管理。
提议的变更¶
在新 MgmtDriver 中需要进行以下更改
instantiate_end
执行 Ansible playbook 以创建 Kubernetes 集群。
安装并初始化负载均衡器。
scale_start, scale_end
执行 Ansible playbook 以加入新的 Worker 节点。
向/从负载均衡器添加/删除路由。
heal_start, heal_end (整个 VNF)
执行 Ansible playbook 以重新创建 Kubernetes 集群。
重新安装和重新初始化负载均衡器。
heal_start, heal_end (目标 VNFC)
执行 Ansible playbook 以重新创建目标节点。
向/从负载均衡器添加/删除路由。
注意
spec “Support Healing Kubernetes Master/Worker-nodes with Mgmtdriver” [4] 中支持使用 SOL002 进行 VNFC Heal 操作,但由于 kubespray 不提供 Master 节点的 playbook,因此本文档不支持 Master 节点的 Heal 操作。
注意
示例 MgmtDriver 假定具有预构建的 Ansible 服务器。 MgmtDriver 通过 SSH 连接到 Ansible 服务器,并假设 Ansible 命令可执行,使用 CLI 运行 playbook。 此外,应安装 sshpass。
VNFD 用于操作¶
应将以下部分添加到用户文档“如何使用 Mgmt Driver 部署 Kubernetes 集群” [7] 中的 VNFD 中
VNFD (TOSCA)
substitution_mappings:
...
requirements:
virtual_link_external: [ externalLB_CP1, virtual_link ]
...
node_templates:
...
externalLB:
type: tosca.nodes.nfv.Vdu.Compute
...
externalLB_CP1:
type: tosca.nodes.nfv.VduCp
...
requirements:
- virtual_binding: externalLB
...
externalLB_CP2:
type: tosca.nodes.nfv.VduCp
...
requirements:
- virtual_binding: externalLB
- virtual_link: internalVL
...
Heat 模板 (Base HOT)
heat_template_version: 2013-05-23
description: 'ExternalLB HOT for Sample VNF'
parameters:
flavor:
type: string
image:
type: string
public_network:
type: string
net1:
type: string
resources:
externalLB:
type: OS::Nova::Server
properties:
flavor: { get_param: flavor }
name: externalLB
image: { get_param: image }
networks:
- port:
get_resource: externalLB_CP1
- port:
get_resource: externalLB_CP2
externalLB_CP1:
type: OS::Neutron::Port
properties:
network: { get_param: public_network }
externalLB_CP2:
type: OS::Neutron::Port
properties:
network: { get_param: net1 }
实例化 Kubernetes 集群 VNF¶
本节描述了如何在 MgmtDriver 的 instantiate_end() 方法中使用 kubespray Ansible playbook 创建 Kubernetes 集群。
操作设计¶
下图描述了 Kubernetes 集群的实例化过程
+---------------+ +---------+
| ExternalLB | | |
| Script | | VNFD |
| | | |
+-------------+-+ +-+-------+
| |
v v +---------------+
+--+-----+-+ | Instantiation |
| | | Request with |
| CSAR | | Additional |
| | | Params |
+----+-----+ +-+-------------+
| |
| | 1. Send request
+-----------------------------------------+
| | | VNFM |
| v v |
| +----+----------+----+ |
| | TackerServer | |
| +-------+------------+ |
| | |
| +---------------------------------+ |
| | | Tacker Conductor | |
| | v | |
| | +--------+------------+ | |
| | | VnflcmDriver | | |
| | +------+-----------+--+ | |
| | | | | |
| | v v | |
| | +------+-----+ +--+--------+ | |
| | | Mgmt | | OpenStack | | |
+----------------+ Driver | | Infra | | |
| | | | | | Driver | | |
v | | +-----------++ +-------+---+ | |
+-----+------+ | | | | | |
| Ansible | | +---------------------------------+ |
| | | | | |
+-------+----+ +-----------------------------------------+
1. Install | | |
Kubernetes +------------+ 4. Install +------+ | 2. Create VMs
cluster | | ExternalLB | v
+----------------------------------------------+-----------+
| | | | VNF |
| v v v |
| +-------------+ +-------------+ +----------------+ |
| | +---------+ | | +---------+ | | +------------+ | |
| | | Worker | | | | Master | | | | ExternalLB | | |
| | +---------+ | | +---------+ | | +------------+ | |
| | VM | | VM | | VM | |
| +-------------+ +-------------+ +----------------+ |
+----------------------------------------------------------+
+----------------------------------------------------------+
| Hardware Resources |
+----------------------------------------------------------+
需要在 MgmtDriver 的 instantiate_end() 方法中添加新的步骤,以对应 spec [2] 的 “VNF-A: 创建 VM 并设置 Kubernetes 集群 (Kube-adm)” 章节。
1-8. 现有流程
9-11. 在 instantiate_end 中添加以下流程以安装 Kubernetes 集群。
MgmtDriver 生成一个 inventory 文件。
inventory 文件包含已部署的 Master 和 Worker 节点的全部 IP 地址。 以下是 inventory 文件的示例
[all] node1 Ansible_host=95.54.0.12 ip=10.3.0.1 etcd_member_name=etcd1 Ansible_user=user1 Ansible_password=password1 node2 Ansible_host=95.54.0.13 ip=10.3.0.2 etcd_member_name=etcd2 Ansible_user=user2 Ansible_password=password2 node3 Ansible_host=95.54.0.14 ip=10.3.0.3 etcd_member_name=etcd3 Ansible_user=user3 Ansible_password=password3 node4 Ansible_host=95.54.0.15 ip=10.3.0.4 etcd_member_name=etcd4 Ansible_user=user4 Ansible_password=password4 node5 Ansible_host=95.54.0.16 ip=10.3.0.5 etcd_member_name=etcd5 Ansible_user=user5 Ansible_password=password5 node6 Ansible_host=95.54.0.17 ip=10.3.0.6 etcd_member_name=etcd6 Ansible_user=user6 Ansible_password=password6 [kube_control_plane] node1 node2 node3 [etcd] node1 node2 node3 [kube-node] node4 node5 node6 [calico-rr] [k8s-cluster:children] kube_control_plane kube-node calico-rrMgmtDriver 调用名为 cluster.yml 的 kubespray Ansible playbook 以安装 Kubernetes 集群。
通过 SCP 或 SFTP 将 inventory 文件传输到 Ansible 服务器。
通过 SSH 访问 Ansible 服务器,并运行名为 cluster.yml 的 Ansible playbook。
Ansible 服务器中的示例命令
ansible-playbook -i inventory/mycluster/hosts.ini --become --become-user=root cluster.ymlAnsible 在 Master 和 Worker 节点上安装 Kubernetes,包括 kubeadm、kubelet、etcd 集群。
12-14. 现有流程
在
instantiate_end中添加以下流程以安装和配置外部负载均衡器。通过 SCP 或 SFTP 传输在 script_path 中指定的 shell 脚本文件。
使用脚本文件安装外部负载均衡器并设置初始配置。
注意
待定:安装和配置 Kubernetes 集群的所有步骤可能需要专用的 Ansible playbook 或 shell 脚本。
操作请求参数¶
用户将以下实例化参数提供给 ETSI NFV-SOL003 v2.6.1 [5] 中的 InstantiateVnfRequest 数据类型“POST /vnf_instances/{id}/instantiate”。
将以下属性添加到用户文档“如何使用 Mgmt Driver 部署 Kubernetes 集群” [2] 中描述的 additionalParams 中。
additionalParams:
属性名称
基数
参数描述
k8s_cluster_installation_param
1
Kubernetes 集群安装配置。
>ansible
0..1
结构。指定 Ansible 相关配置,例如 IP 地址 (
ip_address) 和要执行的 playbook (kubespray_root_path)。>>ip_address
1
字符串。Ansible 服务器的 IP 地址。
>>username
1
字符串。Ansible 服务器的用户名。
>>password
1
字符串。Ansible 服务器的密码。
>>kubespray_root_path
1
字符串。kubespray 的根目录。
>>transferring_inventory_path
1
字符串。传输生成的 inventory 文件的目标路径。
>external_lb_param
0..1
结构。用于安装外部负载均衡器的属性。
>>ssh_cp_name
1
字符串。用于通过 SSH 访问已部署 VM 的 CP 的资源名称。
>>ssh_username
1
字符串。通过 SSH 访问已部署 VM 的用户名。
>>ssh_password
1
字符串。通过 SSH 访问已部署 VM 的密码。
>>script_path
1
字符串。用于外部负载均衡器安装的安装 shell 脚本的路径。
注意
不支持使用公钥身份验证进行 SSH 访问。
以下是请求体的示例
{
"flavourId": "simple",
"additionalParams": {
"k8s_cluster_installation_param": {
"script_path": "",
"vim_name": "kubernetes_vim",
"ansible": {
"ip_address": "0.0.0.0",
"username": "ansible",
"password": "ansible",
"kubespray_root_path": "",
"transferring_inventory_path": ""
},
"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"
},
"external_lb_param": {
"ssh_cp_name": "externalLB_instance",
"ssh_username": "ubuntu",
"ssh_password": "ubuntu",
"script_path": "./Scripts/ExternalLB_installation.sh"
}
},
"lcm-operation-user-data": "./UserData/k8s_cluster_user_data.py",
"lcm-operation-user-data-class": "KubernetesClusterUserData"
},
"extVirtualLinks": [
{
"id": "net0_master",
"resourceId": "b0b84da3-3259-4855-b4cd-5711ba5e5de1",
"extCps": [
{
"cpdId": "masterNode_CP1",
"cpConfig": [
{
"cpProtocolData": [
{
"layerProtocol": "IP_OVER_ETHERNET"
}
]
}
]
}
]
},
{
"id": "net0_worker",
"resourceId": "b0b84da3-3259-4855-b4cd-5711ba5e5de1",
"extCps": [
{
"cpdId": "workerNode_CP2",
"cpConfig": [
{
"cpProtocolData": [
{
"layerProtocol": "IP_OVER_ETHERNET"
}
]
}
]
}
]
},
{
"id": "net0_externalLB",
"resourceId": "b0b84da3-3259-4855-b4cd-5711ba5e5de1",
"extCps": [
{
"cpdId": "externalLB_CP1",
"cpConfig": [
{
"cpProtocolData": [
{
"layerProtocol": "IP_OVER_ETHERNET"
}
]
}
]
}
]
}
],
"vimConnectionInfo": [
{
"id": "3cc2c4ff-525c-48b4-94c9-29247223322f",
"vimId": "05ef7ca5-7e32-4a6b-a03d-52f811f04496",
"vimType": "openstack"
}
]
}
扩展/缩减 Kubernetes 集群 VNF 的 Worker 节点¶
本节描述了如何在 MgmtDriver 中使用 Ansible 接口以及负载均衡器扩展/缩减 Worker 节点。 在扩展操作中,新的 Worker 节点需要使用 kubespray playbook 安装 Kubernetes 相关软件包,并且负载均衡器需要为新的 Worker 节点添加路由。
扩展¶
该过程几乎与 spec [3] 的“Scale-out”章节相同,除了 MgmtDriver 部分。 MgmtDriver 中的 scale_end 操作需要以下新步骤
更新 inventory 文件以添加新的 Worker 节点。
调用 kubespray Ansible playbook。
通过 SSH 访问 Ansible 服务器。
运行名为 scale.yml 的 Ansible playbook 以安装新的 Worker 节点。
Ansible 服务器中的示例命令
ansible-playbook -i inventory/mycluster/hosts.ini --become --become-user=root scale.yml
通过 SCP 或 SFTP 传输实例化操作中提供的 script_path 中指定的 shell 脚本。
使用脚本更新负载均衡器中的路由配置。
缩减¶
该过程几乎与 spec [3] 的“Scale-in”章节相同,除了 MgmtDriver 部分。 MgmtDriver 中的 scale_start 操作需要以下新步骤
通过 SCP 或 SFTP 传输实例化操作中提供的 script_path 中指定的 shell 脚本。
使用脚本从负载均衡器中删除计划删除的 Worker 节点的路由。
从计划删除的 Worker 节点中驱逐 Pod。
通过 SSH 访问 Master 节点。
执行驱逐命令。
Master 节点中的示例命令
kubectl drain <Worker node to be deleted>
调用 kubespray Ansible playbook。
通过 SSH 访问 Ansible 服务器。
更新 inventory 文件以删除 Worker 节点。
运行名为 remove-node.yml 的 Ansible playbook 以删除目标 Worker 节点。
Ansible 服务器中的示例命令
ansible-playbook -i inventory/mycluster/hosts.ini --become --become-user=root remove-node.yml -e node=<Worker node to be deleted>
修复 Kubernetes 集群 VNF 中的 Master/Worker 节点¶
在本规范中,不支持使用 SOL002 修复 Master 节点。 以下部分描述了如何使用 SOL003 修复 Kubernetes 集群 VNF,以及如何使用 SOL002 修复 Kubernetes 集群中的 Worker 节点。
修复 Kubernetes 集群¶
修复整个 Kubernetes 集群 VNF 的 Heal 操作所需的全部过程已经在 spec [2] 的 heal_start 和 实例化 Kubernetes 集群 VNF 的 heal_end 中描述。 heal_start 操作与 terminate_end 相同,heal_end 操作与 instantiate_end 相同。
修复 Kubernetes 集群中的 Worker 节点¶
该过程几乎与 spec [4] 的“使用 SOL002 修复 Kubernetes Master/Worker 节点”章节相同,除了 MgmtDriver 部分。
对于 MgmtDriver 中的新步骤,heal_start 与缩减操作中的 scale_start 相同,heal_end 也与扩展操作中的 scale_end 相同。 详细步骤在 扩展/缩减 Kubernetes 集群 VNF 的 Worker 节点 中描述。
备选方案¶
无
数据模型影响¶
无
REST API 影响¶
无
安全影响¶
本文档中描述的实施方案包括安全影响,例如在运行 Ansible playbook 时使用 sudo 和提升权限。
通知影响¶
无
其他最终用户影响¶
无
性能影响¶
无
其他部署者影响¶
无
开发人员影响¶
无
实现¶
负责人¶
- 主要负责人
Masaki Ueno <masaki.ueno.up@hco.ntt.co.jp>
- 其他贡献者
伊藤良人 <yoshito.itou.dr@hco.ntt.co.jp>
Kyosuke Hori <hori-kyosuke@fujitsu.com>
Yoshiyuki Katada <katada.yoshiyuk@fujitsu.com>
Ayumu Ueha <ueha.ayumu@fujitsu.com>
陆梁 <lu.liang@fujitsu.com>
工作项¶
MgmtDriver将被修改以实现
执行 Ansible playbook。
生成 inventory 文件。
提供一个示例脚本来执行以下任务
安装并初始化负载均衡器。
向/从负载均衡器添加/删除路由。
重新安装和重新初始化负载均衡器。
添加新的单元和功能测试。
依赖项¶
Kubernetes集群的LCM操作取决于以下规范
Kubernetes集群的实例化操作
依赖于 spec “Support deploying Kubernetes cluster with MgmtDriver” [2]。
Kubernetes集群的伸缩操作
依赖于 spec “Support scaling Kubernetes Worker-nodes with Mgmtdriver” [3]。
Kubernetes集群的修复操作
依赖于 spec “Support Healing Kubernetes Master/Worker-nodes with Mgmtdriver” [4]。
测试
将添加单元和功能测试,以涵盖规范所需的用例。
文档影响¶
关于 Kubernetes 集群的生命周期管理,将添加完整的用户指南来解释以下两个步骤
如何使用 kubespray Ansible playbook。
如何设置外部负载均衡器。