Build once, Run anywhere
容器的概念是参照了航运中集装箱概念,在航运中不管你运输的是汽车还是棉花,它都使用集装箱将其进行了表转化的操作。容器的使命也是一样,容器具备自包含的能力,将自身程序所依赖的程序全部包含在了容器中,通过Docker将底层环境打通,用户可以将一个容器镜像运行在任何操作系统的宿主机上。
容器技术是一种虚拟化的方案。
虚拟机会让原本几十兆的应用动用几个G的操作系统去支撑,虚拟机需要模拟硬件的行为,会占用更多的资源,而容器虚拟化了操作系统,而不是硬件,提高了使用效率。
1、容器的优势:
容器不在依赖于独立的操作系统运行,相比较上图中的虚拟机它没有每个独立的操作系统;
容器是应用程序层的抽象存在,容器只关心中间件之上的应用,中间件与宿主机的操作系统之间的问题全部交给Docker来处理;
容器是云原生应用的基石。
容器技术使得底层资源使用率得到了进一步的提高。
2、Docker的核心概念:
Docker作为容器化软件的一种,是目前使用率最高的容器引擎,需要特别注意的是Docker并不等于容器。
Docker的基本组成有:客户端(Docker Client)、守护进程(Docker Daemon)、镜像(Docker image)、容器(Docker Container)、仓库(Docker Registry)
2.1、Docker Client客户端和Docker Daemon守护进程
Docker Clint向Docker Daemon发送请求,守护进程会返回结果。
2.2、Docker image镜像
Docker镜像是容器的基石,容器基于镜像启动和运行。镜像保存着容器启动的各种条件。Docker image是一个层叠的只读文件系统。
如上图所示,容器启动时,从下而上加载需要的镜像,镜像被依次移到内存中,最后,bootfs会被卸载。
在Docker中,rootfs永远只读,利用联合加载技术,在root文件系统的基础上加载更多的只读文件系统。
2.3、Docker Container
容器通过镜像启动。镜像出现在Docker生命周期中的构建和打包阶段,容器存在于启动和执行阶段。
当容器启动时,Docker会在镜像的最顶层加载一个读写文件系统。程序就在这一层执行,第一个启动时,这一层是空的,当文件系统变化时,都会应用到这一层。
Docker容器具备的能力:
- 文件系统隔离:每个容器都有自己的root文件系统。
- 进程隔离:每个容器都运行在自己的进程环境中。
- 网络隔离:容器间的虚拟网络接口和IP地址都是分开的。
- 资源隔离和分组:使用cgroups将CPU和内存之间的资源独立分配给每个Docker容器。
Docker底层用的Linux的cgroup和namespace这两项技术实现应用隔离。
2.4、Docker Registry仓库
Docker镜像仓库分为公有仓库和私有仓库。
2.5、Docker的三个核心概念:
1、镜像(image)
2、容器(Container)
3、仓库(Registry)
上图为Docker的整个运行逻辑。通过Docker Client将需要执行的Docker命令发送给Docker运行节点上的Docker daemon,Docker daemon将我们的请求进行分解执行。
例如:执行Docker build命令,Docker会根据Dockerfile构建一个镜像存放在本地;
执行Docker pull命令会从远端的容器镜像仓库拉取镜像到本地;
执行Docker run命令会将容器镜像拉取并运行成为容器实例。
3、Kubernetes:
当创建的容器越来越多的时候,对于容器管理来说其实是灾难性的,原来的10台服务器变成了100个容器。对于容器的管理就需要kubernetes。
kuberbetes是一款优秀的开源容器管理软件,它能对容器进行部署、发布、编排等一系列操作,极大的简化了容器的管理运维难度。
K8S是kubernetes的缩写,用8替代了ubernete。
3.1、K8S简介:
K8s是一个可移植的、可扩展的开源平台,用于管理容器化的工作负载和服务,可促进声明式配置和自动化。K8s可以:
- 快速部署应用
- 快速扩展应用
- 无缝对接新的应用功能
- 节省资源,优化硬件资源的使用
K8s的特点:
- 可移植:支持公有云,私有云,混合云;
- 可扩展:模块化,插件化,可挂载,可组合;
- 自动化:自动部署,自动重启,自动复制,自动伸缩、扩展。
3.2、K8s架构原理
由上图可以看出,K8s架构就是一个Master对应一群Node节点。
Master节点结构:
- apiserver即K8s网关,所有的指令请求都必须经过apiserver;
- scheduler调度器,使用调度算法,把请求资源调度到某一个Node节点;
- controller控制器,维护K8s资源对象;
- etcd存储资源对象。
Node节点:
- kubelet 在每一个 Node 节点都存在一份,在 Node 节点上的资源操作指令由 kubelet 来执行;
- kube-proxy 代理服务,处理服务间负载均衡;
- Pod 是 k8s 管理的基本单元(最小单元),Pod 内部是容器,k8s 不直接管理容器,而是管理 Pod;
- Docker 运行容器的基础环境,容器引擎;
- Fluentd 日志收集服务;
K8s是用来管理容器,但是不直接操作容器,最小操作单元是Pod(间接管理容器)。
一个Master有一群Node节点与之对应。
Master节点不存储容器,只负责调度、网关、控制器、资源对象存储。
容器的存储在Node节点,容器是存储在Pod内部的。
Pod内部可以有一个容器,或者多个容器。
Kubelet负责本地Pod的维护。
Kube-proxy负责负载均衡,在多个Pod之间来做负载均衡。
3.3、Pod概念:
Pod也是一个容器,相当于独立主机,这个容器中装的是Docker创建的容器,Pod是用来封装容器的一个容器,Pod是一个虚拟化分组;
Pod有自己的IP地址、主机名,相当于一台独立沙箱环境。
通常情况下,再部署服务时,使用Pod来管理一组相关的服务。一个Pod中要么部署一个服务,要么部署一组有关系的服务。
Pod内部容器之间访问采用Localhost,Pod之间的通信属于远程访问。
Pod是一个进程,是有生命周期的。宕机、版本更新,都会创建新的Pod。这时候IP地址也会发生变化,Hostname也会发生变化,使用Nginx做负载均衡就不太合适了。所以需要依赖Service的能力。
3.4、ReplicaSet副本控制器
控制Pod副本(服务集群)的数量,永远与预期设定的数量保持一致即可。当有Pod服务宕机时,副本控制器将会立马重新创建一个新的Pod,永远保证副本为设置数量。
ReplicaSet副本控制器控制Pod副本的数量。但是,项目的需求在不断迭代、不断地更新,项目版本将会不停的发版。ReplicaSet不支持滚动更新。
3.5、Deployment部署对象
ReplicaSet不支持滚动更新,Deployment对象支持滚动更新,通常和ReplicaSet一起使用。Deployment管理ReplicaSet。
对于K8s来说,Deployment是不能部署有状态服务的。一般情况下,Deployment被用来部署无状态服务,使用StatefulSet进行有状态服务的部署。
3.6、StatefulSet
StatefulSet是为了解决有状态服务使用容器化部署的一个问题。
StatefulSet保证Pod重新建立后,Hostname不会发生变化,Pod就可以通过Hostname来关联数据。
名词解析:
中间件:
中间件是位于计算机应用系统和系统软件之间的一类软件,用来衔接应用系统的各个部分或者不同部分。
中间件是基础软件的一大类,属于可复用软件的范畴。
简单来说中间件就是将具体业务和底层逻辑解耦的组件。
联合加载技术:
联合加载技术是一次加载多个文件系统,但是在外面看来好像只有一个文件系统。最终将各层文件叠加到一起,最终的文件系统包含所有的底层文件和目录。
有状态服务:
有实时的数据需要存储;
对于有状态服务集群来说,把某一个服务抽离出去,一段时间后再加入及其网络,则集群网络无法使用
无状态服务:
没有实时的数据需要存储;
无状态服务集群中,把某一个服务抽离出去,一段时间后在加入机器网络,对集群服务没有任何影响。
参考文章:
从0开始学Docker(上):https://zhuanlan.zhihu.com/p/94680821
Docker容器技术介绍:https://zhuanlan.zhihu.com/p/126687430
一文了解Kubernetes:http://jartto.wang/2020/07/15/start-k8s/