1 Star 13 Fork 6

hincky / k8s

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
克隆/下载
note-of-k8s.md 6.07 KB
一键复制 编辑 原始数据 按行查看 历史
hincky 提交于 2022-08-03 09:04 . update note-of-k8s.md.

《深入剖析kubernetes》笔记

容器的发展

PaaS初期阶段

PaaS:平台即服务 (PaaS) 是云中的完整开发和部署环境。

一开始它的主流用法就是租用一批虚拟机,然后将虚拟机的环境管理得像物理机一样,再去部署应用。类似九毛九买的超融合,在里面搭建n个虚拟机构成私有云一样

所以此时的核心是 应用的打包和分发机制 , 这等同于将 应用的可执行文件 和 启动脚本 打进一个 压缩包 ,上传到云上 Cloud Foundry 的存储中。Cloud Foundry 通过调度器选择一个虚拟机,然后通知这个虚拟机上的 Agent 把应用压缩包下载下来启动

PaaS初期的容器

所以“容器”就是运行应用的 隔离环境 。这个容器(或者说这个隔离环境)是通过 Cgroups 和 Namespace 机制为每一个应用单独创建的。

 

1. 容器隔离的namespace机制

容器本身是一个单进程模型

linux利用clone创建新进程时,指定 CLONE_NEWPID 参数,就令进程的id与系统还有其他namespace的进程id隔离了。具体隔离的信息包括:进程号PID,挂载点信息Mount,网络设备Network,配置

 

2. 容器资源限制的Cgroups机制

可怜的容器,被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资料

  1. 通过文件挂载的方式,把cgroup中容器相关的信息读取出来,存储到lxcfs相关的目录下
  2. 并将相关目录映射到容器内的/proc目录下
  3. 从而使得容器内执行top,free等命令时拿到的/proc下的数据是真实的cgroup分配给容器的CPU和内存数据。
类别 容器内目录 宿主机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等等。因此左边结构会比右边更为臃肿

img

 

Docker项目更多的是旁路式的辅助和管理工作,在容器运行时里,CRI-Ocontainerd都可以把docker去掉,少一层调用链来换取更好的性能。

好处:能够免去虚拟化带来的性能损耗(计算资源,网络和磁盘)

坏处:容器和宿主机使用的还是同一个OS内核,win宿主机不能运行Linux容器,低版本内核不能运行高版本内核容器,容器修改时间会同步修改宿主机时间

容器编排项目

Kubernetes

1
https://gitee.com/hincky/k8s.git
git@gitee.com:hincky/k8s.git
hincky
k8s
k8s
master

搜索帮助