前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Docker容器资源限制问题&LXCFS

Docker容器资源限制问题&LXCFS

原创
作者头像
chen1900s
修改2022-06-09 18:40:40
9780
修改2022-06-09 18:40:40
举报
文章被收录于专栏:TKE学习

Docker容器资源限制问题

简介

Linux利用CGroup实现了对容器资源的限制,但是在容器内部还是默认挂载宿主机 /proc 目录下的资源信息文件,如:meminfo,cpuinfo,stat,uptiem,等。当进入Containers执行free,df,top等命令的时候,这时候默认读取的是 /proc 目录内的资源信息文件内容,而这些资源信息文件使用的是宿主机的,所以我们看到的是宿主机的使用信息。

关于LXCFS

LXCFS是一个开源的FUSE(用户态文件系统),用来支持LXC容器,也支持Docker容器,社区中常用此工具来实现容器中的资源可见性。

LXCFS原理

以内存资源为列:通过将宿主机的 /var/lib/lxcfs/meminfo 文件挂载到容器内的/proc/meminfo,然后LXCFS会从容器的CGroup中读取正确的内存限制,然后应用到 /var/lib/lxcfs/meminfo ,这时候容器内部从而就得到了正确的内存信息。

说明:/var/lib/lxcfs/meminfo 是服务启动的时候默认指定的目录。

LXCFS实践

方案一:

目前 TencentOS Server 特性支持容器资源展示隔离

参考链接:https://cloud.tencent.com/document/product/1397/72787

  • 增加主机级开关:内核已实现了类似 LXCFS 特性。用户无需在节点部署 LXCFS 文件系统及修改 POD spec,仅需在节点开启全局开关(sysctl -w kernel.stats_isolated=1),/proc/cpuinfo/proc/meminfo 等文件获取即可按容器隔离
  • 增加容器级开关:针对类似节点监控组件等特殊容器,增加了容器级开关 kernel.container_stats_isolated。在主机级开关开启时,仅需在容器启动脚本中关闭容器级开关(sysctl -w kernel.container_stats_isolated=0),即可在容器中读取 /proc/cpuinfo 及 /proc/meminfo 文件时获取到主机信息。

进行验证:

代码语言:txt
复制
[root@VM-0-17-tlinux ~/lxcfs]# uname -r
4.14.105-19-0020.1
[root@VM-0-17-tlinux ~/lxcfs]# sysctl  -a| grep kernel.stats_isolated
kernel.stats_isolated = 0
######默认是0

1,查看当前主机节点上资源情况

代码语言:txt
复制
[root@VM-0-17-tlinux ~/lxcfs]# cat /proc/meminfo | grep MemTotal
MemTotal:        8035132 kB
[root@VM-0-17-tlinux ~/lxcfs]# cat /proc/cpuinfo  | grep processor | wc -l
4
[root@VM-0-17-tlinux ~/lxcfs]# free -m
              total        used        free      shared  buff/cache   available
Mem:           7846        2394        2571           2        2880        5299
Swap:             0           0           0
image.png
image.png

2,未修改前登录容器资源情,看到的是宿主机的使用信息。

代码语言:txt
复制
[root@VM-0-17-tlinux ~/lxcfs]# kubectl  exec -it centos-5ccb64bbdb-h7nb9  -- /bin/bash
[root@centos-5ccb64bbdb-h7nb9 /]# cat /proc/meminfo | grep MemTotal
MemTotal:        8035132 kB
[root@centos-5ccb64bbdb-h7nb9 /]# cat /proc/cpuinfo  | grep processor | wc -l
4
[root@centos-5ccb64bbdb-h7nb9 /]# free -m
              total        used        free      shared  buff/cache   available
Mem:           7846        2409        2555           2        2881        5285
Swap:             0           0           0

3, 开启全局开关 (**sysctl -w kernel.stats_isolated=1**)

