Kubernetes是设计用来实施私有容器云的,然而容器作为公有云,同样需要一个管理平台,在Swarm,Mesos,Kubernetes中,基于Kubernetes已经逐渐成为容器编排的最热最主流的平台,网易基于Kubernetes实现了自己的容器公有云,在这个过程中,需要对Kubernetes进行一定的改进与优化。

架构如下:

网易开发了自己的一个容器服务平台,将OpenStack的IaaS层和Kubernetes容器层深度融合起来,从而实现一个完整的公有云体系。从图中可以看出,容器服务平台会调度OpenStack的计算服务Nova来创建KVM虚拟机,然后调用Cinder进行云盘的创建于挂载,调用Neturon进行网络的创建与连接,然后调用Kubernetes进行容器创建,还可以调用NLB挂载负载均衡器。

一、OpenStack架构很复杂

在容器平台之前,网易的IaaS层采用的是OpenStack架构。大家都说OpenStack太复杂了,如下图是OpenStack的一个架构图。

OpenStack主要包括以下的模块:

  • 安全认证模块keystone

  • 计算虚拟化模块Nova

  • 存储虚拟化模块Cinder

  • 网络虚拟化模块Neutron

  • 镜像管理模块Glance

  • 对象存储模块Swift

其中每一个模块都包含很多的子模块,大部分包括api模块,调度模块,以及具体干活的模块。

二、OpenStack创建虚拟机的流程很复杂

OpenStack创建一个虚拟机的流程非常复杂,这里简单概括一下其中的要点。

第一:AAA,也即我们常说的Authentication,Authorization,Account。

所谓的Authentication认证,就是验证我是不是我,Authorization鉴权就是审核,虽然我是我,但是我都没有这个权利做这个事情。

Authentication一般有两种方式,一个是对称加密的方式,也即用一个Token,客户端和服务端都用这个Token进行加密和解密,一个是非对称加密的方式,也即使用PKI,使用certificate的方式。

AWS也是有这两种方式。

另外Authorization,则常用的是Role based access control。

有用户,角色,租户的概念。

例如AWS里面有

第二: nova-api接受请求

在这里可以干两件事情,rate limit,调用我不能太频繁,quota,控制每个租户最多能够创建多少资源。

第三:nova-scheduler进行调度

调度分两个过程,一个是Filtering,先将不符合要求的主机过滤掉,一个是weighting,剩下的根据主机的使用情况进行打分排名,选择一台机器。

第四:nova-compute真正干活的人接收到请求,调用libvirt创建虚拟机

第五:libvirt是真正的创建虚拟机的工具,先要下载虚拟机镜像

第六:libvirt开始定义KVM的启动参数

第七:libvirt开始给KVM创建网络设备

第八:libvirt启动KVM,这里一般会用到Cgroup对KVM的资源使用进行控制

第九:调用Cinder为虚拟机创建存储,后端一般用Ceph

想了解Kubernetes的人是不是看到这里已经烦了,不是讲kubernetes么?怎么讲了这么多OpenStack?

那就再来看张图,这个是aws创建虚拟机的知识图谱,是不是很多类似的概念?

很多学技术的发现技术发展实在太快,从虚拟化,到OpenStack,到Docker,到Kubernetes等,怎么学的过来,其实深入了解会发现,基础的技术非常像,包括接下来解析的Kubernetes。

三、Kubernetes的架构相对简单

很多人喜欢Docker,以及Docker平台,就在于Docker非常简单,没有OpenStack这么复杂的概念,很容易就能启动一个nginx的demo。

而作为容器管理平台,Kubernetes的架构也是比较简单的。

客户请求进来的时候,先进入api层,相当于nova-api,首先先要进行认证和鉴权(Authentication和Authorization),相当于keystone做的事情。

然后创建的对象会保存在etcd里面,如果是OpenStack则在数据库里面。

接着进行Scheduler,将对象调度到一台机器,相当于nova-scheduler要干的事情。

