一、Kubernetes是什么
Kubernetes是容器集群管理系统,是一个开源的平台,可以实现容器集群的自动化部署、自动扩缩容、维护等功能。Kubernetes是谷歌开源的容器管理集群管理系统,是Google多年大规模容器管理技术Borg的开源版本。
它可以在物理或虚拟机的Kubernetes集群上运行容器化应用,Kubernetes能提供一个以“容器为中心的基础架构”,满足在生产环境中运行应用的一些常见需求,如:
-
多个进程(作为容器运行)协同工作。(Pod)
-
存储系统挂载
-
Distributing secrets
-
应用健康检测
-
应用实例的复制
-
Pod自动伸缩/扩展
-
Naming and discovering
-
负载均衡
-
滚动更新
-
资源监控
-
日志访问
-
调试应用程序
-
提供认证和授权
Kuberbetes发展非常迅速,已经成为容器编排领域的领导者。通过Kubernetes你可以快速部署应用、快速扩展应用、无缝对接新的应用功能、节省资源、优化硬件的使用。
二、Kubernetes不是什么?
Kubernetes并不是传统的PaaS(平台即服务)系统。
-
Kubernetes不限制支持应用的类型,不限制应用框架。不限制受支持的语言runtimes (例如, Java, Python, Ruby),满足12-factor applications 。不区分 “apps” 或者“services”。Kubernetes支持不同负载应用,包括有状态、无状态、数据处理类型的应用。只要这个应用可以在容器里运行,那么就能很好的运行在Kubernetes上。
-
Kubernetes不提供中间件(如message buses)、数据处理框架(如Spark)、数据库(如Mysql)或者集群存储系统(如Ceph)作为内置服务。但这些应用都可以运行在Kubernetes上面。
-
Kubernetes不部署源码不编译应用。持续集成的 (CI)工作流方面,不同的用户有不同的需求和偏好的区域,因此,我们提供分层的 CI工作流,但并不定义它应该如何工作。
-
Kubernetes允许用户选择自己的日志、监控和报警系统。
-
Kubernetes不提供或授权一个全面的应用程序配置 语言/系统(例如,jsonnet)。
-
Kubernetes不提供任何机器配置、维护、管理或者自修复系统。
另一方面,大量的Paas系统都可以运行在Kubernetes上,比如Openshift、Deis、Gondor。可以构建自己的Paas平台,与自己选择的CI系统集成。
由于Kubernetes运行在应用级别而不是硬件级,因此提供了普通的Paas平台提供的一些通用功能,比如部署,扩展,负载均衡,日志,监控等。这些默认功能是可选的。
另外,Kubernetes不仅仅是一个“编排系统”;它消除了编排的需要。“编排”的定义是指执行一个预定的工作流:先执行A,再B,然C。相反,Kubernetes由一组独立的可组合控制进程组成。怎么样从A到C并不重要,达到目的就好。当然集中控制也是必不可少,方法更像排舞的过程。这使得系统更加易用、强大、弹性和可扩展。
三、深入浅出地了解Kubernetes
Kubernetes是一个软件系统,它允许你在其上很容易的部署和管理容器化的应用。它依赖于Linux容器的特性来运行异构应用,而且无需知道这些应用的内部详情,也不需要手动将这些应用部署到每台服务器。Kubernetes使你在数以千计的电脑节点上运行软件时,就像所有这些节点是单个运行的节点一样。
上图为一个简单的Kubernetes系统图,整个系统由一个主节点和若干个工作节点组成。开发者把一个应用列表提交到主节点,Kubernetes会将他们部署到集群的工作节点(声明式)。组件被部署在哪个节点对于开发者和系统管理员来说都不关心。
四、 Kubernetes集群架构
一个Kubernetes集群由很多个结点组成,这些结点可以分为主节点和工作节点。其中主节点,承载着Kubernetes控制和管理整个集群系统的控制面板。工作节点运行着用户实际部署的应用。如下图所示:
主结点和工作结点均包含了多个组件,本文先不对各个组件的功能、工作原理等进行展开,在后续文章中再进行详细的介绍。
五、在Kubernetes中运行应用
在Kubernetes进行管理应用的时候,基本步骤是:创建集群,部署应用,发布应用,扩展应用,更新应用。
为了在Kubernetes中运行应用,首先需要将应用打包进一个或多个容器镜像,再将这些镜像推送到镜像仓库,然后将应用的描述发布到Kubernetes API服务器。
应用的描述包括诸如组件的版本、类型、元数据、容器镜像或者包含应用程序组件的容器镜像、这些组件如何相互关联,以及哪些组件需要同时运行在同一个节点上和哪些组件不需要同时运行等信息。此外。该描述还包括哪些组件可以作为内部或者外部客户提供服务且应用通过单个IP地址暴露,并且其他组件可以发现。
描述如何成为一个运行的容器?
如上图所示,当API服务器接收到创建Pod的描述时,会将接受到的描述信息写入到分布式存储etcd中。调度器(Scheduler)监听API服务器,当检测到未绑定Node的Pod时,开始调度并更新Pod的Node绑定。当Node结点的组件Kubelet检测到有新的Pod调度,通过容器(Docker)运行该Pod,并更新到API服务器中。API服务器再到分布式存储etcd中更新该创建Pod的描述信息。
如果不好理解,还可参考下图,应用描述符列出了四个容器,并将它分为三组(Pod)。前两个Pod包含一个容器,最后一个Pod包含两个容器(该Pod内的两个容器需要协作运行,不应该相互隔离)。在每个Pod旁边的数字表示需要并行运行的Pod的副本数量。在向Kubernetes提交了描述符之后,它将每个Pod的指定副本数量调度到可用的工作结点上。节点上的Kubelets将告知Docker从镜像仓库中拉取容器镜像并运行容器。
今天的总结就先到这里啦,上个周末,偷懒休息了两天,见了大学的老朋友还和合肥的同事们聚了餐。需要坚持呀,努力保持一周一总结,不过今天的文章很少有自己的描述,大部分抄的书,见谅!
参考说明:
1.本文结合了书集《Kubernetes 入门指南》、《Kubernetes in Action》
2.部分图片来源于网络,侵删。
搬运自自己的陈年公众号,欢迎关注一起学习呀~
微信搜索:班码文章