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 还有其他一些选项。

  1. Magnum

Magnum 是一个服务,可以使 COE,例如 Kubernetes、Docker Swarm、Apache Mesos。考虑到 Magnum 会将容器化 VNF 作为嵌套容器(虚拟机内的容器)缝合在一起。在本提案中,我们抽象了将 Kubernetes 注册为 VIM,因此 Kubernetes 集群可以部署在 VM(Magnum)或裸机上。

  1. Zun

就 NFV 定义而言,Tacker 可以使用 Zun 作为 VIM 来管理 OpenStack 环境中的容器。Zun 还提供用于轻松管理容器的本机 OpenStack API。当 Zun 提供注册方式或可以从 OpenStack 中分离时,我们将在未来考虑 Zun。

  1. Docker

直接使用 Dockerfile 在 Docker 中创建 VNF 的镜像,但我们无法使用 Dockerfile 限制每个 VNF 的资源使用量。否则,Docker 仅关注在每台机器上 CRUD 容器,我们需要编排工具来调度和管理多个主机上的容器。

  1. 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 更改

  1. python-tackerclient

代码中存在一些更改,以分别处理“openstack”和“kubernetes”VIM。Tacker 客户端命令的语法没有变化。

tacker vim-register --config-file kubernetes-VIM.yaml vim-kubernetes

使用 kubernetes-VIM.yaml 作为前面提到的配置文件。

  1. 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>

工作项

  1. 支持在 devstack 环境中创建 Kubernetes 集群

  2. 添加 Python Kubernetes 客户端

  3. 更新 Tacker 客户端和 horizon

  4. 实现 Kubernetes 作为 VIM

  5. 编写测试和文档

依赖项

测试

(待定)

文档影响

参考资料