物理机到容器的发展历程

news2024/9/21 3:20:31

物理机到容器的发展历程

  • 物理主机
  • 虚拟化技术
    • 什么是虚拟化?
    • 虚拟化分类
    • 主流的虚拟化技术
    • KVM
    • LXC
  • 容器
  • Docker与Containerd
  • 容器编排
    • 为什么要编排工具
    • 容器编排工具有哪些?

物理主机

从传统的物理服务到现如今的云服务的发展离不开应用服务的拆分,由大而全的服务拆分为各个解耦合的微服务,离不开服务的CI/CD ,持续集成,持续交付,持续部署的发展,离不开IT服务自动化管理,自动化治理的发展;一切发展都基于传统服务中的场景,逐步优化解决其中遇到的些许问题,让敏捷开发,敏捷部署,快速迭代,快速上线运行,更好的服务大众。

当然,不论虚拟化的,还是容器化,其基础设施都离不开原始的物理服务器

传统单纯物理机服务部署大致过程

  1. 服务器选型及采购
  2. IDC选择
  3. 服务器系统选择、系统安装、上架
  4. 应用规划及部署
  5. 域名选择及注册
  6. DNS映射
  7. 测试外网访问

随着互联网的技术改变了一些传统场景的定义,优化人民衣食起居的生活方式,IT规模集聚增加,传统的数据中心面临一些问题

  • 服务器资源利用率低下,CPU、内存等不能共享
  • 资源分配不合理
  • 初始化成本高
  • 自动化能力差
  • 集群环境需要大量的服务器主机

为了解决上面的一些问题,诞生出了服务器的虚拟化技术,将每一台物理机虚拟出来台服务器,以增加资源的利用率,从而降低成本

虚拟化技术

什么是虚拟化?

在计算机技术中,虚拟化(Virtualization)是一种资源管理技术,是将计算机的各种实体资源(CPU、内存、磁盘、网络适配器等),予以抽象、转换后呈现出来并可供分割、组合为一个或多个计算机配置环境,并重新分割、重新组合,以达到最大化合理利用物理资源的目的。

1959 年 6 月,牛津大学的计算机教授,克里斯·托弗(Christopher Strachey)在国际信息处理大会(International Conference on Information Processing)上发表了一篇名为《大型高速计算机中的时间共享》(Time Sharing in Large Fast Computer)的学术报告,他在文中首次提出了 “虚拟化” 的基本概念,还论述了什么是虚拟化技术。这篇文章被认为是最早的虚拟化技术论述

作为服务器运行的系统多为Linux,所以这里我们主要讨论基于Linux的虚拟化技术。

虚拟化分类

Linux虚拟化技术中,解决方案有

  • 完全虚拟化

  • 硬件辅助虚拟化

  • 部分虚拟化

  • 超虚拟化(Paravirtualization)

  • 操作系统级虚拟化

完全虚拟化

虚拟机模拟完整的底层硬件环境和特权指令的执行过程,客户操作系统无需进行修改。(如ⅤMware Workstation、ⅤirtualBox、QEMU等)

硬件辅助虚拟化

用硬件(主要是CPU)辅助支持(目前x86体系结构上可用的硬件辅助虚拟化技术包括Intel-ⅤT和AMD-Ⅴ)处理敏感指令来实现完全虚拟化的功能,客户操作系统无需修改(如VMware Workstation、Xen、Kvm)

部分虚拟化

只针对部分硬件资源进行虚拟化,客户操作系统需要进行修改。现在有些虚拟化技术的早期版本仅支持部分虚拟化。

超虚拟化

部分硬件接口以软件的形式提供给客户机操作系统,客户操作系统需要进行修改,例如早期的Xen。

操作系统级虚拟化

内核通过创建多个虚拟的操作系统实例(内核和库)来隔离不同的进程。容器相关技术即在这个范畴。(如Docker)

主流的虚拟化技术

什么是Hypervisor

Hypervisor 是一种运行在物理服务器和操作系统之间的中间软件层,因此也可以看作是虚拟环境中 的“元”操作系统。它可以协调访问服务器上的所有物理设备和虚拟机,也叫 虚拟机监视器(VMM:Virtual Machine Monitor)

在这里插入图片描述

