1、不同部署的特点
传统部署时代:
早期,各个组织是在物理服务器上运行应用程序。 由于无法限制在物理服务器中运行的应用程序资源使用,因此会导致资源分配问题。 例如,如果在同一台物理服务器上运行多个应用程序, 则可能会出现一个应用程序占用大部分资源的情况,而导致其他应用程序的性能下降。 一种解决方案是将每个应用程序都运行在不同的物理服务器上, 但是当某个应用程式资源利用率不高时,剩余资源无法被分配给其他应用程式, 而且维护许多物理服务器的成本很高。
虚拟化部署时代:
因此,虚拟化技术被引入了。虚拟化技术允许你在单个物理服务器的 CPU 上运行多台虚拟机(VM)。 虚拟化能使应用程序在不同 VM 之间被彼此隔离,且能提供一定程度的安全性, 因为一个应用程序的信息不能被另一应用程序随意访问。
每个 VM 是一台完整的计算机,在虚拟化硬件之上运行所有组件,包括其自己的操作系统。
容器部署时代:
容器类似于 VM,但是更宽松的隔离特性,使容器之间可以共享操作系统(OS)。 因此,容器比起 VM 被认为是更轻量级的。且与 VM 类似,每个容器都具有自己的文件系统、CPU、内存、进程空间等。 由于它们与基础架构分离,因此可以跨云和 OS 发行版本进行移植。
容器、虚拟机的区别
1、虚拟机
虚拟机本质上就是一款模拟电脑硬件的软件。虚拟机共享物理机的计算资源。
虚拟机指通过软件模拟的具有完整硬件系统功能的、运行在一个完全隔离环境中的完整计算机系统。在实体计算机中能够完成的工作在虚拟机中都能够实现。在计算机中创建虚拟机时,需要将实体机的部分硬盘和内存容量作为虚拟机的硬盘和内存容量。每个虚拟机都有独立的CMOS、硬盘和操作系统,可以像使用实体机一样对虚拟机进行操作。
虚拟机由几层组成。支持虚拟化的层是hypervisor
。hypervisor
是一种虚拟化服务器的软件。
虚拟机的工作原理
虚拟机的原理就是模拟硬件的
运行应用程序所需的一切都包含在虚拟机里——虚拟化的硬件,操作系统以及任何所需的二进制文件和库。因此,虚拟机具有自己独立的基础架构。
虚拟机的优劣势
- 优势:可减少在服务器设备上的支出,可以利用一个物理服务器资源切分成多个独立的虚拟机来完成许多工作。
- 劣势:占用主机的大量系统资源,虚拟机的大小为数GB。在虚拟服务器上运行单个应用程序意味着还要运行
Guest OS
以及Guest OS
运行所需的所有硬件的虚拟副本。这样很快就增加了很多RAM
和CPU
资源消耗。
2、容器
容器是一个不依赖于操作系统,运行应用程序的环境。它通过Linux的Namespaces
和Cgroups
技术对应用程序进程进行隔离和限制的,Namespace
的作用是隔离,它让应用进程只能看到该Namespace
内的世界;而Cgroups
的作用是限制分配给进程的宿主机资源。但对于宿主机来说,这些被“隔离”了的进程跟其他进程并没有太大区别。
容器只是运行在宿主机上的一种特殊的进程,多个容器之间使用的还是同一个宿主机的操作系统内核。
容器是一个包,包含了其应用以及所需要的所有的依赖。
左图,应用直接部署在宿主机中,造成环境相互干扰,不利于运维和维护,右边,应用直接打包在docker中,应用之间互相互不干扰,可以任意运行。
没有容器就没有微服务
最重要的一句话:没有容器就没有微服务。
容器和微服务化后,带来了一些好处,比如:
- 模块间更加独立,可以独立的部署和发布,加快了发布和更新的速度
- 隔离的运行环境,可以为不同模块定制不同的运行环境
编排系统
容器的编排系统可以有效的管理在宿主机上的容器。
- 管理网络和访问
- 跟踪容器的状态
- 增大或缩小服务的规模
- 实现负载平衡
- 宿主机无响应后实现容器的重新分配
- 服务发现
- 管理容器的存储 等等…
容器和虚拟机区别
容器和虚拟机最大的不同在于,容器不需要启动操作系统的完整生命周期,故,容器的启动以及停止都将会非常的快。并且容器还可以相当高兴的利用宿主机的各种资源。
与虚拟机通过操作系统实现隔离不同,容器技术只隔离应用程序的运行时环境但容器之间可以共享同一个操作系统,这里的运行时环境指的是程序运行依赖的各种库以及配置。
2、Docker
docker是一个用Go语言实现的开源项目,可以让我们方便的创建和使用容器,docker将程序以及程序所有的依赖都打包到[docker container](https://www.zhihu.com/search?q=docker container&search_source=Entity&hybrid_search_source=Entity&hybrid_search_extra={“sourceType”%3A”article”%2C”sourceId”%3A”187505981”}),这样你的程序可以在任何环境都会有一致的表现。
Docker技术的三大核心概念,分别是:
镜像(Image)
- Docker镜像,是一个特殊的文件系统。它除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(例如环境变量)。镜像不包含任何动态数据,其内容在构建之后也不会被改变。
容器(Container)
仓库(Repository)
镜像可以共用,类似于一种配置文件。镜像多了就变成了一个大的公共仓库。负责对Docker镜像进行管理的,是Docker Registry服务(类似仓库管理员)。
Docker怎么用?
其实大多数人谈论 Docker 时说的是 Docker Engine,这只是一个构建和运行的容器。
在运行容器前需要编写Docker File,通过 dockerFile 生成镜像,然后才能运行 Docker 容器。
Docker File 定义了运行镜像(image)所需的所有内容,包括操作系统和软件安装位置。一般情况下都不需要从头开始编写 Docker File,在 Docker Hub 中有来自世界各地的工程师编写好的镜像,你可以基于此修改。
3、编排系统的需求催生 k8s
尽管Docker为容器化的应用程序提供了开放标准,但随着容器越来越多出现了一系列新问题:
- 如何协调和调度这些容器?
- 如何在升级应用程序时不会中断服务?
- 如何监视应用程序的运行状况?
- 如何批量重新启动容器里的程序?
解决这些问题需要容器编排技术,可以将众多机器抽象,对外呈现出一台超大机器。现在业界比较流行的有:k8s、Mesos、Docker Swarm。
一个成熟的容器编排系统需要具备以下能力:
- 处理大量的容器和用户
- 负载均衡
- 鉴权和安全性
- 管理服务通信
- 多平台部署
4、Docker与k8s 难舍难分
Docker 和 k8s 在业界非常流行,都已经是事实上的标准。
Docker 是用于构建、分发、运行容器的平台和工具。
而 k8s 实际上是一个使用 Docker 容器进行编排的系统,主要围绕 pods 进行工作。Pods 是 k8s 生态中最小的调度单位,可以包含一个或多个容器。
Docker 和 k8s 是根本上不同的技术,两者可以很好的协同工作。
(1)没有 k8s 可以使用 docker 吗?
可以。实际上一些小型公司,在业务不太复杂的情况下都是直接使用 Docker。尽管 k8s 有很多好处,但是众所周知它非常复杂,业务比较简单可以放弃使用 k8s。
(2)没有 Docker 可以使用 k8s 吗?
k8s 只是一个容器编排器,没有容器拿什么编排?!
k8s 经常与 Docker 进行搭配使用,但是也可以使用其他容器,如RunC、Containerted 等。
5、Kubernetes的作用
1、Kubernetes 的著名优势特色
1、一个平台搞定所有
使用k8s,部署任何应用都相当的容易。
只要能打包进入容器,容器能够运行,那么k8s 就一定能运行。
2、云环境无缝迁移
如果你有上云的需求,那么使用k8s,这间会是一件相当简单的事情,k8s,会让你无缝迁移云环境,从google的cloud到aws再到微软的环境,任意迁移。
3、高效的利用资源
看下图,左边,是4个虚拟机,黄色和蓝色部分是运行的应用,白色部分是未使用的内存和处理器资源。
右边,同样的应用打包运行在容器中。
Kubernetes 如果发现有节点工作不饱和,便会重新分配 pod,帮助我们节省开销,高效的利用内存、处理器等资源。
如果一个节点宕机了,Kubernetes 会自动重新创建之前运行在此节点上的 pod,在其他节点上运行。
4、开箱即用的自动缩放能力
网络、负载均衡、复制等特性,对于 Kubernetes 都是开箱即用的。
pod 是无状态运行的,任何时候有 pod 宕了,立马会有其他 pod 接替它的工作,用户完全感觉不到。
如果用户量突然暴增,现有的 pod 规模不足了,那么会自动创建出一批新的 pod,以适应当前的需求。
反之亦然,当负载降下来的时候,Kubernetes 也会自动缩减 pod 的数量。
5、使 CI/CD 更加简单
你不必精通于 Chef 和 Ansible 这类工具,只需要对 CI 服务写个简单的脚本然后运行它,就会使用你的代码创建一个新的 pod,并部署到 Kubernetes 集群里面。
应用打包在容器中使其可以安全的运行在任何地方,例如你的 PC、一个云服务器,使得测试极其简单。
6、可靠性
Kubernetes 如此流行的一个重要原因是:应用会一直顺利运行,不会被 pod 或 节点的故障所中断。
如果出现故障,Kubernetes 会创建必要数量的应用镜像,并分配到健康的 pod 或节点中,直到系统恢复。
而且用户不会感到任何不适。
一个容器化的基础设施是有自愈能力的,可以提供应用程序的不间断操作,即使一部分基础设施出现故障。