运维docker01-容器基础

1、为什么使用容器

1、底层操作系统

  • Windows和Linux操作系统都没有相应的技术手段来保证在一台服务器上稳定而安全地同时运行多个应用。
  • 每个服务器只能运行单一应用,这种做法导致了大部分服务器长期运行在他们额定负载5%~10%的水平区间之内。这对公司资产和资源是一种极大的浪费!

2、虚拟化

  • 虚拟化允许多个应用能够稳定、安全地同时运行在一个服务器中(一个服务器安装多个虚拟机)。
  • 虚拟机最大的缺点就是依赖其专用的操作系统(OS),OS会占用额外的CPU、RAM和存储。每个OS都需要补丁和监控。另外,OS需要许可证才能运行(操作系统付费)。
  • 虚拟机启动通常比较慢。
  • 虚拟机可移植性比较差,在不同的虚拟机管理器(Hypervisor)或者云平台之间的迁移很困难。

3、容器

  • 容器的运行不会独占操作系统,运行在同一个宿主机上的多个容器共享一个操作系统的。
  • 容器启动快
  • 容器迁移简单。将容器从笔记本电脑迁移到云上,之后再迁移到数据中心的虚拟机或者物理机之上,都是很简单的事情。

2、虚拟化和容器对比

1、虚拟化和容器的架构

  • 虚拟化技术,每创造一个虚拟机变会有一个操作系统,相对应的就要有一个独立的Kernel,而每一个Kernel又会占用真实主机的CPU、内存、大量磁盘空间。
  • 容器技术,则不需要创造新的系统,自然也就没有Kernel和占用真实主机大量资源的问题了。虚拟机与容器进行对比,显得比较笨重,占用更多的资源。

运维docker01-容器基础

2、虚拟机

  • 通过软件模拟具有完整硬件系统功能的、运行在一个完全隔离环境中的完整计算机系统。
  • 每一台虚拟机包括应用,必要的二进制文件和共享库,以及一个完整的用户操作系统。
  • 虚拟机一旦被开启,预分配给它的资源将全部被占用。
  • 在计算机中创建虚拟机时,需要将实体机的部分硬盘和内存容量作为虚拟机的硬盘和内存容量。每个虚拟机都有独立的CMOS、硬盘和操作系统,可以像使用实体机一样对虚拟机进行操作。

3、容器

  • 容器是轻量级的操作系统级虚拟化,容器与宿主机共享硬件资源及操作系统,可以实现资源的动态分配。
  • 容器包含应用和其所有的依赖包,但是与其他容器共享内核。
  • 容器在宿主机操作系统中,在不同的用户空间以分离的进程运行。
  • 容器技术是实现操作系统虚拟化的一种途径,可以让应用程序及其依赖关系在资源受到隔离的进程中运行。
  • 通过使用容器,我们可以轻松打包应用程序的代码、配置和依赖关系,将其变成容易使用的构建块,从而实现环境一致性、运营效率、开发人员生产力和版本控制等诸多目标。
  • 容器可以保证应用程序快速、可靠、一致地部署,其间不受部署环境的影响。
  • 容器还赋予我们对资源更多的精细化控制能力,让我们的基础设施效率更高。

4、虚拟机和容器的对比

运维docker01-容器基础

3、容器原理

  • 容器技术:有效的将单个操作系统的资源划分到孤立的组中,以便更好的在孤立的组之间平衡有冲突的资源使用需求。
  • 容器的本质就是一组受到资源限制,彼此间相互隔离的进程。
  • 隔离所用到的技术都是由linux内核提供(所以说目前绝大部分的容器都是必须要跑在linux里面的)。
  • chroot改变文件系统的 / (根)的起始位置。
    • 容器早在2000年就已经有了,当时是用来在chroot环境(隔离mount namespac的工具)中做进程隔离(使用namespac和cgroups)。
  • namespace用来做访问隔离(每个容器进程都有自己独立的进程空间,看不到其他进程)
  • cgroups用来做资源限制(cpu、内存、存储、网络的使用限制)。

1、chroot

  • chroot即change root directory(更改root目录)。在linux系统中,系统默认的目录结构都是以 / 开始的,即以根(root)开始的。而在使用chroot之后,系统的目录结构将以指定的位置作为 / 位置。
  • 在chroot之后,系统读取到的目录和文件的起始根,将不是旧根而是新根(即被指定的新的位置)。
  • chroot的好处大致有以下3个:
    • 增加了系统的安全性,限制了用户的权力:
      • 在经过chroot之后,在新根下将访问不到旧根下的目录和文件,这样就增强了系统的安全性。一般会在用户登录前应用chroot,把用户的访问能力控制在一定的范围之内。
    • 建立一个与原系统隔离的系统目录结构,方便用户的开发:
      • 使用chroot后,系统读取的是新根下的目录和文件,这是一个与原系统根下文件不相关的目录结构。在这个新的环境中,可以用来测试软件的静态编译以及一些与系统不相关的独立开发。
    • 切换系统的根目录位置,引导Linux系统启动以及急救系统等:
      • chroot的作用就是切换系统的根位置,而这个作用最为明显的是在系统初始引导磁盘的处理过程中使用,从初始RAM磁盘(initrd)切换系统的根位置并执行真正的init。