然后每台机器上的kubelet是真正干活的,发现自己被调度到了,需要在自己的机器上创建容器,相当于nova-compute。

kubelet创建容器的时候,先要下载容器镜像,nova-compute也要下载虚拟机的镜像。

nova-compute要调用docker的接口创建容器,相当于nova-compute调用的libvirt创建KVM,docker真正的隔离使用的是cgroup,KVM也要用cgroup,docker还用到了namespace,KVM的网络配置也会用到namespace。

docker创建好了,需要给docker配置网络,配置存储,libvirt也干了这些事情。

四、kubernetes创建pod和service的过程

  • 客户端调用api接口创建pod。

  • api-server将pod创建一个对象,保存在etcd里面。

  • scheduler不断通过api-server查看哪些pod需要调度,然后进行调度,将调度结果返回给api-server

  • api-server将scheduler的调度结果写入etcd中。

  • kubelet不断查看有没有能够调度到自己机器上的pod,有的话调用docker的接口创建容器。

  • 客户端调用api接口创建服务。

  • api-server创建service对象写入etcd。

  • controller不断扫描service对应的pod。

  • controller调用api-server创建对应的访问端点endpoint。

  • api-server将endpoint对象写入etcd。

  • proxy不断发现有没有可以放在自己上面的转发规则,如果有则创建socket监听端口,并且创建相应的iptables规则。

五、kubernetes没有什么?

Kubernetes看起来比OpenStack简单很多,其实缺少了很多的功能。

  • 没有完善租户管理模块,租户隔离性不好,是否需要一个类似keystone的服务?

  • 是不是需要镜像的管理,难道不需要一个类似glance的服务?

  • 镜像存储在哪里,是否需要一个对象存储的服务,类似swift?

  • kubernetes本身不管网络,需要通过插件进行,网络和SDN谁来管理?

  • kubernetes本身不管存储,需要通过插件进行,大部分的存储方案还是通过Ceph搞定。

然而,如果要做一个公有云,至少要搞定上面的部分,如果把这些都加上去,相当于基于kubernetes重造一个OpenStack了,为什么要重复造轮子呢?所以我们选择OpenStack和kubernetes深入融合的解决方案。

今天飞机晚点了,本来一天一篇的,应该昨天写完的只好凌晨完成。

接下来会解析OpenStack和kubernetes融合的方案。

其实作为公有云还有更多的问题:

  • 网络二次虚拟化的问题

  • 公网和浮动IP的问题

  • 一个Kubernetes集群还是多个Kubernetes集群?

  • Kubernetes集群如果做到很大规模?

  • 等等等等

也会在接下来这个系列的文章中详细阐述

支撑大规模公有云的Kubernetes改进与优化 (1)的更多相关文章

  1. 支撑大规模公有云的Kubernetes改进与优化 (3)

    这一篇我们来讲网易为支撑大规模公有云对于Kubernetes的定制化. 一.总体架构 网易的Kubernetes集群是基于网易云IaaS平台OpenStack上面进行部署的,在外面封装了一个容器平台的 ...

  2. 支撑大规模公有云的Kubernetes改进与优化 (2)

    接下来我们按照kubernetes创建容器的详细过程,以及可能存在的问题. 一.API Server的认证,鉴权,Quota 当客户需要创建一个pod的时候,需要先请求API Server. Kube ...

  3. Azure China (1) Azure公有云落地中国

    <Windows Azure Platform 系列文章目录> 微软公有云Microsoft Azure已经落地中国,官方网址:http://www.windowsazure.cn/. 在 ...

  4. 微软公有云事件中心(Azure Event Hubs)在开放物联网大会(OIOT)啼声初试

     发布于 2014-12-29 作者 刘 天栋 2014年12月18日,InfoQ在京召开开放物联网大会(Open IOT Conference),微软开放技术(中国)资深项目经理陈岭在大会中针对 ...

  5. Windows Azure公有云服务相关方案

    http://www.cnblogs.com/sennly/p/4139675.html 1.公有云平台服务简介 Windows Azure 是一个灵活而开放的云平台,通过该平台,您可以在数据中心快速 ...

  6. 在Windows Azure公有云环境部署企业应用

    作者 王枫 发布于 2014年4月5日 企业内部应用转换为在线服务 Windows Azure已经成为众多IT服务提供商们热议的话题,其中,有的认为只有提供互连网用户服务的应用才适合放在公有云环境内运 ...

  7. [转帖]中国公有云2018H1市场占有率

    IDC:阿里云中国第一 市场份额为2到9名总和   https://news.cnblogs.com/n/617838/ 1 月 21 日,市场研究机构 IDC 日前公布 2018 年上半年中国公有云 ...

  8. 微软智能云Azure – 中国首家官方支持CoreOS的公有云

    北京2016年6月24日, 在由中国开源软件推进联盟(COPU)主办, 开源社协办,微软赞助的“第十一届开源中国开源世界高峰论坛”上,微软亚太研发集团云计算高级总监梁戈碧女士正式对外宣布一个令人振奋的 ...

  9. 当公有云Azure拥抱Docker容器技术

    本文转载至 http://3387405.blog.51cto.com/3377405/1598977 预见未来看似是一件不太可能的事情,然而现在企业科技高速发展的态势完全超乎想象. 就在几周前Inf ...

