在 Kubernetes 上部署 OpenStack 是什么体验
红蓝出 CP,OpenStack 和 Kubernetes 在一起会怎样?
背景
从去年开始就想深入地学习 Kubernetes,首先想到是在 OpenStack 上能比较轻松地玩转,所以去 尝试了 Magnum ,但是结果令人失望。
不过随着我搜索到更多的内容,发现一个有趣的事情:
那就是相较于在 OpenStack 之上部署 Kubernetes,通过 Kubernetes 去部署 OpenStack 似乎更流行。
特别当我去研究最近比较热门的边缘计算,发现 OpenStack 社区的两个相关项目,一个是 StarlingX,一个是 Airship,它们都是这样做的:先搭建 Kubernetes 集群,然后通过 OpenStack-Helm 部署容器化的 OpenStack。
但是这两个项目都还挺复杂,直接去部署它们遇到了不少坑,做了很多的前置操作,涉及到很多脚本代码,结果到搭建 K8s 步骤上还是卡住了。
于是我决定暂时先不管它们,直接跳到 OpenStack-Helm,至少让我先体验一下基于 Kubernetes 的 OpenStack 到底是啥样。
这样就又回到了起点:我得先有一套 Kubernetes 多节点集群,但是现在只有一套 OpenStack 环境,所以我仍然得先解决在 OpenStack 上搭建 Kubernetes 的问题。
经过了一番摸索,踩了不少坑,最后终于完成了这次尝试。
下面简单地分享下最终的效果,其中的过程涉及较多,后续再择机分享。
整个环境概况

最上层:一个普通的 OpenStack 环境
在上面的 OpenStack 中用 cirros 镜像创建了一个虚机:

细心的你可能已经发现这里的端口号不是默认的 80,而是比较奇怪的 32557,这是因为这个 openstack 环境是搭建在 Kubernetes 集群上,而且通过 NodePort 暴露的服务。
在页面上查看 openstack 的系统信息:

各个服务的 endpoints URL 都是以 *.openstack.svc.cluster.local 域名的形式,熟悉 Kubernetes 的应该看上去有点眼熟。
OpenStack 在 Kubernetes 中的细节
下面详细地看看 OpenStack 在集群中是怎么一回事:
Helm
全部使用 Helm 部署:

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

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

注意 horizon-int 对应的就是 Dashboard 服务,它的类型是 NodePort 而且映射的端口号是 32557
DaemonSet
各种 agent 包括计算节点、OVS、Libvirt 等,都是通过 DaemonSet :

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

Job
还有部署过程中的各种任务,包括初始化数据库,注册 endpoint 等,都是以 job 方式执行的:

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

PV 和 PVC
当然还要用到持久化的卷存储,即 PersistentVolumeClaim 和 PersistentVolume :

Ceph
持久化存储由 ceph 提供,它们同样部署在当前集群中 :

中间层:Kubernetes on OpenStack
这个 Kubernetes 集群有 4 个节点,1 个 master 节点,3 个 worker 节点:

4 个节点都是底层 OpenStack 环境提供的虚机:

在 openstack 中部署 Kubernetes 的方案很多,在尝试了其中的一些(包括 magnum)之后,最终使用基于 Ansible 的 Kubespray 部署。为了简化操作,这套 Kubernetes 集群也并没有对接底层的 OpenStack。
手动创建了虚机之后,完成这样一套集群大概需要 20 分钟:

这里最初的 node-4 不幸被折腾挂了,所以上面显示的是后面新增的 node-5
最下层:基于 Kolla 的 OpenStack
最底层的 openstack 是搭建在一台物理服务器上的 All-In-One 环境,使用 Kolla 作为部署工具。
Kolla 使用容器来部署 OpenStack,所以可以通过 docker ps 查看服务:

总结和思考
OpenStack 和 Kubernetes 的关系