2、namespaces名称空间

  • namespace是Linux内核用来隔离内核资源的方式。通过namespace可以让一些进程只能看到与自己相关的一部分资源。不同namespace中的进程根本就感觉不到对方的存在。实现方式是把一个或多个进程的相关资源指定在同一个namespace中,就像运行在多台机器上面一样。
  • Linux内核实现namespace的一个主要目的就是实现轻量级虚拟化(容器)服务。在同一个namespace下的进程可以感知彼此的变化,而对其他namespace下的进程一无所知。这样就可以让容器中的进程产生错觉,认为自己置身于一个独立的系统中,从而达到隔离的目的。
  • linux内核提供的namespace机制,为docker等容器技术的出现和发展提供了基础条件。
  • linux主机在内核上使用六种名称空间,每一种名称空间都为容器提供一类隔离的互不影响的资源。

运维docker01-容器基础

3、Control Groups(cgroups)

  • cgroups(Control Groups)是linux内核提供的一种机制,这种机制可以根据需求把一系列系统任务及其子任务整合(或分隔)到按资源划分等级的不同组内,从而为系统资源管理提供一个统一的框架。
  • 简单说,cgroups可以限制、记录、隔离任务组所使用的物理资源。本质上来说,cgroups是内核附加在程序上的一系列钩子(hook),通过程序运行时对资源的调度触发相应的钩子以达到资源追踪和限制的目的。
  • cgroups是构建Docker等一系列虚拟化管理工具的基石。
  • cgroups在内核中实现限制每一个用户空间的进程使用资源的总量,即资源分配(将一个组当做一个用户空间)。
  • 以组的方式分配硬件资源或其他资源,组内可以再次分组。
    • 内存是不可压缩的资源,需要时就必须有,否则就kill。
    • CPU是可压缩资源
    • 配额:例如,A组使用1G内存,B组使用4G内存,C组使用3G内存
    • 比例:例如,A组使用20%的CPU,B组使用30%的CPU,C组使用50%的CPU

1、cgroups的术语

 

  • task(任务):系统中的进程
  • cgroup(控制组):cgroups中的资源控制都以cgroup为单位实现。cgroup表示按某种资源控制标准划分而成的任务组,包含一个或多个子系统。一个任务可以加入某个cgroup,也可以从某个cgroup迁移到另外一个cgroup
  • subsystem(子系统):cgroups中的subsystem就是一个资源调度控制器(Resource Controller)。比如CPU子系统可以控制CPU时间分配,内存子系统可以限制cgroup内存使用量。
  • hierarchy(层级树):hierarchy由一系列cgroup以一个树状结构排列而成,每个hierarchy通过绑定对应的subsystem进行资源调度。hierarchy中的cgroup节点可以包含零或多个子节点,子节点继承父节点的属性。整个系统可以有多个hierarchy。

2、cgroups的四大功能:

  • 资源限制:cgroups可以对进程组使用的资源总额进行限制。例如,设定应用运行时使用内存的上限,一旦超过这个配额就发出OOM(Out of Memory)。
  • 优先级分配:通过分配cpu时间片数量、硬盘io、带宽大小来控制进程的优先级
  • 资源统计:cgoups可以统计系统的资源使用量,比如CPU使用时长、内存用量等。这个功能非常适合当前云端产品按使用量计费的方式。
  • 任务控制:cgroups可以对进程执行挂起、恢复等操作。

3、subsystem(子系统)

  • 例如,CentOS Linux release 7.7.1908 (Core)支持的subsystem可以查看/proc/cgroups文件。
  • cpuset:给cgroup中的任务分配独立的CPU(多处理器系统)和内存节点。
  • cpu:限制CPU时间片的分配,与cpuacct挂载在同一目录。
  • cpuacct:生成cgroup中的任务占用CPU资源的报告,与cpu挂载在同一目录。
  • memory:对cgroup中的任务的可用内存进行限制,并自动生成内存资源占用报告。
  • devices:允许或禁止cgroup中的任务访问设备。
  • freezer:暂停/恢复cgroup中的任务。
  • net_cls:使用等级识别符(classid)标记网络数据包,这让Linux流量控制器(tc指令)可以识别来自特定cgroup任务的数据包,并进行网络限制。
  • blkio:对块设备的IO进行限制。
  • perf_event:允许使用perf工具来监控cgroup。
  • hugetlb:限制使用的内存页数量。
  • pids:限制任务的数量。
  • net_prio:允许基于cgroup设置网络流量(netowork traffic)的优先级。
#                                                                                                                   #
上一篇:DDD领域驱动设计和实践(转载)


下一篇:【K8s任务】为系统守护进程预留计算资源