女主宣言

通常有一些业务已经习惯了在传统的物理机/虚拟机上使用top,free等命令来查看系统的资源使用情况,而在容器中使用这些命令看到的仍然是物理机/虚拟机上的数据。本文针对该问题,介绍了使用Lxcfs和kubernetes Admission Webhook来实现对容器的资源可视化隔离。

PS:丰富的一线技术、多元化的表现形式,尽在“360云计算”,点关注哦!

1

为什么对容器的资源进行可视化隔离?

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

容器可以通过cgroup的方式对资源的使用情况进行限制,包括: 内存,CPU等。但是需要注意的是,如果容器内的一个进程使用一些常用的监控命令,如: free, top等命令其实看到还是物理机的数据,而非容器的数据。这是由于容器并没有做到对/proc,/sys等文件系统的隔离。

2

容器资源视图隔离有哪些应用场景?

1)在容器生产环境,通常有一些业务已经习惯了在传统的物理机,虚拟机上使用top,free等命令来查看系统的资源使用情况,但是容器没有做到资源视图隔离,那么在容器里面看到的数据还是物理机的数据。

2)在应用程序的视角来看,在容器里面运行进程和在物理机虚拟机上运行进程的运行环境是不同的。并且有些应用在容器里面运行进程会存在一些安全隐患:

  • 对于很多基于JVM的java程序,应用启动时会根据系统的资源上限来分配JVM的堆和栈的大小。而在容器里面运行运行JAVA应用由于JVM获取的内存数据还是物理机的数据,而容器分配的资源配额又小于JVM启动时需要的资源大小,就会导致程序启动不成功。并且在java应用里,一些java库也会根据资源视图分配堆和栈的大小,这同样会存在安全隐患。

  • 在CPU上也会存在问题,大多数的应用程序,比如nginx或者一些其它的中间件服务会根据其视图的cpuinfo文件信息设定默认的启动线程数。但是在容器内的进程总会从/proc/cpuinfo中获取到CPU的核数,而容器里面的/proc文件系统还是物理机的,从而会影响到运行在容器里面服务的性能。

3

容器资源视图没有完全解决的问题,如何做?

使用 lxcfs 和 kubernetes admission webhook机制来实现容器资源视图隔离的效果。

1)lxcfs官方介绍

LXCFS is a small FUSE filesystem written with the intention of making Linux containers feel more like a virtual machine. It started as a side-project of LXC but is useable by any runtime.
关于lxcfs的详细内容,请戳:https://github.com/lxc/lxcfs.

在应用Lxcfs在线上环境需要注意以下几点:

  1. 当前(lxcfs release 3.1.2)版本只对procfs文件系统进行了虚拟化,并没有对/sys/devices/system/cpu/online文件进行虚拟化,但是对/sys/devices/system/cpu/online的虚拟化工作已经被合并到master分支了,如果想要对其进行隔离操作的话,请单独对lxcfs进行编译再使用。

    为什么需要对/sys/devices/system/cpu/online文件进行视图虚拟化?主要问题是由于一些语言在启动runtime时,会从该文件获取cpu的数量,来启动默认的线程数,比如: Java JVM或者Nginx。如果在容器里面获取的还是物理机的数据,会影响到应用程序的性能。

  2. lxcfs需要部署在k8s集群的各个Node节点上,当lxcfs服务重启或者crash时,之前已经挂载在容器/proc的挂载点会失效,导致在容器中执行free,top命令会失效。为了解决这个问题,现在的做法是使用systemd的方式在各个节点启动lxcfs服务,当lxcfs服务crash之后重启成功之后,会通过ExecStartPost的方式执行/usr/local/bin/container_remount_lxcfs.sh脚本来对之前已经挂载过的容器进行重新挂载操作。

lxcfs.service的内容如下:

[Unit]
Description=FUSE filesystem for LXC
ConditionVirtualization=!container
Before=lxc.service
Documentation=man:lxcfs(1)[Service]
ExecStart=/usr/bin/lxcfs -l /var/lib/lxc/lxcfs/
KillMode=process
Restart= always
Delegate=yes
ExecStopPost=-/bin/fusermount -u /var/lib/lxc/lxcfs
ExecReload=/bin/kill -USR1 $MAINPID# add remount script
ExecStartPost=/usr/local/bin/container_remount_lxcfs.sh[Install]
WantedBy=multi-user.target

