容器与虚拟化

  • Namespace 技术实际上修改了应用进程看待整个计算机“视图”,即它的“视线”被操作系统做了限制,只能“看到”某些指定的内容。但对于宿主机来说,这些被“隔离”了的进程跟其他进程并没有太大区别
  • 容器并不像 Hypervisor 那样对应用进程的隔离环境负责,也不会创建任何实体的“容器”,真正对隔离环境负责的是宿主机操作系统本身。
  • 使用虚拟化技术作为应用沙盒,就必须要由 Hypervisor 来负责创建虚拟机,这个虚拟机是真实存在的,并且它里面必须运行一个完整的 Guest OS 才能执行用户的应用进程。这就不可避免地带来了额外的资源消耗和占用。
  • 容器化后的用户应用,却依然还是一个宿主机上的普通进程,这就意味着这些因为虚拟化而带来的性能损耗都是不存在的;而另一方面,使用 Namespace 作为隔离手段的容器并不需要单独的 Guest OS,这就使得容器额外的资源占用几乎可以忽略不计
  • “敏捷”和“高性能”是容器相较于虚拟机最大的优势

隔离不彻底

  • 多个容器之间使用的就还是同一个宿主机的操作系统内核
  • 在 Linux 内核中,有很多资源和对象是不能被 Namespace 化的,最典型的例子就是:时间。
  • 如果你的容器中的程序使用 settimeofday(2) 系统调用修改了时间,整个宿主机的时间都会被随之修改,这显然不符合用户的预期
  • 宿主机资源会被容器进程吃满。

Cgroups

  • Linux Cgroups 的全称是 Linux Control Group。它最主要的作用,就是限制一个进程组能够使用的资源上限,包括 CPU、内存、磁盘、网络带宽等等
  • cpu-period时长(单位微秒),cpu-quota资源占比
  • $ docker run -it --cpu-period=100000 --cpu-quota=20000 ubuntu /bin/bash
  • 这就意味着这个 Docker 容器,只能使用到 20% 的 CPU 带宽。
Logo

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

更多推荐