容器本身是没有价值的,有价值的是容器编排
容器是通过'边界'的方式实现的沙盒技术。
容器技术的核心功能,就是通过约束和修改进程的动态表现,从而为创造边界。
进程:程序运起来后的计算机执行环境的总和。
首先,操作系统从“程序”中发现输入数据保存在一个文件中,所以这些文件会加载到内存待命。同时,操作系统又读取到计算加法的指令,cpu与内存协作去完成算法操作,又会使用寄存器存放数值,内存堆栈保存执行的命令和变量。同时计算机打开的文件,以及各种i/o设备不断调用中修改自己的状态。就这样,一旦“程序”被执行起来,它就从磁盘上的二进制文件,变成了计算机内存中的数据、寄存器里的值、堆栈中的指令、被打开的文件,以及各种设备的状态信息的一个集合。
实现边界的方式:Cgroups 技术是用来制造约束的主要手段,而Namesp技术则是用来修改进程视图的主要方法。
image.png
根据图片中我们看到的进程只有之前起的/bin/sh,是由于Namespace参数导致容器中查看不到其他的。除了PID Namespace,Linux 操作系统还提供了Mount(挂载点)、UTS(主机名)、IPC(进程间的通信)、Network(网络访问包括接口) 和 User(将本地的虚拟user-id映射到真实的user-id)等。
资源限制就是通过cgroups技术实现:隔离cpu/内存/磁盘/网络带宽。
Cgroups 还能够对进程进行优先级设置、审计,以及将进程挂起和恢复操作。
在 Linux 中,Cgroups 给用户暴露出来的操作接口是文件系统,它会议文件和目录的方式再/sys/fs/cgroup路径下。
image.png
目录下可以看到cpuset/cpu/memory等文件这些都是可以被cgroup限制的种类。
在容器中top获取的数据情况是宿主机的信息而不是容器的情况:/proc文件系统并不知道cgroup做了什么限制。
解决上述问题 网友回答:1 之前遇到过,但是没有考虑如何解决,临时抱佛脚,查了 lxcfs,尝试回答一下。top 是从 /prof/stats 目录下获取数据,所以道理上来讲,容器不挂载宿主机的该目录就可以了。lxcfs就是来实现这个功能的,做法是把宿主机的 /var/lib/lxcfs/proc/memoinfo 文件挂载到Docker容器的/proc/meminfo位置后。容器中进程读取相应文件内容时,LXCFS的FUSE实现会从容器对应的Cgroup中读取正确的内存限制。从而使得应用获得正确的资源约束设定。kubernetes环境下,也能用,以ds 方式运行 lxcfs ,自动给容器注入争取的 proc 信息。
容器与虚拟化区别:
虚拟化需要创建实打实的虚拟机必须运行一个完整的guestos才能执行用户的进程,产生了更多的资源占用和损耗(网络资源/磁盘io等)。而通过namespace去隔壁,损耗可以忽略不计。
确定在于隔离不彻底,有些资源是无法被Namespace化的:时间。毕竟共享主机内核。
网友评论