PaaS初期阶段
PaaS:平台即服务 (PaaS) 是云中的完整开发和部署环境。
一开始它的主流用法就是租用一批虚拟机,然后将虚拟机的环境管理得像物理机一样,再去部署应用。类似九毛九买的超融合,在里面搭建n个虚拟机构成私有云一样
所以此时的核心是 应用的打包和分发机制 , 这等同于将 应用的可执行文件 和 启动脚本 打进一个 压缩包 ,上传到云上 Cloud Foundry 的存储中。Cloud Foundry 通过调度器选择一个虚拟机,然后通知这个虚拟机上的 Agent 把应用压缩包下载下来启动
PaaS初期的容器
所以“容器”就是运行应用的 隔离环境 。这个容器(或者说这个隔离环境)是通过 Cgroups 和 Namespace 机制为每一个应用单独创建的。
容器本身是一个单进程模型
linux利用clone创建新进程时,指定 CLONE_NEWPID 参数,就令进程的id与系统还有其他namespace的进程id隔离了。具体隔离的信息包括:进程号PID,挂载点信息Mount,网络设备Network,配置等
可怜的容器,被Namespace欺骗,又被Cgroups限制,在这样的环境下,还发挥着自己生命的意义-与应用程序同生命周期,同生共死
Cgroups限制一个进程组能够使用的资源上限,包括 CPU、内存、磁盘、网络带宽等等。
linux中cgroups给用户暴露的操作接口是文件系统(以文件和目录的方式组织在OS的/sys/fs/cgroup下),可以用mount -t cgroup展示出来其下的诸多子系统(子目录),然后下面各类可以被限制的资源方法。比如用来限制进程在长度为cfs_period的一段时间内,只能被分配到总量为cfs_quota的CPU时间(单位us,1ms=1000us,1s=1000ms)
容器和应用能够同生命周期,这个非常重要。否则,一旦出现类似于“容器是正常运行的,但是里面的应用早已经挂了”的情况,编排系统处理起来就非常麻烦了。
查看容器被cgroup的限制,比如cat /sys/fs/cgroup/cpu/docker/5d5c535i23/cpu.cfs_period_us或者cat /sys/fs/cgroup/cpu/docker/5d5c535i23/cpu.cfs_quota_us
问题 linux下的/proc记录的是内核运行状态的特殊文件,但是/proc文件系统不了解cgroup限制的存在,造成在容器中top命令看到的是整个宿主机的参数 同理,linux下的/sys记录的是内存运行状态的特殊文件,在容器中free命令看到的是整个宿主机的参数
解决 通过文件挂载的方式,让容器在宿主机看来更像是虚拟机,将cgroup的真实的容器资源信息挂载到容器内/proc下的文件,利用lxcfs来获取容器中真实的CPU和内存信息
lxcfs原理 lxcfs资料
类别 | 容器内目录 | 宿主机lxcfs目录 |
---|---|---|
CPU | /proc/cpuinfo | /var/lib/lxcfs/{container_id}/proc/cpuinfo |
内存 | /proc/meminfo | /var/lib/lxcfs/{container_id}/proc/meminfo |
/proc/diskstats | /var/lib/lxcfs/{container_id}/proc/diskstats | |
/proc/stat | /var/lib/lxcfs/{container_id}/proc/stat | |
/proc/swaps | /var/lib/lxcfs/{container_id}/proc/swaps | |
/proc/uptime | /var/lib/lxcfs/{container_id}/proc/uptime | |
/proc/loadavg | /var/lib/lxcfs/{container_id}/proc/loadavg | |
/sys/devices/system/cpu/online | /var/lib/lxcfs/{container_id}/sys/devices/system/cpu/online |
Docker阶段
而Docker大部分都是和Cloud Foundry是一样的,最大的区别就是——docker镜像。
docker镜像除了将 应用的可执行文件 和 启动脚本 打进一个 压缩包。还把 系统的文件和目录 打进去压缩包里。保证了容器的环境与你开发和测试的环境是一致的
docker利用docker build image-name
来构建镜像,将 应用的可执行文件 和 启动脚本 还有 系统的文件和目录 一并构建成一个可运行的镜像
然后在云上环境利用docker run image-name
就可以一键部署镜像,从而运行里面的应用了。中间的系统文件目录 还有 应用所需的依赖 不再需要手动配置,因为构建镜像的时候就已经打包好了
这就是“容器化”取代“PaaS化”的重要原因
Docker时期的容器
除了 应用的可执行文件 , 启动脚本 , 系统的文件和目录 还有 应用所需的依赖
对于进程来说,它的静态表现就是程序,平常都安安静静地待在磁盘上;而一旦运行起来,它就变成了计算机里的数据和状态的总和,这就是它的动态表现。
容器技术的核心功能,就是通过约束和修改进程的动态表现,从而为其创造出一个“边界”。
下图就体现了容器的轻量化,不用像虚拟机那样要配置虚拟操作系统等“等量信息”,这也是容器运行数量可以比虚拟机多得多的原因
左边Hypervisor的软件是硬件虚拟化的最主要部分,模拟出OS所需要的各种硬件:CPU,memory,I/O等等。因此左边结构会比右边更为臃肿
Docker项目更多的是旁路式的辅助和管理工作,在容器运行时里,CRI-O和containerd都可以把docker去掉,少一层调用链来换取更好的性能。
好处:能够免去虚拟化带来的性能损耗(计算资源,网络和磁盘)
坏处:容器和宿主机使用的还是同一个OS内核,win宿主机不能运行Linux容器,低版本内核不能运行高版本内核容器,容器修改时间会同步修改宿主机时间
Kubernetes
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。