虚拟化的Hypervisor两种分类

  1. Type 1:基于直接安装在物理机上的Hypervisor,虚拟机直接运行在Hypervisor (如:Xen 和 VMWare 的 ESXi)
  2. Type2:物理机先装常规操作系统,Hypervisor作为操作系统上的程序运行,对虚拟机管理。(如:KVM、VirtualBox 和 VMWare Workstation)

由于主机型 Hypervisor的效率问题 ,多数厂商采用了裸机型 Hypervisor 中的 Linux KVM 虚拟化,即为 Type-I(裸金属型)

在这里插入图片描述

主流的虚拟化技术有LXC、KVM(Kernel-based Virtual Machine)

KVM

KVM

KVM是基于硬件虚拟化扩展(Intel VT- X)和 QEMU 的修改版,KVM最早被Linux作为一个内核模块集成到 Linux Kernel 2.6.20 版本中,只有加载了该模块后,才能进一步通过工具创建虚拟机。

QEMU

QEMU(Quick Emulator)最早于 2001 由 Fabrice Bellard 发布,是一款采用了动态二进制翻译技术的 Type2 (宿主式类型)VMM 软件。

QEMU-KVM

KVM 和 QEMU 各有优缺点、互为补充,所以后来在 KVM 开发者社区对 QEMU 进行优化,推出了 QEMU-KVM 分支发行版(一个特殊的 QEMU 版本)现已经被广泛的集成(二次开发)到各种著名的商业产品中,包括:AWS、阿里云等等。

虽然,在后来的 QEMU 1.3 版本中,开发者社区又将 QEMU 和 QEMU-KVM 两个分支合并了,但为了清晰的区分两者,所以还是习惯性的在 KVM 语境中将其称之为 QEMU-KVM。

LXC

LXC于2008年首次引入,从其之前的Solaris Containers(或Solaris Zones)和FreeBSD jail中采用了其大部分功能

LXC无需创建完整的虚拟机,而是可以通过自己的进程和网络空间来实现虚拟环境。通过使用命名空间(Namespace)来强制执行进程隔离,并利用内核本身的控制组(Cgroup)功能来限制,说明和隔离进程的CPU,内存,磁盘I / O和网络使用情况。是一个高级的chroot

LXC特性

  • Kernel namespaces (ipc, uts, mount, pid, network and user)
  • Apparmor and SELinux profiles
  • Seccomp policies
  • Chroots (using pivot_root)
  • Kernel capabilities
  • CGroups (control groups)

命名空间(Namesapce):

Linux使用如下技术实现容器运行空间的相互隔离

隔离类型功能系统调用参数内核版本
MNT Namespace (mount)提供磁盘挂载点和文件系统的隔离能力(mount允许不同名称空间的进程看到的文件结构不同,因此不同名称空间中的进程所看到的文件目录就被隔离了。另外,每个名称空间中的容器在/proc/mounts的信息只包含当前名称的挂载点。)CLONE NEWNSLinux 2.4.19
IPC Namespace (Inter-Process Communication)提供进程间通信的隔离能力(容器中进程交互还是采用Linux常见的进程交互方法(interprocess communication -IPC),包括信号量、消息队列和共享内存等。)CLONE NEWIPCLinux 2.6.19
UTS Namespace (UNIX Timesharing System)提供主机名隔离能力(允许每个容器拥有独立的hostname和domain name,使其在网络上可以被视作一个独立的节点而非主机上的一个进程)CLONE NEWUTSLinux 2.6.19
PID Namespace (Process Identification)提供进程隔离能力(不同容器就是通过pid名字空间隔离开的,不同名字空间中可以有相同的pid。)CLONE NEWPIDLinux 2.6.24
Net Namespace (network)提供网络隔离能力(每个Net有独立的网络设备,IP地址,路由表,/proc/net目录。这样每个容器的网络就能隔离开来)CLONE NEWNETLinux 2.6.29
User Namespace (user)提供用户隔离能力(每个容器可以有不同的用户和组id,也就是说可以在容器内用容器内部的用户执行程序而非主机上的用户)CLONE NEWUSERLinux 3.8

