容器Docker和KubernetesK8S的关键技术和应用

容器Docker和(Kubernetes)K8S的关键技术和应用。

前言:

我们都熟悉云计算主要提供3钟服务,IAAS(基础设施即服务),PAAS(平台即服务)、SAAS(软件即服务),今天我们来重点介绍一下PaaS服务,而PaaS的主要有三驾马车:容器、Kubernetes(K8S)、DevOps  ,而其中的两种技术容器化、DevOps又是大家所熟知的云原生(Cloud Native)架构和应用里面核心两种技术,所以虽然三种都比较复杂,虽然三者都“很年轻”,但通过梳理其发展历程,可以更好地理解为何会出现容器、K8S技术,能解决客户的什么问题?以及通过看当前众多厂商的兴起、发展和消亡,来看PaaS技术的发展趋势。

一、容器的定义

首先我们来看下容器技术,不得不提大名鼎鼎的Docker,Docker从何而来?先来看下Docker的起源

2010年DotCloud公司(Docker公司的前身)推出Docker产品,彼时业界也有CloudFoundry的Warden等使用LXC的众多容器引擎,Docker没有马上火起来。直到2013年Docker开源后,业界发现了Docker的杀手锏----容器镜像技术可以做到“一次打包、到处运行(Build once,Run AnyWhere)”,一举解决了 开发、测试和生产环境无法统一 这一困扰业界几十年的问题,这也是困扰PaaS业界已久的一致性问题。而且Docker还能实现比虚拟机更轻量级、更快的虚拟化技术(Docker秒级创建v.s. 虚拟机分钟级创建;Docker大小MB级别,VM是GB级别),因此Docker一经开源,就火了起来。总结:简单来说Docker是一种Linux容器管理引擎

二、Docker 包含两种核心技术:容器技术、镜像技术。

  1. 容器技术提供隔离的运行环境,并有效分配和管理物理资源。

  2. 镜像技术 打破“代码即应用”的观念,从系统环境开始,自底至上打包应用。

三、容器有哪些特点

  1. 特点一:轻量。容器是操作系统级的虚拟化,它不像虚拟机一样需要独立的虚拟化软件,也不需要硬件辅助虚拟化,而是通过(Linux)内核来实现,从大小、资源消耗角度来看,它是一种轻量级的虚拟化。我们可以通过一张图来对比一下容器和虚拟机的区别,容器有两个不同于虚拟机的显著特点:

 

 

备注:根据宿主机类型的不同,容器又可以分为裸机容器和虚拟机容器两种,简单来说,裸机容器的宿主机为物理服务器,而虚拟机容器的宿主机为虚拟机,不论是哪种类型,它们都与宿主机共享操作系统内核。

Docker与虚拟机比较

  1. 启动速度

  2. 资源的需求

  3. 学习成本

  4. 工作效率

  5. 隔离性

以下是容器和VM的对比表: 

对比类型

Docker容器

