Kubernetes简介node
Kubernetes 是一个可移植的、可扩展的开源平台,用于管理容器化的工做负载和服务,可促进声明式配置和自动化。Kubernetes 拥有一个庞大且快速增加的生态系统。Kubernetes 的服务、支持和工具普遍可用。web
名称 Kubernetes 源于希腊语,意为 “舵手” 或 “飞行员”。Google 在 2014 年开源了 Kubernetes 项目。Kubernetes 创建在 Google 在大规模运行生产工做负载方面拥有十几年的经验的基础上,结合了社区中最好的想法和实践。sql
Kubernetes一个核心的特色就是可以自主的管理容器来保证云平台中的容器按照用户的指望状态运行着(好比用户想让apache一直运行,用户不须要关心怎么去作,Kubernetes会自动去监控,而后去重启,新建,总之,让apache一直提供服务),管理员能够加载一个微型服务,让规划器来找到合适的位置,同时,Kubernetes也系统提高工具以及人性化方面,让用户可以方便的部署本身的应用(就像canary deployments)。数据库
如今Kubernetes着重于不间断的服务状态(好比web服务器或者缓存服务器)和原生云平台应用(Nosql),在不久的未来会支持各类生产云平台中的各类服务,例如,分批,工做流,以及传统数据库。apache
在Kubenetes中,全部的容器均在Pod中运行,一个Pod能够承载一个或者多个相关的容器,在后边的案例中,同一个Pod中的容器会部署在同一个物理机器上而且可以共享资源。一个Pod也能够包含O个或者多个磁盘卷组(volumes),这些卷组将会以目录的形式提供给一个容器,或者被全部Pod中的容器共享,对于用户建立的每一个Pod,系统会自动选择那个健康而且有足够容量的机器,而后建立相似容器的容器,当容器建立失败的时候,容器会被node agent自动的重启,这个node agent叫kubelet,可是,若是是Pod失败或者机器,它不会自动的转移而且启动,除非用户定义了 replication controller。后端
用户能够本身建立并管理Pod,Kubernetes将这些操做简化为两个操做:基于相同的Pod配置文件部署多个Pod复制品;建立可替代的Pod当一个Pod挂了或者机器挂了的时候。而Kubernetes API中负责来从新启动,迁移等行为的部分叫作“replication controller”,它根据一个模板生成了一个Pod,而后系统就根据用户的需求建立了许多冗余,这些冗余的Pod组成了一个整个应用,或者服务,或者服务中的一层。一旦一个Pod被建立,系统就会不停的监控Pod的健康状况以及Pod所在主机的健康状况,若是这个Pod由于软件缘由挂掉了或者所在的机器挂掉了,replication controller 会自动在一个健康的机器上建立一个一摸同样的Pod,来维持原来的Pod冗余状态不变,一个应用的多个Pod能够共享一个机器。缓存
咱们常常须要选中一组Pod,例如,咱们要限制一组Pod的某些操做,或者查询某组Pod的状态,做为Kubernetes的基本机制,用户能够给Kubernetes Api中的任何对象贴上一组 key:value的标签,而后,咱们就能够经过标签来选择一组相关的Kubernetes Api 对象,而后去执行一些特定的操做,每一个资源额外拥有一组(不少) keys 和 values,而后外部的工具可使用这些keys和vlues值进行对象的检索,这些Map叫作annotations(注释)。服务器
Kubernetes支持一种特殊的网络模型,Kubernetes建立了一个地址空间,而且不动态的分配端口,它能够容许用户选择任何想使用的端口,为了实现这个功能,它为每一个Pod分配IP地址。网络
现代互联网应用通常都会包含多层服务构成,好比web前台空间与用来存储键值对的内存服务器以及对应的存储服务,为了更好的服务于这样的架构,Kubernetes提供了服务的抽象,并提供了固定的IP地址和DNS名称,而这些与一系列Pod进行动态关联,这些都经过以前提到的标签进行关联,因此咱们能够关联任何咱们想关联的Pod,当一个Pod中的容器访问这个地址的时候,这个请求会被转发到本地代理(kube proxy),每台机器上均有一个本地代理,而后被转发到相应的后端容器。Kubernetes经过一种轮训机制选择相应的后端容器,这些动态的Pod被替换的时候,Kube proxy时刻追踪着,因此,服务的 IP地址(dns名称),历来不变。架构
全部Kubernetes中的资源,好比Pod,都经过一个叫URI的东西来区分,这个URI有一个UID,URI的重要组成部分是:对象的类型(好比pod),对象的名字,对象的命名空间,对于特殊的对象类型,在同一个命名空间内,全部的名字都是不一样的,在对象只提供名称,不提供命名空间的状况下,这种状况是假定是默认的命名空间。UID是时间和空间上的惟一。
在Docker 做为高级容器引擎快速发展的同时,Google也开始将自身在容器技术及集群方面的积累贡献出来。在Google内部,容器技术已经应用了不少年,Borg系统运行管理着成千上万的容器应用,在它的支持下,不管是谷歌搜索、Gmail仍是谷歌地图,能够垂手可得地从庞大的数据中心中获取技术资源来支撑服务运行。
Borg是集群的管理器,在它的系统中,运行着众多集群,而每一个集群可由成千上万的服务器联接组成,Borg每时每刻都在处理来自众多应用程序所提交的成百上千的Job, 对这些Job进行接收、调度、启动、中止、重启和监控。正如Borg论文中所说,Borg提供了3大好处:
1)隐藏资源管理和错误处理,用户仅须要关注应用的开发。
2) 服务高可用、高可靠。
3) 可将负载运行在由成千上万的机器联合而成的集群中。
做为Google的竞争技术优点,Borg理所固然的被视为商业秘密隐藏起来,但当Tiwtter的工程师精心打造出属于本身的Borg系统(Mesos)时, Google也审时度势地推出了来源于自身技术理论的新的开源工具。
2014年6月,谷歌云计算专家埃里克·布鲁尔(Eric Brewer)在旧金山的发布会为这款新的开源工具揭牌,它的名字Kubernetes在希腊语中意思是船长或领航员,这也刚好与它在容器集群管理中的做用吻合,即做为装载了集装箱(Container)的众多货船的指挥者,负担着全局调度和运行监控的职责。
虽然Google推出Kubernetes的目的之一是推广其周边的计算引擎(Google Compute Engine)和谷歌应用引擎(Google App Engine)。但Kubernetes的出现能让更多的互联网企业能够享受到链接众多计算机成为集群资源池的好处。
Kubernetes对计算资源进行了更高层次的抽象,经过将容器进行细致的组合,将最终的应用服务交给用户。Kubernetes在模型创建之初就考虑了容器跨机链接的要求,支持多种网络解决方案,同时在Service层次构建集群范围的SDN网络。其目的是将服务发现和负载均衡放置到容器可达的范围,这种透明的方式便利了各个服务间的通讯,并为微服务架构的实践提供了平台基础。而在Pod层次上,做为Kubernetes可操做的最小对象,其特征更是对微服务架构的原生支持。
Kubernetes项目来源于Borg,能够说是集结了Borg设计思想的精华,而且吸取了Borg系统中的经验和教训。
Kubernetes做为容器集群管理工具,于2015年7月22日迭代到 v 1.0并正式对外公布,这意味着这个开源容器编排系统能够正式在生产环境使用。与此同时,谷歌联合Linux基金会及其余合做伙伴共同成立了CNCF基金会( Cloud Native Computing Foundation),并将Kuberentes 做为首个编入CNCF管理体系的开源项目,助力容器技术生态的发展进步。Kubernetes项目凝结了Google过去十年间在生产环境的经验和教训,从Borg的多任务Alloc资源块到Kubernetes的多副本Pod,从Borg的Cell集群管理,到Kubernetes设计理念中的联邦集群,在Docker等高级引擎带动容器技术兴起和大众化的同时,为容器集群管理提供独了到看法和新思路。