随机推荐

  1. 20155310 2016-2017-2 《Java程序设计》第六周学习总结

    20155310 2016-2017-2 <Java程序设计>第六周学习总结 教材学习内容总结 4.1 Y86指令集体系结构 •有8个程序寄存器:%eax.%ecx.%edx.%ebx.% ...

  2. 回顾一些较简单的dp题

    1.导弹拦截  (+贪心) 两问:一个导弹拦截系统最多能拦多少导弹 要拦截所有导弹至少需要多少拦截系统 第一问感觉是一个比较巧妙的方法: 维护一个单调递减的序列 length[] 记录的是拦截导弹的高 ...

  3. Android笔记之广播

    为了容易理解,可以将广播代入到事件模型中,发送广播消息看做是触发event,BroadcastReceiver是处理事件的回调逻辑. 广播这种模型中涉及到两个角色,就是广播的发送者和接收者,所以会涉及 ...

  4. C++ Primer 5th 第17章 标准库特殊设施

    C++新标准库提供了很多新功能,它们更加强大和易用. tuple类型 tuple是一种类似pair的模板,pair可以用来保存一对逻辑上有关联的元素对.但与pair不同的是,pair只能存储两个成员, ...

  5. weblogica domain目录 环境变量 如何启动weblogic server

    手工启动weblogic server

  6. 为什么使用do{}while(0)来进行宏定义

    最近发现很多代码在进行宏定义的时候使用喜欢使用 #define MACRO_NAME(para) do{macro content}while(0) 的格式,总结了以下几个原因:   1,空的宏定义避 ...

  7. mysql测试工具 -> mysqlslap

    一.简介 mysqlslap是mysql自带的基准测试工具 优点:查询数据,语法简单,灵活容易使用.该工具可以模拟多个客户端同时并发的向服务器发出查询更新,给出了性能测试数据而且提供了多种引擎的性能比 ...

  8. EPC摘抄

    S6a MME – HSS 完成用户位置信息的交换和用户签约信息的管理,传送控制面信息 Diameter MME:主要负责信令处理及移动性管理,功能包括:NAS信令及其安全:跟踪区域(Tracking ...

  9. InnoDB锁问题

    InnoDB锁问题 InnoDB与MyISAM的最大不同有两点:一是支持事务(TRANSACTION):二是采用了行级锁.行级锁与表级锁本来就有许多不同之处,另外,事务的引入也带来了一些新问题.下面我 ...

  10. bootstrap File Input 多文件上传插件使用记录(二)删除原文件

    在上一篇文章中,主要介绍了file input插件的初始化和多文件同步上传到服务器的相关配置等.这篇主要介绍file input插件的编辑等. 使用场景: 在后台管理框架中,一条数据中包含不固定的多张 ...