Kubernetes 与虚拟化和容器化的关系
时间:2022-07-25
本文章向大家介绍Kubernetes 与虚拟化和容器化的关系,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
写下这篇文章的起因是前段时间我尝试在 K8s
上部署一个测试用简单 Web
服务器+ Service Mesh
做流量控制。查阅各种资料让我觉得线索繁杂,无意中刷到下面这张图,觉得它完美描述当时我的内心独白:
在 K8s
的世界,想要完全理解某个东西可能没有看上去那么简单。
我的思绪开始散开:如果这只不幸的小恐龙继续下沉直至物理机层面,它一路上可以看到哪些东西呢?仔细一琢磨,觉得这个问题并不简单,想要回答这个问题需要对云计算有相对整体的了解。根据公开资料,我整理出了以下一张在公有云上运行 K8s
的示意图,注意,这不代表任何现实中的系统设计:
公有云的 VM
上运行 K8s
的可能的架构,其中相同颜色的层代表类似的功能。
接下来自顶向下进行简要介绍:
-
App
:顾名思义是运行在容器内的业务代码。同时注意到根据业务代码的语言,其中也可能多一层JVM
或Python
解释器之类的。 -
Docker
:用于承载容器的创建和运行等。考虑到容器主要是基于Cgroup
等命名空间进行资源隔离,Docker
在容器运行时实际对性能几乎没有直接影响。 -
K8s
:编排并管理容器及其相关资源,是目前事实上的行业标准,类似与Docker
对容器运行时的性能没有直接影响。 -
Guest OS
: 用户可见可操作的操作系统,其上运行了K8s
。考虑到安全性,公有云交付给客户的一定是一个VM而不是容器,所以自然携带一个OS
。这一层时刻消耗资源,但是必要且无可避免。如果有的公司采用多云架构,比如同时使用GCP
,AWS
,阿里云,腾讯云和自建的数据中心,那么一般会在这一层之下再构建一层相对简单的基于内网IP作为标签的管理系统。这样,1~4 层的开发者只需要关心自己的内网IP
,根据内网IP
进行操作和冗余设计。 -
Hypervisor
:用于承载用户虚拟机的创建和运行等。这是一个较大的话题,早期基于软件的全虚拟化效率感人,现在KVM
通过CPU
硬件虚拟化大大提高了效率,已经成为了主流方式。具体可以参考CPU
和内存虚拟化[1]。一般认为I/O
操作通过这一层的代价会高一些。 - 类
Nova
虚拟机管理系统:用户创建的一堆虚拟机不是孤零零的运行就可以,运行在公有云上的VM
会面对一堆挑剔的客户需求和底层硬件故障,自然也需要一个虚拟机管理系统来进行虚拟机的创建、配置、删除、迁移、计费等等。Nova
是OpenStack
中的对应组件,有兴趣的话可以参考OpenStack Nova
总结 [2]。同样,这一层对实际性能几乎没有影响。 - 类
Container / VM
实例:上面的虚拟机管理系统等相关程序自然是公司内公有云部门开发的,但是他们是不会直接运行在物理机上的。为什么呢?因为对于公有云这种复杂的巨系统,软件开发和运维都是难题,它们必然是分开的。如果直接运行在物理机上,那么软件开发将不得不直面硬件并且进行管理。同时,上面提到的 "类Nova
虚拟机管理系统" 其实只是众多公有云程序中的一种,考虑到环境和隔离,比较合理的方式是在此处再进行一次虚拟化/容器化。考虑到这里是公司内资源相对安全可控,使用类似容器的方式进行隔离对性能和运维都好。性能的损耗根据具体实现会有变化。 - 多任务资源隔离、管理系统:类似
K8s
或Nova
,对公司内的服务进行编排和资源管理等。这取决于上一层是VM
还是Container
。同样,这一层对实际性能几乎没有影响。 -
Host OS
: 运行在物理机器上的操作系统,没有特别需要说明的。 - 机器资源:物理机器,包括
CPU
、内存等。
上面介绍的每一层都是仍在发展中的可以出很多书的大话题,第一张图漫画中的小恐龙仅仅是是下沉到了第三层的 K8s
已经憋不住气了。所以说学海无涯,回头是岸,面对公有云这样的复杂系统时,整体上还是应该好读书不求甚解,需要/有兴趣的时候再专注其中某一个小点吧~
引用链接
- CPU 和内存虚拟化: https://zhuanlan.zhihu.com/p/31895393
- OpenStack Nova 总结: https://blog.csdn.net/dylloveyou/article/details/80698420
本文转载自:「Cloud Native Community」,原文:https://tinyurl.com/y4gtcd6w,版权归原作者所有。欢迎投稿,投稿邮箱: editor@hi-linux.com。
- Retrofit2.0通俗易懂的学习姿势,Retrofit2.0 + OkHttp3 + Gson + RxJava
- 3.Linux用户权限管理之三(文件与权限的设定)
- CentOs7.3 搭建 MySQL 5.7.19 主从复制,以及复制实现细节分析
- 1.Linux操作系统安装的5种方法以及心得
- 我(作为一名开发者)所犯过的错误
- Hadoop-2.7.4 集群快速搭建
- Scala-2.13.0 安装及配置
- HBase-1.3.1 集群搭建
- CentOs7.3 Hadoop 用户 ssh 免密登录
- 手把手教你用Mysql-Cluster-7.5搭建数据库集群
- 简单的java开源图床
- 调度器Quartz的简述与使用总结
- 使用 RecyclerView 实现 Gallery 画廊效果,并控制 Item 停留位置
- linux chmod,chown命令详解
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 如何在python文件中测试sql语句
- 用C++跟你聊聊“适配器模式”
- 【tensorflow2.0】评价指标metrics
- 数据库(二)--多对多相关操作
- 【tensorflow2.0】优化器optimizers
- 数据库(三)--多对多,一对多,一对一
- 【tensorflow2.0】回调函数callbacks
- 用C++跟你聊聊“观察者模型”
- 【tensorflow2.0】构建模型的三种方法
- django实战(一)--dango自带的分页(极简)
- 线程池 -- 动态链接库
- 【tensorflow2.0】训练模型的三种方法
- 用C++跟你聊聊“建造者模式”
- 【tensorflow2.0】使用TPU训练模型
- 用C++跟你聊聊“外观模式”