k8s,理解容器中namespace和cgroups的原理

一旦"程序"被执行起来,它就从磁盘上的二进制文件,变成了计算机内存中的数据、寄存器里的值、堆栈中的指令、被打开的文件,以及各种设备的状态信息的一个集合。像这样一个程序运行起来后的计算机执行环境的总和,就是我们今天的主角:进程。

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

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

除了我们刚刚用到的PID Namespace,Linux操作系统还提供了Mount、UTS、IPC、Network和User这些Namespace,用来对各种不同的进程上下文进行"障眼法"操作。

"敏捷"和"高性能"是容器相较于虚拟机最大的优势,也是它能够在PaaS这种更细粒度的资源管理平台上大行其道的重要原因。

不过,有利就有弊,基于Linux Namespace的隔离机制相比于虚拟化技术也有很多不足之处,其中最主要的问题就是:隔离得不彻底。

其次,在Linux内核中,有很多资源和对象是不能被Namespace化的,最典型的例子就是:时间。


众所周知,Linux下的/proc目录存储的是记录当前内核运行状态的一系列特殊文件,用户可以通过访问这些文件,查看系统以及当前正在运行的进程的信息,比如CPU使用情况、内存占用率等,这些文件也是top指令查看系统信息的主要数据来源。

但是,你如果在容器里执行top指令,就会发现,它显示的信息居然是宿主机的CPU和内存数据,而不是当前容器的数据。

造成这个问题的原因就是,/proc文件系统并不知道用户通过Cgroups给这个容器做了什么样的资源限制,即:/proc文件系统不了解Cgroups限制的存在。

相关推荐
哈哈哈笑什么28 分钟前
高并发分布式Springcloud系统下,使用RabbitMQ实现订单支付完整闭环的实现方案(反向撤销+重试+补偿)
分布式·spring cloud·rabbitmq
周杰伦_Jay41 分钟前
【 Kubernetes(K8s)完全指南】从入门到实战(含命令+配置+表格对比)
云原生·容器·kubernetes
__beginner__1 小时前
docker安装influxdb
运维·docker·容器
哈哈哈笑什么1 小时前
分布式高并发Springcloud系统下的数据图同步断点续传方案【订单/商品/用户等】
分布式·后端·spring cloud
LDG_AGI1 小时前
【推荐系统】深度学习训练框架(十三):模型输入——《特征索引》与《特征向量》的边界
人工智能·pytorch·分布式·深度学习·算法·机器学习
回家路上绕了弯2 小时前
多线程开发最佳实践:从安全到高效的进阶指南
分布式·后端
Empty_7773 小时前
K8S-daemonset控制器
云原生·容器·kubernetes
少许极端3 小时前
Redis入门指南:从零到分布式缓存(一)
redis·分布式·缓存·微服务
todoitbo3 小时前
openEuler 云原生实战:Docker Compose 部署 Nextcloud 企业级私有云
docker·云原生·容器·openeuler
爬山算法3 小时前
Redis(161)如何使用Redis实现分布式锁?
数据库·redis·分布式