容器化技术介绍(kubernetes与docker)
一、docker
伴随着计算机技术的飞速发展,容器化技术现在越来越火,而Docker无疑是其中的明星产品,目前Docker 在国内特别是在一线互联网公司发展的如火如荼,Docker 的使用已经是十分普遍了。
Docker是基于Linux内核的Cgroup和namespace,以及AUFS类的Union FS等技术,对进程进行了封装隔离的技术。它属于操作系统层面的虚拟化技术。
传统虚拟化技术是虚拟出一套硬件后,在其基础上运行一个完整的操作系统,再在此系统上运行所需的应用进程。而Docker技术是容器内的应用进程直接运行于宿主机的内核,容器内没有自己的内核,而且也不虚拟出硬件。因此,相对于传统的虚拟化技术而言,Docker更加轻便。
Docker容器具有以下的优势:
(1)更高效地利用系统资源;
(2)更快捷的启动时间;
(3)一致的运行环境;
(4)支持持续交付和部署;
(5)更轻松的迁移应用;
(6)更轻松的维护和扩展。
Docker使用客户端—服务器(C/S)架构模式,使用远程API来管理和创建Docker容器。在Docker中,用三个基本概念需要了解:
(1)Docker镜像:Docker镜像是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。镜像不包含任何动态数据,其内容在构建之后也不会改变。由于镜像包含操作系统的完整的root文件系统,其体积往往很庞大,因此Docker设计时为分层存储的架构。它由多层文件系统联合组成。镜像构建时,会一层一层构建,前一层是后一层的基础。每一层构建完成后就不会再改变,后一层的改变只会发生在自己的这一层。在镜像构建时,每层尽量只包含该层需要的东西,任何额外的东西应该在该层构建结束前清理掉。这样分层的设计,使得镜像的复用和定制变得十分容易。只需在构建好的基础上再定制即可。
(2)Docker容器:Docker容器可以看做是运行时的Docker镜像。每个容器运行时,以镜像为基础,在其上创建一个当前容器的存储层,它为容器运行时读写而准备,称为容器存储层。容器在消亡时,容器存储层也随之消亡,任何保存于容器存储层的信息都会被删除而丢失。按Docker最佳实践要求,容器不应该向其存储层写入任何数据,容器存储层要保持无状态化。所有的文件写入操作都应该用Volume数据卷或绑定宿主目录,在这些位置的读写会跳过容器存储层,直接对宿主(或网络存储)发生读写,其性能和稳定性更高。Volume数据卷的生存周期独立于容器,容器消亡了,数据卷也不会消亡,因此,数据卷中的数据不会丢失。
(3)Docker仓库:Docker仓库用来存储Docker镜像,可以从这里拉取镜像,也可以推送自己的镜像到Docker仓库中。一个Docker Registry中可包含多个仓库(Registrory),每个仓库可包含多个标签(Tag),每个标签对应一个镜像。
二、kubernetes
Docker 本身非常适合管理单个容器。但随着越来越多的容器和容器化应用程序,并把它们划分成数百个部分,很可能会导致管理和编排变得非常困难。最终,需要对容器实施分组,以便跨所有容器提供网络、安全、遥测等服务。于是,Kubernetes(也称k8s) 应运而生。
真正的生产型应用会涉及很多的容器。这些容器必须跨多个服务器主机进行部署。Kubernetes 可以提供所需的编排和管理功能,以便针对这些工作负载大规模部署容器。借助 Kubernetes 编排功能,可以构建跨多个容器的应用服务、跨集群调度、扩展这些容器,并长期持续管理这些容器的健康状况。
k8s的架构如下图所示:
其中,k8s架构有一些需要了解的概念:
(1)etcd:一个高可用的k-v存储和服务发现系统;
(2)flannel:实现跨主机的容器网络通信组件,Flannel的设计目的就是为集群中的所有节点重新规划IP地址的使用规则,从而使得不同节点上的容器能够获得“同属一个内网”且”不重复的”IP地址,并让属于不同节点上的容器能够直接通过内网IP通信,它实质上是一种“覆盖网络(overlaynetwork)”,也就是将TCP数据包装在另一种网络包里面进行路由转发和通信,目前已经支持udp、vxlan、host-gw、aws-vpc、gce和alloc路由等数据转发方式,默认的节点间数据通信方式是UDP转发,其架构图如下所示:
(3)kube-apiserver:提供k8s集群的API调用,提供了HTTP Rest接口的关键服务进程,是Kubernetes里所有资源的增、删、改、查等操作的唯一入口,也是集群控制的入口进程;
(4)kube-controller-manager:Kubernetes里所有资源对象的自动化控制中心;
(5)kube-scheduler:负责资源调度(Pod调度)的进程;
(6)kubelet:在Node节点上按配置文件负责Pod对应的容器的创建、启停等任务,同时与Master节点密切协作,实现集群管理的基本功能;
(7)kube-proxy:实现Kubernetes Service的通信与负载均衡机制的重要组件,提供网络代理服务;
(8)pod:Pod是Kubernetes的最重要也最基本的概念,每个Pod都有一个特殊的被成为“根容器”的Pause容器。Pause容器对应的镜像属于Kubernetes平台的一部分,除了Pause容器,每个Pod还包含一个或多个紧密相关的用户业务容器;
(9)ReplicaController:RC是Kubernetes系统中的核心概念之一,简单来说,它其实是定义了一个期望的场景,即声明某种Pod的副本数量在任意时刻都符合某个预期值;
(10)service:Service也是Kubernetes里的最核心的资源对象之一,Kubernetes里的每个Service其实就是我们经常提起的微服务架构中的一个“微服务”,下图显示了Pod、RC与Service的逻辑关系:
(11)volume:Volume是Pod中能够被多个容器访问的共享目录。Kubernetes的Volume概念、用途和目的与Docker的Volume比较类似,但两者不能等价;
(12)namespace:namespace是Kubernetes系统中的另一个非常重要的概念,Namespace在很多情况下用于实现多租户的资源隔离;
(13)PV:PersistentVolume(PV)是集群中已由管理员配置的一段网络存储。 集群中的资源就像一个节点是一个集群资源。 PV是诸如卷之类的卷插件,但是具有独立于使用PV的任何单个pod的生命周期。 该API对象捕获存储的实现细节,即NFS,iSCSI或云提供商特定的存储系统;
(14)PVC:PersistentVolumeClaim(PVC)是用户存储的请求。 它类似于pod。 Pod消耗节点资源,PVC消耗Pod资源。 Pod可以请求特定级别的资源(CPU和内存)。 权利要求可以请求特定的大小和访问模式(例如,可以一旦读/写或只读许多次安装)。
三、kubernetes集群环境搭建
这一部分的内容我放在了百度网盘里,包括了二进制文件搭建方式和kubeadm快捷搭建方式。我使用了centOs系统、k8s1.6+和Docker CE;一个master节点和两个node节点来搭建集群。(注意:虚拟机磁盘空间最少20GB以上、最好用固态盘去装,否则有卡死的风险!亲测。。。)。以下是安装文档的百度网盘地址:
链接: https://pan.baidu.com/s/1roO1gc9-z_ttiVNVJLfMyA 提取码: ag9x