You need to enable JavaScript to run this app.
导航

增强容器资源可见性

最近更新时间2024.05.13 10:20:37

首次发布时间2024.05.09 19:20:31

容器服务在内核层面提供容器资源视图相关功能,实现对容器资源的可见性增强。本文为您详细介绍容器资源可见性增强的背景和详细使用方法。

场景介绍

默认情况下,容器资源视图功能的状态是关闭的,容器内获取到的cpu、内存等相关资源信息均来自宿主机(ECS 实例),并非容器真实的资源视图。本场景旨在增强容器资源可见性,开启容器资源视图功能。确保在容器中使用 top、free 等命令读取接口数据时,直接获取容器资源信息,而不是获取容器所在的宿主机资源信息。

容器资源可见性增强支持的文件和资源信息说明如下。

文件说明是否支持
/proc/cpuinfo获取关于 CPU 相关信息,包括:处理器的型号和名称、核心数量、线程数量、CPU 主频、缓存大小、支持的指令集等。✔️
/proc/meminfo获取内存相关信息,包括:内存总量、已使用的内存量、空闲内存量、缓存内存量、交换空间的使用情况等。✔️
/proc/stat获取系统的统计信息,包括:每个 CPU 核心的用户时间、系统时间、空闲时间等 CPU 使用情况相关信息;进程的创建、退出、运行时间等进程统计相关数据;系统启动时间、运行时间、中断次数等系统活动相关数据。✔️
/proc/uptime提供系统的运行时间信息,包括:系统当前时间;系统已经运行了多长时间;目前有多少登录用户;系统在过去的1分钟、5分钟和15分钟内的平均负载。✔️
/sys/devices/system/cpu/online用于显示在线 CPU 核心的文件。在这个文件中,每个 CPU 核心都有一个对应的条目,用于指示该核心是否在线。✔️

背景信息

容器技术提供不同于传统虚拟机技术的环境隔离方式。通常,Linux 容器对容器打包和启动进行了加速,但同时降低了容器的隔离强度,Linux 容器中的资源视图隔离问题就是其中一个典型案例。

容器可以通过 cgroup 方式对资源 CPU 、内存等指标的使用情况进行限制。但值得注意的是,当容器内的一个进程使用 free、top 等常用命令查询监控信息时,只能查到物理机的监控数据,并非容器的真实数据,这是由于容器并没有做到对/proc/sys等文件系统的资源视图隔离。

从应用程序的视角来看,在容器里面运行进程和在物理机/虚拟机上运行进程的运行环境是不同的。并且部分应用在容器里运行进程时存在一些问题,例如:nginx 配置中的 worker_processes auto 等,对于需要获取 host cpu info 的程序,通常都通过程序自动判断所在运行环境 CPU 的数量,但如果容器内的进程从/proc/cpuinfo中获取到 CPU 的核数,显示的是宿主机的总量,会影响运行在容器里面服务的运行状态。

前提条件

已经开通容器服务并创建符合要求的容器集群,具体要求参见本文档《使用限制》章节。创建容器集群相关更多介绍参见:创建集群

使用限制

  • 节点池中的存量节点和存量 Pod 无法使用容器资源可见性增强功能,建议新建节点池以使用此功能。

  • 容器资源可见性增强功能对容器集群版本、节点操作系统镜像及其版本存在依赖,详细如下:

    依赖资源依赖详情

    Kubernetes

    可前往控制台的集群基本信息页面查看,详细介绍参见:如何查看集群的 Kubernetes 版本?

    • v1.28.3-vke.6 及以上的 v1.28 版本。

    • v1.26.10-vke.12 及以上的 v1.26 版本。

    • v1.24.15-vke.28 及以上的 v1.24 版本。

    节点镜像

    • velinux 1.0:5.4.250-2-velinux1u3-amd64 及以上版本。

    • velinux 1.0 CentOS 兼容版:5.4.250-2.3.ve1.x86_64 及以上版本。

    • velinux 1.0 with 5.10 kernel:5.10.135-6-velinux1u1-amd64 及以上版本。

    • velinux 1.0 CentOS 兼容版 with 5.10 kernel:5.10.135-6.1.ve1.x86_64 及以上版本。

操作步骤

步骤一:创建节点池并开启容器资源可见性增强

登录 容器服务控制台,前往节点池页面创建一个新的节点池,要求在高级配置的 部署执行脚本 中添加容器资源可见性增强功能的开启命令sysctl -w kernel.cgroup_override_proc=1 >> /etc/sysctl.conf。其他参数根据实际情况配置即可,更多详细介绍参见:创建节点池

alt

步骤二:创建 Pod 并开启容器资源可见性增强

登录 容器服务控制台,前往工作负载页面创建一个新的工作负载(本文以无状态负载为例),要求在 高级配置 步骤添加实例注解vke.volcengine.com/host-resource-view: false。其他参数根据实际情况配置即可,更多详细介绍参见:创建无状态负载

alt

结果验证

可通过开启容器资源可见性增强功能前后查看到的资源信息对比来验证结果。本场景已经在 Linux 主机中部署 Docker 应用,并创建一个内存大小为 1 GiB 的容器。

  • 若未开启容器资源可见性增强功能,在容器中运行free -m命令时,将查询到容器所在宿主机的资源信息,如下图所示。

alt

  • 若已开启容器资源可见性增强功能,在容器中运行free -m命令时,将查询到容器真实的资源信息,如下图所示。

alt

注意

一般情况下,开启容器资源可见性增强功能后,即可满足常规需求,但需要注意以下特殊场景无法支持。

若容器 1 号进程为 systemd,因为采集监控数据的任务可能位于容器的某个子 cgroup 中,而不是根 cgroup,采集的将会是错误数据。

例如:当通过 SSH 登录该容器并运行cat /proc/cpuinfo命令后,该会话进程实际是位于 systemd 所创建的子 cgroup 中,此时查看的结果为错误数据。