去年换工做后,开始真正在生产环境中接触容器与Kubernetes。边恶补相关知识的同时,也想把学到的内容和本身的理解整理出来。学习的途径包括k8s官方文档、书籍、极客时间专栏及网上各类博文。所涉及一些摘抄或描述,大多用本身的理解来组织语言,也就不一一注明出处了。
Kubernetes(简称K8S)与容器技术,能够说是近几年最火热的技术之一。提起K8S,你们都知道是google开源的容器编排工具。今天想先谈谈,我理解的容器、K8S是什么,以及为何它们能火起来。node
既然说K8S是一个容器编排的工具,那么要搞清楚K8S是什么,首先得搞清楚,容器是什么,以及为何要用容器技术。linux
形象的来讲,一个linux容器,实际就是一个进程,仍是个被系统欺骗的进程。为何这么说呢?一个运行在容器里的进程,主要有如下特色:nginx
这几个欺骗进程的技术,就是是容器技术的三板斧,用于资源隔离的namespace,用于资源限制的cgroup,以及用于假装进程根目录的rootfs。这三种技术,都是是早已存在于linux中的,只是docker公司比较创新的把这三种技术整合在一块儿,而且,提出了容器镜像及镜像仓库等概念,把这个进程及相关的依赖环境都一块儿打包成可分发及重复使用的镜像文件,方便容器能在不一样机器之间移植。这样,在任何地方,只要能运行docker,就能把容器镜像跑成一个包含这应用进程及相关依赖环境的容器实例。web
这里用利用K8S官方文档的图,简单说下生产中的场景,看看容器技术能解决什么问题。docker
左图是传统的物理机部署应用方式的方式,能够看到除了一个应用的运行,除了程序自己,离不开应用配置、库、等等依赖环境。一般状况下,一个应用的上线,要经历开发环境、pre环境、beta环境、灰度测试、生产环境等等不一样的基础环境。开发的同窗在开发环境跑通了代码,到其余环境运行时,因为各环境依赖、配置、安全需求不一样,可能会出现各类问题。运维的同窗忙着在不一样的环境中统一依赖。不一样应用各类语言,各类应用的特殊依赖需求,也形成了CI/CD逻辑复杂,难以统一。数据库
右图是用了容器技术以后的场景。一个容器镜像的实质就是程序进程加全部运行时环境及配置、依赖的集合。只要各个环境的底层能兼容docker,就能实现全部环境部署的一致性。开发同窗不用关心生产环境和开发环境的差别可能会致使应用运行问题,运维同窗部署一个应用,只要确保容器镜像能正常运行就好。CI/CD的自动化也相对容易实现不少。从而极大增长开发效率、应用迭代效率及节省了运维工做量。api
说到这里,不得不说下容器与传统意义的虚拟机间的对比。其实两者均可以理解为虚拟化,它们最本质的区别是,容器是操做系统层级的虚拟化,而虚拟机是硬件层级的虚拟化。参看下图。
因为虚拟机多了一层Guest OS,须要宿主机额外的性能开销进行硬件虚拟化,同时由于是完整的操做系统,虚拟机镜像通常动辄大几G,很难在各环境间快速传播,hypervisor层相对Docker Engine也比较重。再看docker容器,实质就是宿主机上跑的一个进程,只不过经过docker与其余进程隔离开来。简单的说,敏捷和高效,是容器相比虚拟机最大的优点,固然也有劣势,因为容器只是操做系统级别的隔离,不一样容器间隔离的不够完全。缓存
简单说完了docker的理解,那么Kubernetes又是什么,它解决了哪些问题呢,为啥如今提容器技术必提k8s呢。这里再谈谈我理解的Why K8S。安全
回到实际的场景来,假如你已经开始用docker镜像来打包应用,能够方便的进行分发和部署,不用去考虑不一样环境的差别。可是不是还感受还少了点什么?服务器
由于正常的实际业务系统,不是应用能部署,能运行起来就完事了,还要考虑应用容器的访问、水平伸缩、监控、安全、备份、容灾等等因素。而对于一个完整的业务系统来讲,也不是单个应用就能搞定的,还要考虑的是各应用间的关系,及应用运行的形态。好比一个web业务,可能须要web服务器、缓存系统、数据库等多个应用。容器化部署后,它们可能部署在不一样宿主机的不一样容器中,相互间的访问要怎么实现,这就涉及到容器间访问关系的处理。再好比,有个优化缓存的应用也跑在容器里,只须要按期运行容器实例执行优化任务,执行完毕就终止容器,这就须要处理不一样容器应用的运行形态问题。相似上述这些对容器应用及容器间关系进行管理,就是所谓的容器编排及调度。而Kubernetes,就是目前的容器编排的平台的事实标准了。
那么,具体来讲,K8S到底能作哪些事呢。
在官方文档中,对K8S功能的描述以下
Kubernetes 知足了生产中运行应用程序的许多常见的需求,例如:
Pod提供了一种复合的应用容器模型,
挂载外部存储,
Secret管理,
应用健康检查,
副本应用实例,
横向自动扩缩容,
服务发现,
负载均衡,
滚动更新,
资源监测,
日志采集和存储,
支持自检和调试,
认证和鉴权.
从这些功能介绍能够看出,K8S已很相似一个云平台了,能够彻底能知足生产级别的容器应用管理需求。下面是一张最简单的K8S系统示意图:
K8S集群由一个主节点(master节点)及多个工做节点(node节点)构成,开发者提交应用容器镜像,并将镜像运行的数量、方法等经过描述文件提交给K8S master节点,K8S master节点或根据集群总体状况,将应用按照需求部署在工做节点中。对于开发者来讲,利用K8S能够方便的部署程序,不用关心基础设施,而对于运维人员来讲,工做重心从维护具体应用,转变为维护K8S集群。并且,不论是开发者仍是运维人员,都不用关心应用具体部署在哪一个节点,K8S会自动判断搞定一切。相比于传统的应用部署方式,有没有以为K8S很棒棒?
在容器编排这个概念出现的时候,Kubernetes并非惟一的一个容器编排工具,主流的工具还有Docker公司原生的swarm和Apache基金会的mesos,为何K8S能笑到最后,成为容器编排的事实标准呢?我理解K8S对比它们有两个最大不一样点:(这里不对swarm和mesos作详细介绍了,实际也确实没怎么玩过)
咱们再来看看,使用了pod这个概念之后,有什么变化。一个pod里面同时起了web服务进程和大数据agent两个容器实例,首先,pod里的容器实例是共享存储和网络namespace的,也就是说,这两进程的存储数据是直接共享的,不须要额外的挂载动做。其次,这个pod是做为一个总体被k8s管理着的,k8s会监控pod里每一个容器的状态,并根据策略在有问题时进行自动干预。从这个意义上说,pod才更相似传统的虚拟机。
最后,总结一下:
Why Dokcer: 用容器技术跑应用,相比原来的物理机及虚拟机更高效、轻量、省资源,同时大大方便了不一样环境下的应用部署及分发。
Why Kubernetes:生产集群光跑容器还不够,还要对容器应用做为一个业务系统集群进行编排及管理,而K8S的一些优点使得它成为目前容器集群编排管理工具的事实标准。
最后的最后再多提一点,实际上,容器技术不止Docker公司一家在作,Kubernetes也不是只能管理Docker容器。只是,不管从市场份额、应用性仍是开发社区的热度来讲,它们都是目前容器技术最主流的解决方案,就生产环境来讲,目前基本没有必要去考虑其余的容器技术了。