Docker产生的原因
研发本地开发的代码,交付运维部署到生产环境时,会由于环境、配置等各种非代码因素的原因无法顺利发布,每次发版时需要浪费人力物力去排查问题。
Docker的简介
Docker属于容器,而容器就是将软件打包成标准化单元,以用于开发、交付和部署。以前是代码即应用,现在是运行环境、代码,才是应用,不会出现本地可以运行,但是生产却无法运行。一次构建处处运行,减少人工运行成本。
虚拟机和Docker区别
虚拟机模拟的是整套环境,包括硬件、环境。虚拟机的启动时长是分钟级,而docker可以做到秒级。虚拟机资源占用多、冗余步骤多、启动慢。
虚拟机时在一个操作系统里运行另外一种操作系统,比如在Windows系统里面运行Linux,应用程序无感知。因为虚拟机看上去和真实系统一模一样,而对于底层系统来说,虚拟机就是一个普通文件,不需要了就删除,对其他部分毫无影响。
容器和虚拟机区别,容器不再是整套环境的模拟,而是需要的库资源和设置,和应用代码绑定在一个环境中。
传统虚拟机技术是虚拟出一套硬件后,在其上运行一个完整操作系统,在该系统上再运行所需应用进程;而容器内的应用进程直接运行于宿主的内核,容器内没有自己的内核,而且也没有进行硬件虚拟。因此容器要比传统虚拟机更为轻便。
镜像简介
Docker包括三个基本概念:镜像、容器、仓库。
镜像(Image)——一个特殊的文件系统,即可直接在OS上运行的代码和环境
容器(Container)——镜像运行时的实体,正在对外提供服务的实体
仓库(Repository)——集中存放镜像文件的地方
容器镜像是轻量的、可执行的独立软件包 ,包含软件运行所需的所有内容:代码、运行时环境、系统工具、系统库和设置。镜像解决的问题是,弹性扩容数十台集群的机器,不可能通过人手工去维护,而是通过镜像去复制粘贴到不同服务器上去。
Docker - Build, Ship, and Run Any App, Anywhere
Build(构建镜像):镜像就像是集装箱包括文件以及运行环境等等资源。
Ship(运输镜像):主机和镜像仓库间运输,这里的仓库就像是超级码头一样。
Run (运行镜像):运行的镜像就是一个容器,容器就是运行程序的地方。
Docker运行过程也就是去仓库把镜像拉到本地,然后用一条命令把镜像运行起来变成容器。所以,我们也常常将Docker称为码头工人或码头装卸工,这和Docker的中文翻译搬运工人如出一辙。
容器服务K8S
Kubernetes是Google在2014年开源的一个容器集群管理系统,Kubernetes简称K8S。K8S用于容器化应用程序的部署,扩展和管理。K8S提供了容器编排,资源调度,弹性伸缩,部署管理,服务发现等一系列功能。
容器解决了研发环境和生产环境一致性的问题。而Kubernetes目标是让批量部署容器化应用简单高效。
容器K8S特点
【1】自我修复:在节点故障时重新启动失败的容器,替换和重新部署,保证预期的副本数量;杀死健康检查失败的容器,并且在未准备好之前不会处理客户端请求,确保线上服务不中断。
【2】弹性伸缩:使用命令、UI或者基于CPU使用情况自动快速扩容和缩容应用程序实例,保证应用业务高峰并发时的高可用性;业务低峰时回收资源,以最小成本运行服务。
【3】自动部署和回滚:K8S采用滚动更新策略更新应用,一次更新一个Pod,而不是同时删除所有Pod,如果更新过程中出现问题,将回滚更改,确保升级不受影响业务。
【4】服务发现和负载均衡:K8S为多个容器提供一个统一访问入口(内部IP地址和一个DNS名称),并且负载均衡关联的所有容器,使得用户无需考虑容器IP问题。
【5】机密和配置管理管理机密数据和应用程序配置,而不需要把敏感数据暴露在镜像里,提高敏感数据安全性。并可以将一些常用的配置存储在K8S中,方便应用程序使用。
【6】存储编排:挂载外部存储系统,无论是来自本地存储,公有云(如AWS),还是网络存储(如NFS、GlusterFS、Ceph)都作为集群资源的一部分使用,极大提高存储使用灵活性。
【7】批处理:提供一次性任务,定时任务;满足批量数据处理和分析的场景。
Masternode:统一入口由Master节点的APIServer实现。
scheduler:是负责调度策略
Controller Manager:作为集群内部的管理控制中心,负责集群内的Node、Pod副本、服务端点(Endpoint)、命名空间(Namespace)、服务账号(ServiceAccount)、资源定额(ResourceQuota)的管理,当某个Node意外宕机时,Controller Manager会及时发现并执行自动化修复流程,确保集群始终处于预期的工作状态。
Worknode就是对应的部署了同样业务代码的节点。
Kube_proxy提供网络代理等负载均衡功能。
pod是worknode节点上运行的多个实例,实现高可用、弹性扩展。因为是无状态服务,如果实例异常无法使用,实例漂移之后,可以不依赖任何数据。有状态服务则是依赖网络IP,存储的数据。
Controller Manager中的Replication Controller,称为副本控制器。副本控制器的作用即保证集群中一个RC所关联的Pod副本数始终保持预设值。
Controller Manager中的Endpoints表示了一个Service对应的所有Pod副本的访问地址,而Endpoints Controller负责生成和维护所有Endpoints对象的控制器。它负责监听Service和对应的Pod副本的变化。
Pod是kubernetes中你可以创建和部署的最小也是最简单位。一个Pod代表着集群中运行的一个进程,可能由一个或者多个容器组合在一起共享资源。
为什么k8s使用Pod在容器之上再封装一层呢?
一个很重要的原因是Docker容器之间的通信受到网络机制的限制。在Docker的世界中,一个容器需要通过link方式才能访问另一个容器提供的服务(端口)。大量容器之间的link将是一个非常繁重的工作。通过Pod的概念将多个容器组合在一个虚拟的“主机”内,可以实现容器之间仅需通过Localhost就能相互通信了。
Ingress是用户访问域名之后,解析成IP,分发给对应Service。而Service则是容器对外统一暴露的接口,隐藏容器内部的实现逻辑。由于容器是无状态服务,当pod服务异常重启新的pod替代时,会产生新的IP地址。
node则是pod所运行的主机,可能是物理机,也可能是虚拟机。