OpenStack 和 Kubernetes 融合部署实践

OpenStack on Kubernetes on OpenStack

最近花了一点时间尝试在 Kubernetes 上部署 OpenStack,受限于环境,踩了不少坑,好在最终效果还不错。

以下简单展示下整个环境的概况:

VM in OpenStack

用 cirros 镜像创建了一个虚机:

image-20200608163145601

网络也正常:

image-20200608163530294

这个实例在 Dashboard 中看上去是这样的:

image-20200608163640522

细心的你可能已经发现这里的端口号不是默认的 80,而是比较奇怪的 32557,这是因为这个 openstack 环境是搭建在 Kubernetes 集群上的。

OpenStack on Kubernetes

在页面上查看 openstack 的系统信息:

image-20200608163959155

各个服务的 endpoints URL 都是以 *.openstack.svc.cluster.local 域名的形式,熟悉 Kubernetes 的应该看上去有点眼熟。

其中的 Public 接口是通过 Ingress 暴露的:

image-20200608165003793

更多的内部接口则可以在 service 中看到:

image-20200608165418688

注意 horizon-int 对应的就是 Dashboard 服务,它的类型是 NodePort 而且映射的端口号是 32557

当然除了 service 还有其它资源,例如用来支持虚拟化的 DaemonSet :

image-20200608165752973

带状态的数据库和消息队列,以 StatefulSet 的形式:

image-20200608170004768

还有部署过程中的各种以 job 方式执行的任务:

image-20200608170158822

所有这些 pod 构成了这个 openstack 环境:

image-20200608170314788

Ceph as Storage

当然还要用到持久化的卷存储,即 PersistentVolumeClaimPersistentVolume

image-20200608170712499

它们由 ceph 提供,同样部署在当前集群中 :

image-20200608170920234

Kubernetes on OpenStack

这个 Kubernetes 集群有 4 个节点,1 个 master 节点,3 个 worker 节点:

image-20200608172635305

因为机器有限,没有那么多的物理节点可供实验,所以这个集群是搭建在另一个 openstack 环境之上的:

image-20200608172954363

部署过程中遇到的一个大坑就在此,由于 OpenStack 虚机网络的 MTU 默认 1500 太小,导致了部署 MySQL 集群时一直同步不成功

在 openstack 中部署 Kubernetes 的方案很多,在尝试了其中的一些(包括 magnum)之后,最终使用基于 Ansible 的 Kubespray 部署,完成这样一套集群大概需要 20 分钟:

image-20200609142153862

这里最初的 node-4 不幸被折腾挂了,所以上面用到的是后面新增的 node-5

OpenStack on Baremetal Docker

最底层的 openstack 是搭建在一台服务器上的 All-In-One 环境,使用 Kolla 作为部署工具。

Kolla 使用容器来部署 OpenStack,所以可以通过 docker ps 查看服务:

image-20200609143027326

OpenStack vs Kubernetes

一直以来 OpenStack 作为 IaaS 层,用来管理底层计算资源,而 Kubernetes 则被视作 PaaS 层,来管理应用和容器。并且 Kubernetes 本身有 Cloud Provider 的概念,通过云计算平台提供诸如持久卷、负载均衡等资源。所以在通常的架构图中,OpenStack 都是处在 Kubernetes 的下层。

事实上,OpenStack 系统本身就是一个微服务的架构,使用容器化部署,进而使用 Kubernetes 来管理已经是大势所趋。通过 Kubernetes 强大的容器编排能力,长久以来被诟病的 OpenStack 的部署难,升级难等问题可以得到有效解决;同时可以无缝引入云原生时代强大工具集,例如 Prometheus,ELK 等。

OpenStack 的底层网络/存储资源管理能力则是 Kubernetes 在私有云场景下的不二选择,虚机和裸金属,不仅是云平台不可或缺的功能,也让 Kubernetes 集群的部署和隔离变得轻松,让用户自助创建和管理集群变得简单。

Davy
Davy
学习📚 技术👨‍💻 投资📈

一些心得体会,希望能对你有所帮助🚀。