控制组(Cgroups):
是Linux内核提供的一种可以限制、记录、隔离进程组的物理资源机制。因为Namespace技术只能改变进程的视觉范围,不能真实地对资源做出限制。所以就必须采用Cgroup技术对容器进行资源限制,防止某个容器把宿主机资源全部用完导致其它容器也宕掉。在Linux的/sys/fs/cgroup目录中,有cpu、memory、devices、net_cls等子目录,可以根据需要修改相应的配置文件来设置某个进程ID对物理资源的最大使用率。

切根(change to root):

切根的意思就是改变一个程序运行时参考的根目录位置,让不同容器在不同的虚拟根目录下工作,从而相互不直接影响。

容器

容器想虚拟化技术的一种解决方案,是一种轻量化的虚拟机。

什么是运行时:

就是要掌控和实现容器运行的整个生命周期的功能,这些功能均可由小的组件单独实现,且没有相互依赖。而后 Docker 公司与 CoreOS 和 Google 共同创建了 运行时的开放容器标准规范:OCI (Open Container Initial),凡是满足这个标准的,都可以作为运行时,而非docker刚出来时,只能使用docker作为运行时。

这个规范包括了:运行时规范、镜像规范

常见的容器运行时

  • Containerd

  • Cir-o

  • Docker

  • Mirantis Container Runtime

Docker、Google等开源了用于运行容器的工具和库 :Runc(Docke 将 libcontainer 捐献出来改名为 runc ),作为 OCI 的一种实现参考。在此之后,各种运行时工具和库也慢慢出现,然而这些工具所拥有的功能却不尽相同,有的只有运行容器(runc、lxc),而有的除此之外也可以对镜像进行管理(Containerd、cri-o)

目前较为流行的说法是将容器运行时分成了 low-level 和 high-level 两类。

low-level

指的是仅关注运行容器的容器运行时,调用操作系统,使用 namespace 和 cgroup 实现资源隔离和限制。high-level: 指包含了更多上层功能,例如 grpc调用,镜像存储管理等。

目前常见的 low-level runtime有:

  • lmctfy :Google的一个项目,它是Borg使用的容器运行时
  • Runc :目前使用最广泛的容器运行时。它最初是作为Docker的一部分开发的,后来被提取出来作为一个单独的工具和库。其实现了 OCI 规范,包含config.json文件和容器的根文件系统。
  • Rkt : CoreOS开发的Docker/runc的一个流行替代方案,提供了其他 low-level runtimes (如runc)所提供的所有特性。

high-level runtime

较于low-level runtimes位于堆栈的上层。low-level runtimes负责实际运行容器,而High-level runtimes负责传输和管理容器镜像,解压镜像,并传递给low-level runtimes来运行容器。

目前主流的 high-level runtime 有:

  • docker
  • containerd
  • rkt

Docker与Containerd

现在的架构中组件 containerd 就会负责集群节点上容器的生命周期管理,并向上为 Docker Daemon 提供 gRPC 接口。(说明:docker daemon(守护进程):相当就是一个代理了;)

在这里插入图片描述

Docker Daemon (不再直接创建容器)请求 containerd 来创建一个容器,containerd 收到请求后,创建一个叫做 containerd-shim 的进程,让这个进程去操作容器。我们指定容器进程是需要一个父进程来做状态收集、维持 stdin 等 fd 打开等工作的。

假如这个父进程就是 containerd,那如果 containerd 挂掉的话,整个宿主机上所有的容器都得退出了,而引入 containerd-shim (可以认为是托管容器父进程的一个工具)就可以来规避这个问题了

容器编排

为什么要编排工具

容器多了,管理众多的容器就是一个任重道远的任务了,基于传统机器中需要考虑的服务问题,容器的管理同样需要考虑解决,并且实现自动化的管理容器来解决这些问题。

传统服务需要考虑的一些问题:

  • 可扩展性
  • 高可用
  • 高并发
  • 监控
  • 故障检测、故障自愈

容器编排工具有哪些?

docker-compose

基于docker的编排工具,使容器的操作能够批量的,可视的执行。比如可以解决容器之间的依赖关系,当在宿主机启动较多的容器时候,如果都是手动操作会觉得比较麻烦而且容器出错,这个时候推荐使用 dockerd的单机编排工具 docker-compose

在这里插入图片描述

Docker Swarm

Docker Swarm是管理跨节点容器的编排工具,相较于Docker Compose而言,Compose只能编排单节点上的容器,Swarm将一群Docker节点虚拟化为一个主机,使得用户只要在单一主机上操作就能完成对整个容器集群的管理工作

