【云原生】为什么要虚拟化,为什么要容器,为什么要Docker,为什么要K8S?

戳上方蓝字“Java面试题精选”关注!

前言

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

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

一、虚拟化—历史的选择

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

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

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

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

此外,还有物理机内应用的资源分配问题、动态负载等等问题。

【云原生】为什么要虚拟化,为什么要容器,为什么要Docker,为什么要K8S?

那么,得想个办法(或者工具)来解决环境隔离的问题。举个简单的例子,平时在PC上使用比较多的虚拟化是Vmwear(一个桌面软件),这类软件可以在windows上安装下linux虚拟机(可以学习linux系统),且安装完成的虚拟机就是一个文件夹,可以拷贝到任意其他PC电脑上使用,只要那台电脑上也装了Vmwear,等同于一个移动操作系统,如图2所示:

【云原生】为什么要虚拟化,为什么要容器,为什么要Docker,为什么要K8S?

但是这仅仅是我们个人在PC端使用的虚拟化软件,在企业级别服务器上相应的工具最具代表性的是KVM。

我们可以把原始装的那个linux系统称为Host OS(主机),在这之上我们安装各种应用,JVM,Docker,Python等。其运行原理如图3所示:

【云原生】为什么要虚拟化,为什么要容器,为什么要Docker,为什么要K8S?

到这里,我们已经大致知晓了虚拟化技术存在的原因和所适用的场景。接下来就是对于容器这一部分进行解答,同时将Docker和容器一起进行比较。

二、容器化—演进的结果

为何要容器化?

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

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

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

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

区别与联系:

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

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

【云原生】为什么要虚拟化,为什么要容器,为什么要Docker,为什么要K8S?

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

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

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

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

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

三、K8s—业界的标准

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

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

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

【云原生】为什么要虚拟化,为什么要容器,为什么要Docker,为什么要K8S?

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

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

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

【云原生】为什么要虚拟化,为什么要容器,为什么要Docker,为什么要K8S?

四、文章小结

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

来源:cnblogs.com/Apluemxa/p/17055464.html


后端专属技术群

构建高质量的技术交流社群,欢迎从事编程开发、技术招聘HR进群,也欢迎大家分享自己公司的内推信息,相互帮助,一起进步!

文明发言,以交流技术职位内推行业探讨为主

广告人士勿入,切勿轻信私聊,防止被骗

【云原生】为什么要虚拟化,为什么要容器,为什么要Docker,为什么要K8S?

加我好友,拉你进群

原文始发于微信公众号(Java面试题精选):【云原生】为什么要虚拟化,为什么要容器,为什么要Docker,为什么要K8S?

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由半码博客整理,本文链接:https://www.bmabk.com/index.php/post/201378.html

(0)
小半的头像小半

相关推荐

发表回复

登录后才能评论
半码博客——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!