容器和容器管理工具有很多组件。尽管您不需要考虑很多就可以快速部署单个Docker容器,但是容器的规模越大,并且向其添加的服务越多,它就会变得越复杂。实际上,Kubernetes的部署很快就会变得非常复杂。他们也可能对资源要求很高。

容器实现的一部分是cgroups。 cgroup最初由Google创建,并集成到Linux内核2.6.24中,它代表“控制组”,是一种管理一组进程(即一个容器)使用多少计算资源的方法。使用cgroup,您可以执行以下操作:将核心工作负载与后台任务隔离,防止一个工作负载超过其他工作负载,等等。

容器开发人员一直在使用cgroups v1。但是,cgroups v2从内核的4.5版本开始可用,现在大多数容器部署系统都可用并受其支持。这个新版本包含了容器开发人员将要了解的许多重要更改。

简单

v2中对cgroups的最大更改是将重点放在简化层次结构上。如果v1为每个控制器使用独立的树(例如 /sys/fs/cgroup/cpu/GROUPNAME/sys/fs/cgroup/memory/GROUPNAME)。v2将统一/sys/fs/cgroup/GROUPNAME中的树。同样,如果进程X加入/sys/fs/cgroup/test,则启用test的每个控制器都将控制进程X。

例如,在cgroups v2中,在四个文件中配置了内存保护:

  • memory.min: 永远不会回收此内存。
  • memory.low: 如果其他cgroup中没有其他可回收的内存,则会回收低于此阈值的内存。
  • memory.high: 内核将尝试将内存使用率保持在此配置以下。
  • memory.max: 如果内存达到此级别,则在cgroup上调用OOM杀手(一种用来牺牲一个或多个进程以为系统释放内存的系统)。

无Root 容器

无Root容器已成为防止容器运行时漏洞的一种非常流行的方法。为什么要使用无Root容器?有了这个附加的安全层,如果容器受到威胁,攻击者将无法获得主机的root特权。无Root容器还允许在嵌套容器之间进行隔离。迄今为止的问题是cgroups v1不支持对Root容器施加资源限制。 cgroups v2的所有更改,因为无Root容器现在将包含资源限制功能。

其他提升

在cgroups v2中发现的其他更改包括:

  • 现在,Cgroup控制器在实际发生问题之前与子系统进行协商。这些子系统也能够采取措施纠正问题。
  • 全局inotify支持。
  • 单一的统一层次结构,意味着不需要同步。
  • 更多的前期设计。
  • 通用阈值。

运行时支持

重要的是,大多数高级容器运行时(Containerd,Docker,Podman和Kubernetes)现在都能够完全支持cgroups v2。大部分支持始于2019年11月,但是随着cgroups v1的弃用,现在是时候开始进行从v1到v2的具有挑战性的迁移了。

PS: 本文属于翻译,原文


iyacontrol
1.4k 声望2.7k 粉丝

专注kubernetes,devops,aiops,service mesh。