Docker、kubernetes简介
- 引言:
- 1Docker
- 1.1容器技术由来
- 1.2技术理念
- 1.3解决的问题
- 1.4核心技术
- 1.5核心概念
- 1.6DockerVS虚拟机
- 2kubernetes
- 2.1编排技术来由
- 2.2Kubernetes
- 2.3运行机制
- 2.4其他编排技术
- 2.5Kubernetes优势
- 2.6与微服务架构的联系
- 3总结
引言:
容器技术是这两年热门的话题,因为无论是在开发还是运维上,容器技术都给我们带来了很多便捷,节约了不少成本。而如今最热门的开源容器工具就是docker了,Docker和Kubernetes这两个词汇的出现频率也越来越高。那么Docker和Kubernetes之间究竟是什么关系呢?本文来进行介绍。
1Docker
1.1容器技术由来
最早出现的传统应用部署,需要购买一个物理服务器,在服务器上安装一个操作系统,然后安装应用所需的各种依赖环境,最后进行应用部署。这样一来,应用部署起来就会比较慢,成本高但资源利用率低,而且难以扩展和迁移。
随后而来的虚拟化技术,提供了一种运行在物理服务器和操作系统之间的中间软件层,可以虚拟化硬件资源,例如cpu、硬盘、内存资源等。通过这个中间层,可以创建不同的虚拟机,并指定每个虚拟机的物理资源,并且每个虚拟机都是相互分离且独立的。这样一来,就在一定程度上提高了物理资源的利用率,使得一台物理机部署多个应用成为了可能,而且可以稳定运行,但是迁移能力和扩展能力仍然较低。
随着互联网技术的普及和发展,开发测试环境越来越复杂,对扩展和迁移的需求越来越普遍。为了迎合这种飞速的发展,我们倡导敏捷开发,和持续集成部署。针对以上需求和使用场景,虚拟技术就显得没有那么便利和高效。
容器技术的出现,让部署、扩展迁移和资源利用率这一系列问题都得到了更好的解决。而本文要介绍的Docker是目前比较主流的开源容器实现工具。
1.2技术理念
Docker容器的思想来自于集装箱,集装箱解决了什么问题?
在一艘大船上,可以把货物规整的摆放起来。并且各种各样的货物被集装箱标准化了,集装箱和集装箱之间不会互相影响。那么我就不需要专门运送水果的船和专门运送化学品的船了。只要这些货物在集装箱里封装的好好的,那我就可以用一艘大船把他们都运走。docker就是类似的理念。云计算好比大货轮,docker就是集装箱。
1.3解决的问题
1、克服了虚拟机开销过大、启动速度慢的缺点,提高了资源的利用率。
2、解决了开发和部署应用时环境不同的问题。
3、降低了部署测试的复杂度、降低了开发和运维的耦合度。
1.4核心技术
Docker是以Docker容器为资源分割和调度的基本单位,封装整个软件运行时环境,为开发者和系统管理员设计的,用于构建、发布和运行分布式应用的平台。跨平台、可移植并且简单易用的容器解决方案。
既然Docker致力于解决资源利用率和部署环境的问题,那它是如何解决的呢?答案就是隔离。
容器技术通过namespace实现了环境隔离,通过Cgroups实现了资源隔离。他们让每个容器都有独立的空间和资源,做到了进程层面这种细粒度的隔离。所以容器可以复用操作系统,而不再需要独立的操作系统来隔离彼此的资源和环境。节省了操作系统的开销,就节省了一大部分的资源,容器就这样提高了资源的利用率。
下面来具体介绍一下Namespace和Cgroups是怎么实现隔离的:
1、Namespace
是 Linux 为我们提供的用于分离进程树、网络接口、挂载点以及进程间通信等资源的方法。 Docker 其实就通过 Linux 的 Namespaces 对不同的容器实现了隔离。它通过不同参数进行区分,划分成多个命名空间,以解决命名冲突问题,并提供进程、网络、文件系统等环境上的隔离。
2、Cgroups
Linux的一种机制。把系统任务、子任务整合,划分到资源等级不同的组内。为系统资源管理提供了一个统一的框架。可以限制、记录任务组所使用的物理资源。
Cgroups通过控制组的划分,和资源的限制,实现了CPU、内存等资源的隔离。
1.5核心概念
Docker除了更好的解决了资源利用率问题,还解决了部署和迁移的问题。
镜像中存放了环境和用户文件,相当于一个文件系统。而容器可以通过Dockerfile 中存放的一系列命令对镜像进行解析和操作。这样一来,用户可以通过简单的解析操作部署环境,也可以将打包好的镜像上传,再通过下载解析等操作实现迁移。
下面具体介绍几个相关概念:
1、镜像(image):镜像就是**一堆只读层的统一视角。**通俗的说,就像是在铺床,每次操作相当于又铺上一层床单,已经铺好的部分就不能再移动了。这样一来,虽然床是由很多条床单一层一层铺出来的,但是从宏观的角度来看,它就是一张床而已,看不到下面层层床单的结构。而在镜像的概念中,床单就相当于一个个的只读层,宏观角度的床就是文件系统。
2、容器(container):定义与镜像相似,也是一堆层的统一视角,唯一的区别在于容器的最上面一层是可读可写的。可读可写层也就相当于在铺好的床上放了一床被子,而作为这张床的使用者,你可以任意的操作这床被子。
4、Dockerfile:是存储每一层镜像的修改、安装、构建、操作的命令的脚本,它描述了每一层镜像是如何构建的。就相当于在铺床的过程中,用一张纸记录下来每一层的床单都是什么材质的、什么颜色的、铺在第几层、是谁铺上的等等。
1.6DockerVS虚拟机
Docker使用了namespace和Cgroups等技术,而且更好的利用了镜像的特点。那么同是为开发提供便捷的技术,Docker和虚拟机技术又有哪些区别和联系呢?
虚拟机不仅包含了应用,还有必须的二进制文件、库、一个完整的从操作系统,开销相对较大。
容器仅由应用及其依赖组成。它减少了从操作系统这一层级,容器在主操作系统的用户空间上执行一个独立的任务,直接运行于宿主的内核,既使得诸多容器共享Kernel,又保证了应用之间的隔离。
因此,容器技术不仅有虚拟技术的资源分配和隔离的优势,而且更加轻量、易移植和高效。
结构的对比图如下图所示。
Docker使用namespace和Cgroups,使得运行环境和资源隔离开来,能做到进程层面的隔离。每个容器进程之间有隔离的空间,彼此运行互不干扰。因此Docker可以复用操作系统,而虚拟机技术不可以。
相同点:
都属于虚拟化技术,目标都是将一套应用程序所需的执行环境打包起来,建立一个相对隔离的环境,方便在不同硬件之间迁移。
不同点:
1、结构方面:
由于容器采用namespace和Cgroups,使得运行环境和资源隔离开来,能做到进程层面的隔离。每个容器进程之间有隔离的空间,彼此运行互不干扰。因此得以复用操作系统。而虚拟化技术需要独立的操作系统来做资源分配和隔离。
2、性能方面:
由于容器可以复用操作系统,无需分配额外的资源给操作系统。因此,服务启动较快、硬盘使用较少,相对于虚拟化技术更加轻量级。
3、应用场景:
虚拟机技术开启了云计算时代,各个应用开发商无需自己准备应用服务器,租用虚拟机即可;
Docker作为下一代虚拟化技术,改变的是应用的开发、测试、部署方式,可以让应用快速上线、快速迭代。应用容器化更适用于更新频率高、镜像小、服务多的场景。譬如各种微服务,即一些协同工作的小而自治的服务。
2kubernetes
2.1编排技术来由
容器技术确实可以很好的解决资源利用率问题,但大量使用,也会带来新的问题。比如:如何去管理这么多容器?怎么能方便横向扩展?如果容器宕机,怎么能自动恢复?怎么去调度容器的创建?如何保护隐私数据?如何更新而不影响业务?
针对以上问题,我们需要编排技术来管理容器。
2.2Kubernetes
他是一个全新的基于容器技术的分布式架构领先方案。
Kubernetes(k8s)是Google开源的容器集群管理系统(谷歌内部:Borg)。在Docker技术的基础上,为容器化的应用提供部署运行、资源调度、服务发现和动态伸缩等一系列完整功能,提高了大规模容器集群管理的便捷性。
Kubernetes是一个完备的分布式系统支撑平台,具有完备的集群管理能力,多扩多层次的安全防护和准入机制、多租户应用支撑能力、透明的服务注册和发现机制、内建智能负载均衡器、强大的故障发现和自我修复能力、服务滚动升级和在线扩容能力、可扩展的资源自动调度机制以及多粒度的资源配额管理能力。同时Kubernetes提供完善的管理工具,涵盖了包括开发、部署测试、运维监控在内的各个环节。
2.3运行机制
2.3.1主要角色
Kubernetes属于主从分布式架构,主要由Master Node和Worker Node组成。
1、Master Node
k8s集群的管理节点,负责管理集群,提供集群的资源数据访问入口。拥有Etcd存储服务(可选),运行Api Server进程,Controller Manager服务进程及Scheduler服务进程,关联工作节点Node。
2、Worker Node
Worker Node是Kubernetes集群架构中运行Pod的服务节点(亦叫agent或minion)。Worker Node是Kubernetes集群操作的单元,用来承载被分配Pod的运行,是Pod运行的宿主机。关联Master管理节点,拥有名称和IP、系统资源信息。运行docker eninge服务,守护进程kunelet及负载均衡器kube-proxy.
2.3.2内部管理
Worker Node作为工作节点相当于一台宿主机,Worker Node上都运行着多个Pod,Pod将有联系紧密的一些容器封装在一起 ,作为盛放容器的载体,为容器提供相同的命名空间、IP地址,且能共享存储、共享管理。
当服务规模过大,且需要稳定的时候,就需要启动多个相同的Pod,以保证服务的稳定可靠,且负载均衡,kubernetes通过RC(Replication Controller)提供对Pod副本的管理,通过剔除运行不正确的Pod并重启,或关闭冗余Pod,来保证集群中存在指定数量的副本,稳定且不占用过多资源。
客户端访问服务器是通过IP地址访问的,Pod在kubernetes中的IP地址不是固定的,运行过程中,当某个Pod副本运行不正确,RC就会启动一个新的pod替代它 。此时,新启动的Pod会赋予一个新的IP,与原来Pod的IP并不相同,若此时客户端仍然以原来的IP地址访问该pod的服务,就会报错,而重新修改IP地址又过于繁琐。因此kubernetes引入了Service。Service作为一个代理不仅可以确保获取服务无需知晓Pod真实IP,还可以为多个Pod副本做负载均衡,使得worker Node的服务对用户透明。
2.4其他编排技术
2.4.1Docker swarm
Docker swarm 由Docker开发的调度框架,由manager和Node组成。manager负责调度,Node负责运行。Docker Swarm使用标准Docker API。
2.4.2Apache Mesos
Mesos是一个开源集群管理器,为数据中心提供动态的资源分配。Mesos支持在多租户间分发工作负载。由Agent Nodes、Master、Zookeeper、Freamworks组成。Agent Nodes负责运行,Master负责分发任务,Zookeeper用于选择、查找和故障处理,Freamworks与Master协调调度任务。
2.4.3对比分析
1、Docker Swarm:
依赖于Docker API
比较适用于轻量级的容器编排管理
设置和安装容易,提供良好的特性,但受限于API
适合中小型系统
2、Kubernetes:
不是基于Docker,可以解决Docker的限制
容器高可用性,集群的精细管理,复杂的网络场景,比较适合提供高可靠的服务
很难安装和配置,但相对成熟,高度通用、开源
适合中等规模,结构复杂,需要精细管理的系统,成本较高
3.、Apache mesos:
底层的调度器,对于容器的编排,支持多种Frameworks,包括Marathon、Kubernetes、Swarm。
配置和安装困难,运行较稳定,适用于大型系统
最高可以运行5万多个节点,适合大规模系统
2.5Kubernetes优势
1、可移动: 公有云、私有云、混合云、多态云
2、可扩展: 模块化、插件化、可挂载、可组合
3、自修复: 自动部署、自动重启、自动复制、自动伸缩
2.6与微服务架构的联系
基于Docker容器和其生态系统的微服务架构是下一代PaaS的核心,在Docker出现之前,虽然我们谈论微服务架构,但是其实是很难实现的。微服务要运行,首先需要一套执行的环境。这套环境不能对外部有依赖性。同时,执行环境的粒度又必须足够的小,这样才能称之为“微”,否则必然是对资源的巨大浪费。
一个微服务可以跑在一台虚拟机上面,但是虚拟机粒度太大,即使最小的虚拟机,也至少也有1个核。服务一个用户的服务,显然用不了一个核。同时,虚拟机有没有一套方便的管理机制,能够快速的让这些服务之间能够组合和重构。
Docker出现以后,我们看到了微服务的一个非常完美的运行环境。一个容器就是一个完整的执行环境,不依赖外部任何的东西,具备独立性。一台物理机器可以同时运行成百上千个容器,粒度细。其计算粒度足够的小。容器可以在秒级进行创建和销毁,非常适合服务的快速构建和重组。数量众多的容器编排管理工具,能够快速的实现服务的组合和调度。
3总结
Docker 自2013年发布之后早已成为了首屈一指的容器平台,并且仍然在持续改进。未来它仍将占据容器平台的主导地位并不断发挥其价值。 Kubernetes作为一个成熟的容器编排解决方案,拥有着强大的社区并且主要的云提供商都支持它,近年来成为了主流。这两种技术相互影响,在今天的软件环境中都扮演着重要的角色,更确切的说,Kubernetes更像是Docker的推动者,有了前者的包装和驱动,更进一步地推动了后者的发展。
看完了Kubernetes和Docker的介绍,事实上,它们非敌也非友,如果Docker是一辆辆汽车,那么Kubernetes就好比智能的停车场,高效的管理着每一辆进出的车辆,前者将帮助你隔离和打包你的软件及其所有依赖项,后者将帮助部署和协调容器。你需要Docker,也需要Kubernetes,将这两个技术相结合,才能发挥更大的作用。相信未来两者共赢的趋势将会越来越壮大。