在这里插入图片描述

Kubernetes

Kubernetes是一个开源的,开箱即用的容器集群管理器和业务流程。它具有出色的构建调度器和资源管理器,用于以更有效和高度可用的方式部署容器。

v1.24 之前的 Kubernetes 版本直接集成了 Docker Engine 的一个组件,名为 dockershim。 这种特殊的直接整合不再是 Kubernetes 的一部分 (这次删除被作为 v1.20 发行版本的一部分宣布)。

OpenShift

Openshift建立在kubernetes之上。由Redhat维护(具有开源版本(openshift orgin)和企业版(openshift容器平台))连同核心的Kubernetes功能,它提供了用于容器管理和编排的开箱即用组件。

在这里插入图片描述

参考:

KVM-虚拟化技术之Hypervisor-架构

虚拟化技术 — QEMU-KVM 基于内核的虚拟机

常见的几种虚拟化方案

深入理解container–容器运行时

容器编排工具

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/735123.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

PDF怎么转长图?这四个方法免费好用!

记灵在线工具怎么转PDF为长图?PDF文件是一种常见的文档格式,它可以在不同的设备和操作系统上保持格式的一致性。然而,有时候我们需要将PDF文件转换成长图,以便于在社交媒体上分享或者在网站上展示。本文将介绍如何使用记灵在线工具…

110、基于51单片机智能浇花浇水系统土壤湿度检测温度自动灌溉报警设计(程序+原理图+PCB源文件+原理图讲解+参考论文+开题报告+程序流程图+元器件清单等)

选题背景及意义 在中国广大面积的农村,没有发达的工商业,有的只是大量闲置的田地。如果利用这些闲置的田地,种植美丽的花卉、树苗,能给当地带来一笔可观的收入。而这些花卉及树苗的种植对土壤湿度,温度有着极高的要求…

RTOS任务切换过程中堆栈的使用情况

我们知道 Cortex-M3 系列单片机内部有双堆栈机制。即 Cortex‐M3 拥有两个堆栈指针:主堆栈(MSP)和进程堆栈(PSP)。任一时刻只能使用其中的一个。通过控制寄存器 CONTROL 中的选择位进行控制。 两个堆栈指针如下&#…

CentOS环境下的Maven安装

CentOS 安装 Maven 镜像地址 镜像地址:https://mirrors.tuna.tsinghua.edu.cn/apache/maven/ 下载地址:https://mirrors.tuna.tsinghua.edu.cn/apache/maven/maven-3/3.8.8/binaries/ 下载maven 将下载好的压缩包拷贝到根目录下 解压 tar -zxvf ap…

硬件性能 - 掌握内存知识

简介 本文章主要介绍了内存的基本知识,简单的判断内存是否耗尽、是否出现内存泄漏等问题。其他硬件性能分析如下: 1. 硬件性能 - CPU瓶颈分析 2. 硬件性能 - 磁盘瓶颈分析 3. 硬件性能 - 网络瓶颈分析 目录 1. 内存的定义 1.1. 内存的基本概念 1.2. 内…

Coggle 30 Days of ML (23年7月)任务二:数据可视化

Coggle 30 Days of ML (23年7月)任务二:数据可视化 任务二:对数据集字符进行可视化,统计标签和字符分布 说明:在这个任务中,需要使用Pandas库对数据集的字符进行可视化,并统计数据集中的标签和…

【JavaEE】Servlet 中常用API有哪些?前后端交互方式有哪些?

博主简介:想进大厂的打工人博主主页:xyk:所属专栏: JavaEE初阶 目录 一、Servlet 运行原理 二、Servlet常用API 2.1 HttpServlet(抽象类) 2.1.1. init 方法 2.1.2 service方法 2.1.3 destroy方法 三、HttpServletRequest 3.1 Ht…

如何自动(定时/间隔/重复)执行 同步文件、备份打包加密压缩文件

参考下列两个教程结合使用即可: 快捷自由定时重启、注销、关机、文件夹同步打开程序等 如何从多个文件夹内转移全部文件(忽略文件夹的结构)(进行复制)(再打包) 就是先设定好 勾选对 来源路径’…

JavaScript基础知识巩固

