OpenStack 和 Kubernetes 融合部署实践
OpenStack on Kubernetes on OpenStack
最近花了一点时间尝试在 Kubernetes 上部署 OpenStack,受限于环境,踩了不少坑,好在最终效果还不错。
以下简单展示下整个环境的概况:
VM in OpenStack
用 cirros 镜像创建了一个虚机:
网络也正常:
这个实例在 Dashboard 中看上去是这样的:
细心的你可能已经发现这里的端口号不是默认的 80,而是比较奇怪的 32557,这是因为这个 openstack 环境是搭建在 Kubernetes 集群上的。
OpenStack on Kubernetes
在页面上查看 openstack 的系统信息:
各个服务的 endpoints URL 都是以 *.openstack.svc.cluster.local
域名的形式,熟悉 Kubernetes 的应该看上去有点眼熟。
其中的 Public 接口是通过 Ingress
暴露的:
更多的内部接口则可以在 service
中看到:
注意 horizon-int 对应的就是 Dashboard 服务,它的类型是 NodePort 而且映射的端口号是 32557
当然除了 service
还有其它资源,例如用来支持虚拟化的 DaemonSet
:
带状态的数据库和消息队列,以 StatefulSet
的形式:
还有部署过程中的各种以 job
方式执行的任务:
所有这些 pod
构成了这个 openstack 环境:
Ceph as Storage
当然还要用到持久化的卷存储,即 PersistentVolumeClaim
和 PersistentVolume
:
它们由 ceph
提供,同样部署在当前集群中 :
Kubernetes on OpenStack
这个 Kubernetes 集群有 4 个节点,1 个 master 节点,3 个 worker 节点:
因为机器有限,没有那么多的物理节点可供实验,所以这个集群是搭建在另一个 openstack 环境之上的:
部署过程中遇到的一个大坑就在此,由于 OpenStack 虚机网络的 MTU 默认 1500 太小,导致了部署 MySQL 集群时一直同步不成功
在 openstack 中部署 Kubernetes 的方案很多,在尝试了其中的一些(包括 magnum)之后,最终使用基于 Ansible 的 Kubespray 部署,完成这样一套集群大概需要 20 分钟:
这里最初的 node-4 不幸被折腾挂了,所以上面用到的是后面新增的 node-5
OpenStack on Baremetal Docker
最底层的 openstack 是搭建在一台服务器上的 All-In-One 环境,使用 Kolla 作为部署工具。
Kolla 使用容器来部署 OpenStack,所以可以通过 docker ps
查看服务:
OpenStack vs Kubernetes
一直以来 OpenStack 作为 IaaS 层,用来管理底层计算资源,而 Kubernetes 则被视作 PaaS 层,来管理应用和容器。并且 Kubernetes 本身有 Cloud Provider 的概念,通过云计算平台提供诸如持久卷、负载均衡等资源。所以在通常的架构图中,OpenStack 都是处在 Kubernetes 的下层。
事实上,OpenStack 系统本身就是一个微服务的架构,使用容器化部署,进而使用 Kubernetes 来管理已经是大势所趋。通过 Kubernetes 强大的容器编排能力,长久以来被诟病的 OpenStack 的部署难,升级难等问题可以得到有效解决;同时可以无缝引入云原生时代强大工具集,例如 Prometheus,ELK 等。
OpenStack 的底层网络/存储资源管理能力则是 Kubernetes 在私有云场景下的不二选择,虚机和裸金属,不仅是云平台不可或缺的功能,也让 Kubernetes 集群的部署和隔离变得轻松,让用户自助创建和管理集群变得简单。