一直以来 OpenStack 作为 IaaS 层,用来管理底层计算资源,而 Kubernetes 则被视作 PaaS 层,来管理应用和容器。在通常的架构图中,OpenStack 都是处在 Kubernetes 的下层,作为云计算平台提供诸如持久卷、负载均衡等资源。
事实上,OpenStack 系统本身就是一个微服务的架构,使用容器化部署,进而使用 Kubernetes 来管理已经是大势所趋。通过 Kubernetes 强大的容器编排能力,长久以来被诟病的 OpenStack 的部署难,升级难等问题可以得到有效解决。 在这次测试中,当中途遇到错误时,处理方式非常「简单粗暴」,直接删掉重来。管理面要求高可用?直接改 replicas 就行。Kubernetes 和 Helm 的强大功能令人印象深刻。
同时现在可以无缝引入云原生社区强大生态,例如 Prometheus,ELK 等,想用的话基本就是一键部署和接入。
由于 Kubernetes 基于云的设计,在私有云场景下,OpenStack 仍然是 Cloud Provider 的不二选择。不仅可以提供可用于部署集群的 Node 实例(虚机或裸金属),也能补充底层网络/存储资源的管理能力。
关于实际应用的思考
因为环境所限,这里最上层 OpenStack 已经是二次虚拟化了,显然没有实用价值,实际应用中需要有所变化。
我能想到的可行方案:
以虚拟机为主要工作负载的,容器作为补充的,可以考虑保留下面两层,通过 OpenStack 提供基于虚机的 Kubernetes 集群和容器服务。 以容器为主要工作负载的,可以考虑仅使用上面两层,在裸机上部署 Kubernetes。这样部署在上层的 OpenStack 就是一个用来供给虚机的服务,本质和部署一个网站没啥区别。 结合我们前面介绍的裸金属技术,保留所有三层,底层的 OpenStack 只负责提供裸金属实例,这样上面两层的作用和上一个方案类似。
当然,显而易见的,这样一套架构最大的问题就是太过于复杂。同时引入两套技术栈,对团队的要求较高。如果非要二选一,大多数的小公司会作何选择不言而喻。
你对 Kubernetes 和 OpenStack 之间关系有何想法,欢迎在评论区讨论。
感谢你的阅读,请继续关注「云计算实验室」
本文使用 mdnice 排版
在 Kubernetes 上部署 OpenStack 是什么体验的更多相关文章
- (转)Centos7上部署openstack ocata配置详解
原文:http://www.cnblogs.com/yaohong/p/7601470.html 随笔-124 文章-2 评论-82 Centos7上部署openstack ocata配置详解 ...
- 阿里云上安装 OpenStack 是什么体验
阿里云上跑火车(安装 OpenStack Train 版本),猜猜最终花了多少钱? 前言 前面给大家提供了用虚拟机安装 OpenStack 的镜像,虽然已经很简便了,但还是略显笨重.一来镜像文件比较大 ...
- 在CentOS7上部署OpenStack 步骤详解
OpenStack作为一个由NASA(美国国家航空航天局)和Rackspace合作研发并发起的,开放源代码项目的云计算管理平台项目.具体知识我会在后面文章中做出介绍,本章主要按步骤给大家演示在Cent ...
- 在Kubernetes上部署应用时我们常忽略的几件事
根据我的经验,大多数人(使用Helm或手动yaml)将应用程序部署到Kubernetes上,然后认为他们就可以一直稳定运行. 然而并非如此,实际使用过程还是遇到了一些"陷阱",我希 ...
- 在Kubernetes上部署k6的详细步骤
k6介绍 k6是一款使用go语言编写的开源测试工具,支持用户编写测试脚本,解决了JMeter不易代码化的缺点.它的主要特点有 提供了友好的 CLI 工具 使用 JavaScript 代码编写测试用例 ...
- 在Service Fabric上部署Java应用,体验一把微服务的自动切换
虽然Service Fabric的Java支持版本还没有正式发布,但是Service Fabric本身的服务管理.部署.升级等功能是非常好用的,那么Java的开发者可以如何利用上Service Fab ...
- Centos7上部署openstack mitaka配置详解(将疑难点都进行划分)
在配置openstack项目时很多人认为到处是坑,特别是新手,一旦进坑没有人指导,身体将会感觉一次次被掏空,作为菜鸟的我也感同身受,因为已经被掏空n次了. 以下也是我将整个openstack配置过程进 ...
- Centos7上部署openstack ocata配置详解
之前写过一篇<openstack mitaka 配置详解>然而最近使用发现阿里不再提供m版本的源,所以最近又开始学习ocata版本,并进行总结,写下如下文档 OpenStack ocata ...
- mono上部署web程序初体验
早就想体验一下mono,但一直琐事缠身.难得有时间,便在网上一通狂搜mono相关的资料. 如果想使用Apache服务器,只能使用mod_mono的方式,这里有详细的介绍.这种方式有点繁琐,需要安装一大 ...
随机推荐
- muduo源码解析8-date类
date class date:copyable { }: 作用: 此类作用主要是实现年月日和julianDay的互相转换内部最重要的一个数据成员m_julianDayNumber在mymuduo:: ...
- Java面试题(Java基础篇)
Java 基础 1.JDK 和 JRE 有什么区别? JDK:Java Development Kit 的简称,java 开发工具包,提供了 java 的开发环境和运行环境. JRE:Java Run ...
- Cortex-M4的快速memcpy,根据数据对齐情况自动优化,速度为普通memcpy的1.3到5.2倍
代码:https://github.com/gamesun/memcpy_fast memcpy_fast与memcpy速度比较 测试方法 memcpy_fast(dest + a, src + b, ...
- tomcat服务器java.lang.OutOfMemoryError: PermGen space
一挂就报内存溢出 下面是TOMCAT日志 JAVA程序是没有报错, Nov 24, 2009 4:07:02 PM org.apache.catalina.core.ApplicationDispat ...
- ZooKeeper的十二连问,你顶得了嘛?
前言 一线大厂ZooKeeper的十二连问,你顶得了嘛? 本文已经收录到github ❝ https://github.com/whx123/JavaHome ❞ 1. 面试官:工作中使用过Zooke ...
- 利用Python爬虫刷新某网站访问量
前言:前一段时间看到有博友写了爬虫去刷新博客访问量一篇文章,当时还觉得蛮有意思的,就保存了一下,但是当我昨天准备复现的时候居然发现文章404了.所以本篇文章仅供学习交流,严禁用于商业用途 很多人学习p ...
- Linux 基础指令2
管道符| 先执行第一个命令后执行第二个 eg:查看文件中间几行: head -n1 文件名| tail -n2 :先查看文件前n1行,然后在n1行中的后n2行 tail -n1 文件名| head - ...
- CentOS yum 安装时错误 Errno 14 Couldn't resolve host 解决办法
在虚拟机上安装完CentOS6.5之后,首次使用时yum命令安装软件时,出现一堆的” Errno 14 Couldn't resolve host”这个问题. 上网上查了半天,很多都说在/etc/re ...
- css动画 loading
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- golang 内置print/println、fmt、log的区别
fmt.Println与fmt.Print区别 换行区别不用多说,另外一个区别在于fmt.Print只有在参数间都不是字符串时才会产生间隔 fmt与log的重要区别 fmt没有做同步处理 fmt标准输 ...