Kubernetes 作为 Tacker 中的 VIM¶
讨论文档:[1]
本提案描述了在 Tacker 中添加 Kubernetes 作为 VIM 的计划,以便 Tacker 可以通过 Python Kubernetes 客户端支持云原生应用程序。OpenStack 和 Kubernetes 将分别用作基于虚拟机和容器的 VNFs 的 VIM。此功能进一步用于创建 Kubernetes 类型的容器化 VNF (c-VNF) 以及基于 VM 和容器的 VNF、NS 的混合云部署。
应用 Kubernetes 作为 VIM 时的架构
+-----------------------------------------------+
| |
| Tacker API |
| |
+-----------+-------------------------+---------+
| |
| |
+-----------v--------+ +----------v---------+
| | | |
| C-VNFM | | VNFM |
| | | |
+-----------+--------+ +----------+---------+
| |
| |
+-----------v--------+ +----------v---------+
| | | |
| Kubernetes VIM | | OpenStack VIM |
| | | |
+--------------------+ +--------------------+
+-----------------------------------------------+
| Neutron network & Kuryr Kubernetes |
+-----------------------------------------------+
问题描述¶
目前 Tacker 仅支持 OpenStack 作为 VIM,这意味着 VNFs 在虚拟机中创建。在某些电信场景中,虚拟化网络服务需要快速响应变化,例如更新、从故障中恢复、扩展、迁移。基于 VM 的 VNF 可能不是一个好的解决方案,相反,应该使用其他解决方案,例如容器。另一方面,容器化 VNFs 重量轻、占用空间小、系统资源利用率低,它们提高了运营效率并降低了运营成本。
Kubernetes 是一个开源项目,用于自动化容器化应用程序的部署、扩展和管理。K8s 还通过使用服务发现和持续监控来提供调度/部署一组相关的容器、自愈功能。虽然它尚未适用于所有 VNF 场景,但它是更成熟的容器编排引擎 (COE) 之一。目前,Kubernetes 在 Container4NFV 项目 (OPNFV) 中被选为 COE [2]。
拟议的变更¶
Kubernetes 作为 VIM¶
本提案基于当前可用上游项目(OpenStack、Kubernetes、Kuryr 等)的状态,以支持 Tacker 中的容器化 VNFs。Kuryr-kubernetes 将用作容器和 VM 之间的网络。但是,Tacker 不管理 Kubernetes 集群或关心集群部署在何处(在 Magnum 上还是裸机上),Tacker 只需要有关 Kubernetes 集群的信息并将 Kubernetes 注册为其 VIM。为容器(Kubernetes)部署 DPDK、SR-IOV、多种网络或存储技术应由其他项目负责,例如 OPNFV 中的 Container4NFV,它主要关注 VIM。OpenStack Tacker 将支持具有增强的平台感知 (EPA) 放置的高性能 NFV 工作负载的 Kubernetes VIM 中的 c-VNF。
OpenStack VIM 配置更改
当前,在创建 VIM 时,其默认类型是 OpenStack。此规范将在 vim-config.yaml 文件中添加“type”来指定 VIM 的类型。
auth_url: 'http://127.0.0.1/identity'
username: 'admin'
password: 'password'
project_name: 'demo'
project_domain_name: 'Default'
user_domain_name: 'Default'
type: 'openstack'
用于创建 Kubernetes VIM 的示例配置文件
用户需要提供 Kubernetes 资源部署的命名空间,方法是在“project_name”中指定。默认情况下,如果未提及命名空间,每个 Pod 都将部署在 *default* 命名空间中。
Kubernetes API 身份验证有两种选择 [3]
使用 Bearer token
auth_url: "https://192.168.11.110:6443"
bearer_token: "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJkZWZhdWx0Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZWNyZXQubmFtZSI6ImRlZmF1bHQtdG9rZW4tc2ZqcTQiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC5uYW1lIjoiZGVmYXVsdCIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50LnVpZCI6IjBiMzZmYTQ2LWFhOTUtMTFlNy05M2Q4LTQwOGQ1Y2Q0ZmJmMSIsInN1YiI6InN5c3RlbTpzZXJ2aWNlYWNjb3VudDpkZWZhdWx0OmRlZmF1bHQifQ.MBjFA18AjD6GyXmlqsdsFpJD_tgPfst2faOimfVob-gBqnAkAU0Op2IEauiBVooFgtvzm-HY2ceArftSlZQQhLDrJGgH0yMAUmYhI8pKcFGd_hxn_Ubk7lPqwR6GIuApkGVMNIlGh7LFLoF23S_yMGvO8CHPM-UbFjpbCOECFdnoHjz-MsMqyoMfGEIF9ga7ZobWcKt_0A4ge22htL2-lCizDvjSFlAj4cID2EM3pnJ1J3GXEqu-W9DUFa0LM9u8fm_AD9hBKVz1dePX1NOWglxxjW4KGJJ8dV9_WEmG2A2B-9Jy6AKW83qqicBjYUUeAKQfjgrTDl6vSJOHYyzCYQ"
ssl_ca_cert: "-----BEGIN CERTIFICATE-----
MIIDUzCCAjugAwIBAgIJANPOjG38TA+fMA0GCSqGSIb3DQEBCwUAMCAxHjAcBgNV
BAMMFTE3Mi4xNy4wLjJAMTUwNzI5NDI2NTAeFw0xNzEwMDYxMjUxMDVaFw0yNzEw
MDQxMjUxMDVaMCAxHjAcBgNVBAMMFTE3Mi4xNy4wLjJAMTUwNzI5NDI2NTCCASIw
DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKlPwd5Dp484Fb+SjBZeV8qF4k8s
Z06NPdlHKuXaxz7+aReGSwz09JittlqQ/2CwSd5834Ll+btfyTyrB4bv+mr/WD3b
jxEhnWrUK7oHObzZq0i60Ard6CuiWnv5tP0U5tVPWfNBoHEEPImVcUmgzGSAWW1m
ZzGdcpwkqE1NznLsrqYqjT5bio7KUqySRe13WNichDrdYSqEEQwFa+b+BO1bRCvh
IYSI0/xT1CDIlPmVucKRn/OVxpuTQ/WuVt7yIMRKIlApsZurZSt7ypR7SlQOLEx/
xKsVTbMvhcKIMKdK8pHUJK2pk8uNPAKd7zjpiu04KMa3WsUreIJHcjat6lMCAwEA
AaOBjzCBjDAdBgNVHQ4EFgQUxINzbfoA2RzXk584ETZ0agWDDk8wUAYDVR0jBEkw
R4AUxINzbfoA2RzXk584ETZ0agWDDk+hJKQiMCAxHjAcBgNVBAMMFTE3Mi4xNy4w
LjJAMTUwNzI5NDI2NYIJANPOjG38TA+fMAwGA1UdEwQFMAMBAf8wCwYDVR0PBAQD
AgEGMA0GCSqGSIb3DQEBCwUAA4IBAQB7zNVRX++hUXs7+Fg1H2havCkSe63b/oEM
J8LPLYWjqdFnLgC+usGq+nhJiuVCqqAIK0dIizGaoXS91hoWuuHWibSlLFRd2wF2
Go2oL5pgC/0dKW1D6V1Dl+3mmCVYrDnExXybWGtOsvaUmsnt4ugsb+9AfUtWbCA7
tepBsbAHS62buwNdzrzjJV+GNB6KaIEVVAdZdRx+HaZP2kytOXqxaUchIhMHZHYZ
U0/5P0Ei56fLqIFO3WXqVj9u615VqX7cad4GQwtSW8sDnZMcQAg8mnR4VqkF8YSs
MkFnsNNkfqE9ck/D2auMwRl1IaDPVqAFiWiYZZhw8HsG6K4BYEgk
-----END CERTIFICATE-----"
project_name: "default"
type: "kubernetes"
使用用户名和密码的基本身份验证
auth_url: "https://192.168.11.110:6443"
username: "k8s_username"
password: "k8s_password"
ssl_ca_cert: "-----BEGIN CERTIFICATE-----
MIIDUzCCAjugAwIBAgIJANPOjG38TA+fMA0GCSqGSIb3DQEBCwUAMCAxHjAcBgNV
BAMMFTE3Mi4xNy4wLjJAMTUwNzI5NDI2NTAeFw0xNzEwMDYxMjUxMDVaFw0yNzEw
MDQxMjUxMDVaMCAxHjAcBgNVBAMMFTE3Mi4xNy4wLjJAMTUwNzI5NDI2NTCCASIw
DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKlPwd5Dp484Fb+SjBZeV8qF4k8s
Z06NPdlHKuXaxz7+aReGSwz09JittlqQ/2CwSd5834Ll+btfyTyrB4bv+mr/WD3b
jxEhnWrUK7oHObzZq0i60Ard6CuiWnv5tP0U5tVPWfNBoHEEPImVcUmgzGSAWW1m
ZzGdcpwkqE1NznLsrqYqjT5bio7KUqySRe13WNichDrdYSqEEQwFa+b+BO1bRCvh
IYSI0/xT1CDIlPmVucKRn/OVxpuTQ/WuVt7yIMRKIlApsZurZSt7ypR7SlQOLEx/
xKsVTbMvhcKIMKdK8pHUJK2pk8uNPAKd7zjpiu04KMa3WsUreIJHcjat6lMCAwEA
AaOBjzCBjDAdBgNVHQ4EFgQUxINzbfoA2RzXk584ETZ0agWDDk8wUAYDVR0jBEkw
R4AUxINzbfoA2RzXk584ETZ0agWDDk+hJKQiMCAxHjAcBgNVBAMMFTE3Mi4xNy4w
LjJAMTUwNzI5NDI2NYIJANPOjG38TA+fMAwGA1UdEwQFMAMBAf8wCwYDVR0PBAQD
AgEGMA0GCSqGSIb3DQEBCwUAA4IBAQB7zNVRX++hUXs7+Fg1H2havCkSe63b/oEM
J8LPLYWjqdFnLgC+usGq+nhJiuVCqqAIK0dIizGaoXS91hoWuuHWibSlLFRd2wF2
Go2oL5pgC/0dKW1D6V1Dl+3mmCVYrDnExXybWGtOsvaUmsnt4ugsb+9AfUtWbCA7
tepBsbAHS62buwNdzrzjJV+GNB6KaIEVVAdZdRx+HaZP2kytOXqxaUchIhMHZHYZ
U0/5P0Ei56fLqIFO3WXqVj9u615VqX7cad4GQwtSW8sDnZMcQAg8mnR4VqkF8YSs
MkFnsNNkfqE9ck/D2auMwRl1IaDPVqAFiWiYZZhw8HsG6K4BYEgk
-----END CERTIFICATE-----"
project_name: "default"
type: "kubernetes"
Tacker 支持使用基本信息和 bearer token 进行身份验证。如果用户想使用不安全的 HTTPS 请求,用户可以将 ssl_ca_cert 设置为“None”,但强烈建议添加证书验证。
ssl_ca_cert: None
有关 Kubernetes 身份验证的更多信息,请参阅 Kubernetes 文档 [4]。
添加 Kubernetes HTTP 客户端以管理 c-VNF 生命周期
为了管理 Kubernetes 类型的 c-VNF,Tacker 将使用 Python Kubernetes 客户端 [5] 来管理 Kubernetes 资源,用户可以在 Kubernetes 环境中创建 Pod、Deployment、Horizontal Pod Autoscaling、Service 和 ConfigMap。
KubernetesHttpApi 类将在 Tacker 中初始化,它实现 Python Kubernetes 客户端来管理 Kubernetes VIM,并在未来用于管理 Kubernetes 资源的 c-VNF 的 CRUD 操作。
假设
此功能将进一步用于创建 c-VNF。当 Kubernetes 作为 VIM 部署时,用户可以使用 TOSCA 模板创建 c-VNF。
TOSCA 到 Kubernetes 转换器将在 Tacker 中使用。用户可以像往常一样定义 TOSCA 模板,转换器会将资源从 TOSCA 转换为 Kubernetes 模板,例如 Pod、Deployment、Horizontal Pod Autoscaling、Service 和 ConfigMap。我们计划在 Heat 转换器中应用从 TOSCA 到 Kubernetes 的转换。
VNFFG 和 NS 将通过 Service(而不是 Pod)呈现,该 Service 在 Kuryr-Kubernetes 中实现为负载均衡器,符合 ETSI 标准中的 VNF 负载均衡模型 [6]。
备选方案¶
在 Tacker 中实现容器化 VNF 还有其他一些选项。
Magnum
Magnum 是一个服务,可以使 COE,例如 Kubernetes、Docker Swarm、Apache Mesos。考虑到 Magnum 会将容器化 VNF 作为嵌套容器(虚拟机内的容器)缝合在一起。在本提案中,我们抽象了将 Kubernetes 注册为 VIM,因此 Kubernetes 集群可以部署在 VM(Magnum)或裸机上。
Zun
就 NFV 定义而言,Tacker 可以使用 Zun 作为 VIM 来管理 OpenStack 环境中的容器。Zun 还提供用于轻松管理容器的本机 OpenStack API。当 Zun 提供注册方式或可以从 OpenStack 中分离时,我们将在未来考虑 Zun。
Docker
直接使用 Dockerfile 在 Docker 中创建 VNF 的镜像,但我们无法使用 Dockerfile 限制每个 VNF 的资源使用量。否则,Docker 仅关注在每台机器上 CRUD 容器,我们需要编排工具来调度和管理多个主机上的容器。
Multus-CNI [7]
对于 Kubernetes 中的多种网络,Multus-CNI 可以是一种解决方案。目前 Kuryr-Kubernetes 不支持它。因此,Multus-CNI 将在未来考虑。Kubernetes 也有多种网络的计划 [8]。
身份更改¶
Kubernetes VIM 信息包括 *username* 和 *password* 或 *bearer_token* 和 *ssl_ca_cert*,用于身份验证 Kubernetes VIM,这些信息将存储在“vimauth”表中。
身份验证成功后,Tacker 使用 fernet 密钥加密机密数据(密码、bearer_token、ssl_ca_cert),然后 fernet 密钥将由 Barbican 存储。
Tacker 中加密“password”的示例
fernet_key, fernet_obj = self.kubernetes.create_fernet_key()
# password is encrypted by fernet_key
encoded_auth = fernet_obj.encrypt(auth['password'].encode('utf-8'))
# store fernet_key in Barbican
secret_uuid = keymgr_api.store(context, fernet_key)
auth['key_type'] = 'barbican_key'
auth['secret_uuid'] = secret_uuid
每次 Tacker 需要执行 Kubernetes 客户端时,Tacker 都会从 ssl_ca_cert 创建一个临时文件,该文件存储在临时文件夹中(例如 /tmp、/var/tmp 或 /usr/tmp),以进行 Kubernetes 主节点的身份验证。完成后,ssl_ca_cert 临时文件将被删除。
python-tackerclient 和 horizon dashboard 更改¶
python-tackerclient
代码中存在一些更改,以分别处理“openstack”和“kubernetes”VIM。Tacker 客户端命令的语法没有变化。
tacker vim-register --config-file kubernetes-VIM.yaml vim-kubernetes
使用 kubernetes-VIM.yaml 作为前面提到的配置文件。
Tacker horizon dashboard
Tacker horizon 将添加一个选项以支持使用 *bearer_token* 和 *ca_ssl_cert* 注册 Kubernetes VIM。
Devstack 更改¶
用户可以启用 kuryr-kubernetes 插件,以重用创建 Kubernetes 集群并支持 OpenStack VM 和 Kubernetes Pod 之间的 neutron 网络,方法是添加以下内容:
KUBERNETES_VIM=True
NEUTRON_CREATE_INITIAL_NETWORKS=False
enable_plugin kuryr-kubernetes https://git.openstack.org/openstack/kuryr-kubernetes master
enable_plugin neutron-lbaas https://git.openstack.org/openstack/neutron-lbaas master
enable_plugin devstack-plugin-container https://git.openstack.org/openstack/devstack-plugin-container master
未来将支持 VM 和基于容器的 VNFs 之间的服务功能链。
REST API 影响¶
无
安全影响¶
通知影响¶
其他最终用户影响¶
性能影响¶
其他部署者影响¶
开发人员影响¶
实现¶
负责人¶
Hoang Phuoc <hoangphuocbk2.07@gmail.com>
Janki Chhatbar <jchhatba@redhat.com>
Trinath Somanchi <trinath.somanchi@nxp.com>
Xuan Jia <jiaxuan@chinamobile.com>
工作项¶
支持在 devstack 环境中创建 Kubernetes 集群
添加 Python Kubernetes 客户端
更新 Tacker 客户端和 horizon
实现 Kubernetes 作为 VIM
编写测试和文档
依赖项¶
测试¶
(待定)