lxcfs重启成功之后,执行的重新挂载脚本内容如下:

#! /bin/bashPATH=$PATH:/bin
LXCFS="/var/lib/lxc/lxcfs"
LXCFS_ROOT_PATH="/var/lib/lxc"containers=$(docker ps | grep -v pause  | grep -v calico | awk '{print $1}' | grep -v CONTAINE)for container in $containers;domountpoint=$(docker inspect --format '{{ range .Mounts }}{{ if eq .Destination "/var/lib/lxc" }}{{ .Source }}{{ end }}{{ end }}' $container)if [ "$mountpoint" = "$LXCFS_ROOT_PATH" ];thenecho "remount $container"PID=$(docker inspect --format '{{.State.Pid}}' $container)# mount /procfor file in meminfo cpuinfo loadavg stat diskstats swaps uptime;doecho nsenter --target $PID --mount --  mount -B "$LXCFS/proc/$file" "/proc/$file"nsenter --target $PID --mount --  mount -B "$LXCFS/proc/$file" "/proc/$file"done# mount /sysfor file in online;doecho nsenter --target $PID --mount --  mount -B "$LXCFS/sys/devices/system/cpu/$file" "/sys/devices/system/cpu/$file"nsenter --target $PID --mount --  mount -B "$LXCFS/sys/devices/system/cpu/$file" "/sys/devices/system/cpu/$file"done fi
done

2)基于kuernetes可扩展的admission webhook机制对发送创建POD的请求数据进行拦截,并对其请求的Body进行修改之后(在lxcfs中主要是对pod进行procfs文件系统的挂载操作),再放行到具体的handler中并持久化数据到etcd。

再配一张图更能体现adminssion webhook在请求中的哪个位置进行工作。

作者基于开源的lxcfs-admission-webhook进行了修改,增加了对/sys/devices/system/cpu/online文件的虚拟化。详细的代码请戳: https://github.com/xigang/lxcfs-admission-webhook/tree/dev.

在使用lxcfs-admission-webhook服务时,需要注意的几点如下:

1. kubernetes的版本需要大于等于1.9。

2. 配置kube-apiserver配置文件,对–admission-control增加MutatingAdmissionWebhook,ValidatingAdmissionWebhook参数,使kubernetes开启admissionregistration.k8s.io/v1beta1 API。

3. 如果kubernetes master节点没有部署kube-proxy, 需要为kube-apiserver增加--enable-aggregator-routing=true的参数。

4. 如果使用的runc版本比较低,需要升级各个Node节点的runc,以允许容器对procfs文件系统的挂载操作。

最终体现容器资源可视化隔离的效果如下所示:

相关文章

  • https://kubernetes.io/docs/reference/access-authn-authz/admission-controllers/

  • https://kubernetes.io/docs/reference/access-authn-authz/extensible-admission-controllers/

  • https://kubernetes.io/blog/2019/03/21/a-guide-to-kubernetes-admission-controllers/

360云计算

由360云平台团队打造的技术分享公众号,内容涉及数据库、大数据、微服务、容器、AIOps、IoT等众多技术领域,通过夯实的技术积累和丰富的一线实战经验,为你带来最有料的技术分享

