ReZero's Utopia.

K8s

Word count: 607Reading time: 2 min
2021/01/01 Share

容器本身没有价值,有价值的是“容器编排”

  1. 容器技术的核心功能,就是通过约束和修改进程的动态表现,从而为其创造出一个“边界“

  2. 对于 Docker 等大多数 Linux 容器来说,Cgroups 技术是用来制造约束的主要手段,而
    Namespace 技术则是用来修改进程视图的主要方法。

    • int pid = clone(main_function, stack_size, CLONE_NEWPID | SIGCHLD, NULL);
    • 这时,新创建的这个进程将会“看到”一个全新的进程空间,在这个进程空间里,它的 PID
      是 1。之所以说“看到”,是因为这只是一个“障眼法”,在宿主机真实的进程空间里,这
      个进程的 PID 还是真实的数值,比如 100。
  3. 使用虚拟化技术作为应用沙盒,就必须要由 Hypervisor 来负责创建虚拟机,这个虚拟机是真实存在的,并且它里面必须运行一个完整的 Guest OS 才能执行用户的应用 进程。这就不可避免地带来了额外的资源消耗和占用.

    • 而相比之下,容器化后的用户应用,却依然还是一个宿主机上的普通进程,这就意味着这些
      因为虚拟化而带来的性能损耗都是不存在的;而另一方面,使用 Namespace 作为隔离手
      段的容器并不需要单独的 Guest OS,这就使得容器额外的资源占用几乎可以忽略不计
  4. 其次,在 Linux 内核中,有很多资源和对象是不能被 Namespace 化的,最典型的例子就是:时间。

  5. “容器”这个术语长期以来都被用于形容被 Cgroups 限制过的进程组。后来 Google 的工程师们说,他们的 KVM 虚拟机 也运行在 Borg 所管理的“容器”里,其实也是运行在 Cgroups“容器”当中。这和我们 今天说的 Docker 容器差别很大

  6. Linux Cgroups 的全称是 Linux Control Group。它最主要的作用,就是限制一个进程组能够使用的资源上限,包括 CPU、内存、磁盘、网络带宽等等

  7. Cgroups 还能够对进程进行优先级设置、审计,以及将进程挂起和恢复等

  8. 找到 so 文件可以用 ldd 命令 ldd /bin/ls | egrep -o '/lib.*\.[0-9]'

      1. 启用 Linux Namespace 配置;
      1. 设置指定的 Cgroups 参数;
      1. 切换进程的根目录(Change Root)。
CATALOG