JavaScript基础 输入输出语法 输出: document.write(要输出的内容) alert(页面弹出警告窗) console.log(控制台打印)输入: let value prompt(用户输入的内容)变量的本质 是程序在内存中申请的一块用来存放数据的空间变量命名规范 不能用关键字 关键…

deeplabv3+源码之慢慢解析根目录(1)main.py--get_argparser函数

系列文章目录(更新中) 第一章deeplabv3源码之慢慢解析根目录(1)main.py–get_argparser函数 第一章deeplabv3源码之慢慢解析根目录(2)main.py–get_dataset函数 第一章deeplabv3源码之慢慢解析根目录(3)main.py–validate函数 第一章deeplabv3源码之慢慢…

王学岗机载开发(一)———————系统配置

1,安装VMware Workstation,然后安装虚拟机 VMware下载地址 Ubuntu镜像 2, 点击虚拟机,设置按钮 选择处理器,勾选虚拟化Intel VT-x/EPT或AMD-V/RVI(V)选项(因为我们是再虚拟机里跑虚拟机) 3,Linux的交换分区…

Django搭建图书管理系统04:View视图初探

数据库虽然已经有了,但是用户通常只需要这个庞大数据库中的很小一部分进行查看、修改等操作。为此还需要代码来恰当的取出并展示数据,这一部分代码就被称为视图。 Django 中视图的概念是**「一类具有相同功能和模板的网页的集合」**。 Hello World! 首…

SpringBoot—统一功能处理

SpringBoot—统一功能处理 🔎小插曲(通过一级路由调用多种方法)🔎使用拦截器实现用户登录权限的统一校验自定义拦截器将自定义拦截器添加至配置文件中拦截器的实现原理统⼀访问前缀添加 🔎统一异常的处理🔎统一数据格式的返回统一…

linux中grep命令的常见用法

作为linux中最为常用的三大文本(awk,sed,grep)处理工具之一,掌握好其用法是很有必要的。 首先谈一下grep命令的常用格式为:grep [选项] ”模式“ [文件] grep家族总共有三个:grep&#xff…

leetcode 686. 重复叠加字符串匹配(KMP算法-java)

重复叠加字符串匹配 leetcode 686. 重复叠加字符串匹配题目描述KMP 算法代码演示 KMP 算法 leetcode 686. 重复叠加字符串匹配 来源:力扣(LeetCode) 链接:https://leetcode.cn/problems/repeated-string-match 题目描述 给定两个字…

MySql存储引擎介绍——InnoDB、MyISAM、Memory

文章目录 1.MySql体系结构2.存储引擎简介3.存储引擎的特点3.1 InnoDB存储引擎特点3.2 MyISAM存储引擎介绍3.3 Memory存储引擎介绍 4.三种存储引擎的特点5.存储引擎的选择6.小结 1.MySql体系结构 2.存储引擎简介 存储引擎就是存储数据、建立索引、更新/查询数据等技术的实现方式…

python接口自动化(二十四)--unittest断言——中(详解)

简介 上一篇通过简单的案例给小伙伴们介绍了一下unittest断言,这篇我们将通过结合和围绕实际的工作来进行unittest的断言。这里以获取城市天气预报的接口为例,设计了 2 个用例,一个是查询北京的天气,一个是查询 南京为例&#xf…

剑指offer55.二叉树的深度

这道题只要想到一棵树的最大深度 max(左子树的最大深度, 右子树的最大深度) 1;就能做出来,利用这个规律递归就出来了。 class Solution {int max,k 1;public int maxDepth(TreeNode root) {if(root null) return 0;return dfs(root);}pr…

【大数据趋势】7月9日 汇率,美澳,恒指期货的大数据趋势概率分析。

1. 数据源头之一 : 美元汇率 美元国债利息持续上行,美元承压,阶段性弱势是明显的。行情这个位置震荡许久,比较大概率能力不佳,有破位可能。从中期趋势来看,正在一个阶段性一层一层往下走的形态下,处于一次…

使用Gradio库创建交互式散点图

❤️觉得内容不错的话,欢迎点赞收藏加关注😊😊😊,后续会继续输入更多优质内容❤️ 👉有问题欢迎大家加关注私戳或者评论(包括但不限于NLP算法相关,linux学习相关,读研读博…