容器资源可视化隔离的实现方法相关推荐

  1. 使用LXCFS实现容器资源的视图隔离

    01 问题背景 大家都知道,当我们使用 top 等命令的时候,背后的逻辑是读取 /proc 目录下相应的资源文件.本篇文章就通过查看使用 top所执行的系统调用,来窥探一二. strace top - ...

  2. 容器云系列之Docker容器资源隔离

    本文简要介绍了Docker容器对CPU.内存和IO等系统资源限制. 2.Docker容器资源限制 2.1 Namespace资源隔离 Docker使用Linux namespace技术实现容器间的资源 ...

  3. Docker安全性支持(使用Cgroups机制实现容器资源控制)

    前言 Docker作为最重视安全的容器技术之一,在很多方面都提供了强安全性的默认配置,其中包括:容器root用户的Capability能力限制.Seccomp系统调用过滤.Apparmor的 MAC ...

  4. 超大规模商用 K8s 场景下,阿里巴巴如何动态解决容器资源的按需分配问题?

    作者 | 张晓宇(衷源) 阿里云容器平台技术专家 关注『阿里巴巴云原生』公众号,回复关键词"1010",可获取本文 PPT. **导读:**资源利用率一直是很多平台管理和研发人员关 ...

  5. linux内核中用来对共享资源进行隔离,简单理解Docker

    什么是Docker Docker使用Go语言进行开发实现,基于Linux内核的cgroup,namespace,以及AUFS类的Union FS等技术,对进程进行封装隔离,属于操作系统层面的虚拟化技术 ...

  6. 使用 docker 对容器资源进行限制

    在使用 docker 运行容器时,一台主机上可能会运行几百个容器,这些容器虽然互相隔离,但是底层却使用着相同的 CPU.内存和磁盘资源.如果不对容器使用的资源进行限制,那么容器之间会互相影响,小的来说 ...

  7. 资源画像,看得见的容器资源优化助手

    作者:张佐玮(佑祎) 背景介绍 K8s 为集群资源提供了良好的抽象,用户可以直接根据应用的资源需求填写容器资源规格,这种方式有效提升了集群资源的管理效率.然而,一直以来,容器资源规格填写的难题一直都让 ...

  8. Docker容器监控可视化cAdivisor+InfluxDB+Grafana

    问题 在日常的Docker使用过程中, 要想了解容器当前的运行状况 ,  通过docker stats命令就可以很方便的看到当前宿主机上所有容器的CPU,内存以及网络流量等数据 , 但是, docke ...

  9. linux docker 分配资源,Docker 容器资源限制

    Docker 容器资源限制 默认情况下,一个容器并没有资源限制,并且该容器可以使用内核调度的所有资源.Docke提供了在启动容器时设置一些参数来控制该容器使用的内存.cpu和IO. OOME:在lin ...

最新文章

  1. Nginx rewrite正则匹配重写
  2. linux解压tar到目录,在Linux系统中将tar文件解压到不同的目录中的教程
  3. shell模拟php多进程从redis获取数据(一个库多个key值)
  4. pstools psexec 执行文件
  5. Zookeeper基于Java访问-权限
  6. Qt之水平/垂直布局(QBoxLayout、QHBoxLayout、QVBoxLayout)
  7. java util logging_简单日志记录,使用java.util.logging
  8. 大学毕业10年,同学之间的差距是怎样拉开的?答案很现实!
  9. html一级子元素,获取子元素_html/css_WEB-ITnose
  10. Atitit.atiDataStoreService   v2 新特性
  11. html ssi 跟新某个空间数据_新版本|物理虚拟实验5.2.5版本即将上线
  12. c语言precede函数怎么构造,数据结构——栈的应用(表达式求值)(C语言)
  13. win 平台上排名第二的下载工具——IDM
  14. 由内而外全面进化,影像娱乐都出彩,vivo S12 Pro上手
  15. YTU OJ-1329: 手机尾号评分
  16. php实例-微信第三方登录
  17. 偏向锁,轻量级锁,重量级锁的核心原理
  18. qq邮箱隐藏代码html,QQ邮箱原来这么好用,4个隐藏设置格调满满
  19. python 数学公式_python的数学算法函数及公式用法
  20. qq邮箱服务器连接错误代码,qq邮箱错误代码103打不开是怎么回事

热门文章

  1. Java常用性能分析工具 jconsole、jvisualvm、 jstat、jinfo、jmap、jhat、jstack
  2. 只收藏不点赞的人是什么心理???
  3. 为5—18岁青少年提供营地教育,漫族完成百万级天使轮融资
  4. Linux时间子系统(二) 软件架构
  5. C# 使用NPlot绘图
  6. php 输出 jsonp
  7. 设置屏幕分辨率的函数 - 回复 董勇 的问题
  8. Oracle用户管理(User|Privileges|Role)
  9. 溢信服务转型之代理商技术培训
  10. 为什么不能在SSH(Secure Shell)登录中设置ulimit值?