虚拟机(VM

操作系统

宿主机共享OS

宿主机OS上运行虚拟机OS

存储大小

镜像小,便于存储与传输

镜像庞大(vmdk,vdi等)

运行性能

内核调度,几乎无额外损失

虚拟机OS额外的CPU,内存消耗

移植性

轻便、灵活,适应Linux

笨重,打包、迁移,耗时多

 

硬件亲和性

面向应用,面向DevOps

面向资源,面向硬件运维者

部署速度

极快,秒级以内

较慢,20秒左右

                                                                                    

2. 特点二:启动速度快。虚拟机的启动过程与物理服务器类似,按下开机键(对虚拟机是power on指令)后需要通过引导程序引导内核启动(这部分叫bootfs),然后加载根文件系统(rootfs,后面会介绍),然后挂载磁盘外设,读取配置,完成各种检查。。。因此虚拟机的启动时间比较长(事实上,物理服务器启动时,先是由BIOS进行硬件检测和资源分配,才进行上面讲的内核启动过程,因此物理服务器启动时长是大于虚拟机启动时长的)。而容器,由于它与宿主机共享操作系统内核,容器启动时不需要再进行内核及相关的启动(因为宿主机已经处于运行态)只需要加载rootfs,因而大大减少了启动时长,实现秒级甚至毫秒级启动。

  最后来看下容器镜像,下图是一个完整的Docker容器。可以看到除了bootfs之外,这个容器还有4层,从上到下分别是容器层、Apache镜像层(服务级)、emac镜像层(工具栈级)以及Debian镜像层(系统级)。这四层中,只有容器层标注了“可写”,其他未标注writable的镜像层都是read-only的,这三个只读镜像层叠加在一起,就是这个Docker容器的镜像。换个角度看,在内核已经启动的前提下,只需要在Docker 的image上增加一个读写层,就能创建出一个docker容器。事实上,Docker daemon正是通过这种方法创建容器的。

 

在Docker镜像中,下一层镜像是其上一层镜像的parent image,最下面的镜像层(图中的Debian镜像层)称为base image,除base image外,每一层都有指针指向它的parent image。Docker的术语中还有一个Layer的概念,它的含义与Image较为相近。上图中除bootfs外每一层都是一个Layer,可读写的容器层被称为top layer。

我们也可以通过一张图看下Docker镜像解决了什么问题;

 

四、 K8S的起源、技术和应用

K8S的起源:

我们知道Docker是一个典型的C/S架构,C端叫Docker Client,S端叫Docker Daemon,又叫Docker引擎。在Docker下,我们通过CLI命令对容器的操作(比如docker run拉起一个容器)即是由Client端下发给Server端的,只不过C/S在一起,让我们感觉是直接给Server下命令。Docker提供了很多CLI命令,足以支撑我们对容器及其镜像进行生命周期的各种操作,但这种方式仍有不足:大型软件应用(比如电信网元)完成服务化改造后,可能需要成百上千个容器,这么多的容器如果都靠人工用CLI命令来创建、启动、升级的话,抛开效率不谈,运维人员非崩溃不可

针对这一问题,Kubernetes应运而生。Kubernetes原型来自Google内部的一个名为Borg(看过电影《星际迷航》的同学应该熟悉这个词)的项目,为其自身业务提供容器集群管理。Google后来将其部分开源出来并取名为Kubernetes(这个词来自于希腊语,意为领航员,因K与S之间有8个字母,简称K8S),K8S在Docker技术的基础上,为容器化的应用提供部署运行、资源调度、服务发现和动态伸缩等一系列完整功能,提高了大规模容器集群管理的便捷性。

我们先来看下K8S的定义:

Kubernetes,又称为 k8s(首字母为 k、首字母与尾字母之间有 8 个字符、尾字母为 s,所以简称 k8s)或者简称为 kube ,是一种可自动实施 Linux 容器操作的开源平台。它可以帮助用户省去应用容器化过程的许多手动部署和扩展操作。也就是说,您可以将运行 Linux 容器的多组主机聚集在一起,由 Kubernetes 帮助您轻松高效地管理这些集群。而且,这些集群可跨公共云私有云混合云部署主机。因此,对于要求快速扩展的云原生应用而言(例如借助 Apache Kafka 进行的实时数据流处理),Kubernetes 是理想的托管平台。

K8S的特点主要有:

易学:轻量级,简单,容易理解

便携:支持公有云,私有云,混合云,以及多种云平台

可拓展:模块化,可插拔,支持钩子,可任意组合

自修复:自动重调度,自动重启,自动复制

K8S的架构

Master Slave/Minion结构 

每当用户提交请求到Master,Master下发具体的执行动作到各个节点Node;Master一般仅负责管理工作,Minion负责运行workloads。

Kubernetes有哪些应用?

在您生产环境中(当您要面向云优化应用开发时)使用 Kubernetes 的主要优势在于,它提供了一个便捷有效的平台,让您可以在物理机和虚拟机集群上调度和运行容器。更广泛一点说,它可以帮助您在生产环境中,完全实施并依托基于容器的基础架构运营。由于 Kubernetes 的实质在于实现操作任务自动化,所以您可以将其它应用平台或管理系统分配给您的许多相同任务交给容器来执行。

利用 Kubernetes,您能够达成以下目标:

  • 跨多台主机进行容器编排。

  • 更加充分地利用硬件,最大程度获取运行企业应用所需的资源。

  • 有效管控应用部署和更新,并实现自动化操作。

  • 挂载和增加存储,用于运行有状态的应用。

  • 快速、按需扩展容器化应用及其资源。

  • 对服务进行声明式管理,保证所部署的应用始终按照部署的方式运行。

  • 利用自动布局、自动重启、自动复制以及自动扩展功能,对应用实施状况检查和自我修复。

但是,Kubernetes 需要依赖其它项目来全面提供这些经过编排的服务。因此,借助其它开源项目可以帮助您将 Kubernetes 的全部功用发挥出来。这些功能包括:

  • 注册表,通过 Atomic 注册表或 Docker 注册表等项目实现。

  • 联网,通过 OpenvSwitch 和智能边缘路由等项目实现。

  • 遥测,通过 heapster、kibana、hawkular 和 elastic 等项目实现。

  • 安全性,通过 LDAP、SELinux、RBAC 和 OAUTH 等项目以及多租户层来实现。

  • 自动化,参照 Ansible 手册进行安装和集群生命周期管理。

  • 服务,可通过自带预建版常用应用模式的丰富内容目录来提供

补充一些K8S的相关术语

主机(Master): 用于控制 Kubernetes 节点的计算机。所有任务分配都来自于此。

节点(Node):负责执行请求和所分配任务的计算机。由 Kubernetes 主机负责对节点进行控制。

容器集(Pod):被部署在单个节点上的,且包含一个或多个容器的容器组。同一容器集中的所有容器共享同一个 IP 地址、IPC、主机名称及其它资源。容器集会将网络和存储从底层容器中抽象出来。这样,您就能更加轻松地在集群中移动容器。

复制控制器(Replication controller):用于控制应在集群某处运行的完全相同的容器集副本数量。

服务(Service):将工作内容与容器集分离。Kubernetes 服务代理会自动将服务请求分发到正确的容器集——无论这个容器集会移到集群中的哪个位置,甚至可以被替换掉。

Kubelet:运行在节点上的服务,可读取容器清单(container manifest),确保指定的容器启动并运行。

kubectl: Kubernetes 的命令行配置工具。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

相关文章

最近一直在开发Apworks框架的案例代码,同时也在一起修复Apw...
最近每天都在空闲时间努力编写Apworks框架的案例代码WeText。...
在《Kubernetes中分布式存储Rook-Ceph部署快速演练》文章中,...
最近在项目中有涉及到Kubernetes的分布式存储部分的内容,也...
CentOS下Docker与.netcore(一) 之 安装 CentOS下Docker与.ne...
CentOS下Docker与.netcore(一) 之 安装 CentOS下Docker与.ne...