前言

如标题中的问题所提到的虚拟化,容器,Docker和K8s那样,我们不妨这样问:这些技术到底适用于哪些场景,有没有别的技术可以替代?这些技术的优劣在哪里?

下面我将针对性地从以上几个问题的出发点,去和大家分享自己的思考与答案。

一、虚拟化—历史的选择

我们现在提到虚拟化技术,一般会知道有5种:软件虚拟化,硬件虚拟化,完全虚拟化,半虚拟化和容器虚拟化。

在这里,主要探讨的是硬件虚拟化和容器虚拟化的出现,对云计算的发展带来了哪些影响甚至是推动。

对于云原生来说,尤其是应用上云,我们会直接想到使用物理机节点去部署我们的应用。这样做首先是没有问题的,物理机在早期确实也承担了这样的任务,如图1所示。

但这样也会有直接的问题:对于物理机资源的利用暂且不说,众多的应用环境隔离怎么解决?前端是node.js+Vue,后端是Golang,对于版本的维护成本是比较大的,买三台服务器来实现硬件级别隔离显然并不合理。

此外,还有物理机内应用的资源分配问题、动态负载等等问题。
在这里插入图片描述

图1
那么,得想个办法(或者工具)来解决环境隔离的问题。举个简单的例子,平时在 PC 上使用比较多的虚拟化是 Vmwear(一个桌面软件),这类软件可以在 windows 上安装下 linux 虚拟机(可以学习 linux 系统),且安装完成的虚拟机就是一个文件夹,可以拷贝到任意其他PC电脑上使用,只要那台电脑上也装了 Vmwear,等同于一个移动操作系统,如图2所示: ![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/e8a1b7704a4bb5d7c45b2699bc212e8a.png#pic_center)
图2
但是这仅仅是我们个人在 PC 端使用的虚拟化软件,在企业级别服务器上相应的工具最具代表性的是 KVM。我们可以把原始装的那个 linux 系统称为 Host OS(主机),在这之上我们安装各种应用,JVM,Docker,Python 等。其运行原理如图3所示: ![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/6dc164431626cfbcefca123631a43e3e.png#pic_center)
图3
到这里,我们已经大致知晓了虚拟化技术存在的原因和所适用的场景。至于容器,我们接下来将把 Docker 和容器一起进行比较介绍 。

二、容器化—演进的结果

为何要容器化?

结论先行:虚拟机≠容器,容器≠Docker。

虚拟化技术解决的核心问题是资源调配,而容器解决的核心问题是应用开发、测试和部署。

基于上面的介绍,容器的特点可以更好地理解:

  • 容器可以将代码与配置文件和相关依赖库进行打包,从而确保在任何环境下的运行都是一致的。
  • 高资源利用率:容器提供进程级的隔离,因此可以更加精细地设置 CPU 和内存的使用率,进而更好地利用服务器的计算资源。
  • 快速扩展:每个容器都可作为单独的进程予以运行,并且可以共享底层操作系统的系统资源,这样一来可以加快容器的启动和停止效率。

区别与联系:

  • 虚拟机虽然可以隔离出很多「子电脑」,但占用空间更大,启动更慢。虚拟机软件可能还要花钱,例如 VMWare。
  • 容器技术不需要虚拟出整个操作系统,只需要虚拟一个小规模的环境,类似「沙箱」。
  • 运行空间,虚拟机一般要几 GB 到 几十 GB 的空间,而容器只需要 MB 级甚至 KB 级。

将容器这一理念发挥到淋漓尽致的,就是著名的Docker容器技术。即是创建容器的工具,也是应用容器引擎。Docker的中文意思,就是码头工人。而它的LOGO,就是一只鲸鱼背着很多货柜箱,如图4所示:
在这里插入图片描述

图4

为什么一提到容器就会联想到Docker?

Docker是业内容器概念的最好践行者之一。

Docker容器使应用程序不仅彼此隔离,而且与底层系统隔离。这不仅可以实现更清晰的软件堆栈,还可以更轻松地指定给定的容器化应用程序如何使用系统资源- CPU,GPU,内存,I / O,网络等,它还可以更轻松地确保数据和代码保持独立。

镜像是一种轻量级、可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件,它包含运行某个软件所需的所有内容,包括代码、运行时、库、环境变量和配置文件。

我想,上述对于容器和Docker区别大家或多或少有所了解。下面,对于为什么要K8s的问题,分享我的看法。

三、K8s—业界的标准

众所周知,Docker是应用最为广泛的容器技术,通过打包镜像、启动容器来创建一个服务。但是随着应用越来越复杂,容器的数量也越来越多,由此衍生了管理运维容器的重大问题。

而K8s是一个编排容器的工具,其实也是管理应用的全生命周期的一个工具,从创建应用、应用的部署、应用提供服务、扩容缩容应用、应用更新等,都非常的方便,而且可以做到故障自愈。例如一个服务器挂了,可以自动将这个服务器上的服务调度到另外一个主机上进行运行,无需进行人工干涉。

K8s集群由Master节点和Node(Worker)节点组成,具体如表1所示:

Master节点Node节点
etcdControl plane
kube-apiserverkube-proxy
kube-controller-managerkubelet
kebu-schedulerdocker
kube-dnsother apps
kube-proxy
Control plane
表1

各关键组件的简单介绍如下:

- etcd:一个高可用的Key/Value键值对存储和服务发现系统
- flannel:实现跨主机的容器网络的通信
- kube-apiserver:提供kubernetes集群的API调用
- kube-controller-manager:确保集群服务
- kube-scheduler:调度容器,分配到Node
- kubelet:在Node节点上按照配置文件中定义的容器规格启动容器
- kube-proxy:提供网络代理服务

多节点之间关系和所需的组件如图5所示:

在这里插入图片描述

图5

四、文章小结

最后,可以来总结一下虚拟化、容器、Docker 和 K8s 之间的关系了:虚拟化技术将应用从物理机搬进了虚拟机,虚拟机里的容器隔离了应用之间的环境,而Docker是容器技术的知名践行者,K8s则是目前业内公认的容器编排工具(标准)。

我的分享到此结束了,期待大家的交流与指正。

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