代码语言:txt
复制
[root@VM-0-17-tlinux ~]# sysctl -w kernel.stats_isolated=1
kernel.stats_isolated = 1
[root@VM-0-17-tlinux ~]# sysctl  -p

4,进一步查看容器资源情况

代码语言:txt
复制
[root@centos-5ccb64bbdb-h7nb9 /]# cat /proc/meminfo | grep MemTotal
MemTotal:        1048576 kB
[root@centos-5ccb64bbdb-h7nb9 /]# cat /proc/cpuinfo  | grep processor | wc -l
1
[root@centos-5ccb64bbdb-h7nb9 /]# free -m
              total        used        free      shared  buff/cache   available
Mem:           1024           4        1014           0           4         934
Swap:          1024           0        1024
image.png
image.png

5,低内核版本不支持该参数

代码语言:txt
复制
[root@VM-2-46-centos ~]# sysctl -w kernel.stats_isolated=1
sysctl: cannot stat /proc/sys/kernel/stats_isolated: No such file or directory
[root@VM-2-46-centos ~]# uname -a
Linux VM-2-46-centos 3.10.0-1160.11.1.el7.x86_64 #1 SMP Fri Dec 18 16:34:56 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux
image.png
image.png

方案二:

参考链接:https://github.com/denverdino/lxcfs-admission-webhook

在节点上安装LXCFS , 通过将宿主机的 /var/lib/lxcfs/meminfo 文件挂载到容器内的/proc/meminfo,然后LXCFS会从容器的CGroup中读取正确的内存限制,然后应用到 /var/lib/lxcfs/meminfo ,这时候容器内部从而就得到了正确的内存信息

1, 准备 ( node节点OS:centos 7.6 )

代码语言:txt
复制
#安装依赖
yum install -y fuse-libs
git  clone https://github.com/denverdino/lxcfs-admission-webhook.git
cd  lxcfs-admission-webhook

2,部署

代码语言:txt
复制
#部署lxcfs daemonset
kubectl  apply -f deployment/lxcfs-daemonset.yaml
#部署lxcfs admission webhook
sh  deployment/install.sh  #删除的话使用sh  deployment/uninstall.sh 
#执行kubectl get po ,确认所有pod都处于Running状态
[root@VM-2-46-centos lxcfs-admission-webhook]# kubectl  get pods  | grep lxcfs
lxcfs-4bjxh                                           1/1     Running   0          8m44s
lxcfs-56225                                           1/1     Running   0          8m44s
lxcfs-admission-webhook-deployment-58d6fdcf49-jmxd9   1/1     Running   0          8m3s
lxcfs-f2gt5                                           1/1     Running   0          8m44s
lxcfs-h6smp                                           1/1     Running   0          8m44s

3,验证效果,启动lxcfs

对于要使用 lxcfs 的namespace,使用如下命令启用lxcfs admission webhook的自动注入(以lxcf为例):

代码语言:txt
复制
 kubectl label namespace lxcfs  lxcfs-admission-webhook=enabled
 kubectl  get ns --show-labels
 kubectl  get pods -n lxcfs
 #部署POD到centos 7.6 节点上
image.png
image.png

确认内存信息

image.png
image.png

确认CPU信息

如果pod设置了cpu limit,看到cpu数量为cpu limit值向上取整:

image.png
image.png

4,卸载清理lxcfs

清理 lxcfs-admission-webhook

代码语言:txt
复制
deployment/uninstall.sh

清理 lxcfs

代码语言:txt
复制
kubectl delete -f deployment/lxcfs-daemonset.yaml

lxcfs 支持容器镜像 Centos系统、Ubuntu系统、Debian系统,但是不支持容器镜像 Alpine系统。因为 Alpine 不是使用 Gnu libc,而是使用 musl libc

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Docker容器资源限制问题
    • 简介
      • 关于LXCFS
        • LXCFS原理
          • LXCFS实践
            • 方案一:
            • 方案二:
        相关产品与服务
        容器服务
        腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档