前言:部署之前,我们需要先了解Lxcfs 是什么,使用它可以达到什么样的效果。 LXCFS:FUSE filesystem for LXC 是一个常驻服务,它启动以后会在指定目录中自行维护与上面列出的/proc目录中的文件同名的文件,容器从lxcfs维护的/proc文件中读取数据时 lxcfs.tar.gz cd lxcfs-admission-webhook kubectl create ns lxcfs #创建lxcfs 这个命名空间,接下来的资源就部署在这个命名空间内 部署lxcfs daemonset kubectl -n lxcfs apply -f deployment/lxcfs-daemonset.yaml 部署lxcfs admission webhook 1/1 Running 0 3m8s 验证效果 启用lxcfs 对于要使用 lxcfs 的namespace,使用如下命令启用lxcfs admission webhook
LXCFS简介 社区中常见的做法是利用lxcfs来提供容器中的资源可见性。lxcfs 是一个开源的FUSE(用户态文件系统)实现来支持LXC容器,它也可以支持Docker容器。 -x86_64/00486278-lxcfs/lxcfs-2.0.5-3.el7.centos.x86_64.rpm yum install lxcfs-2.0.5-3.el7.centos.x86_64 .rpm 启动 lxcfs lxcfs /var/lib/lxcfs & 测试 docker run -it -m 256m \ -v /var/lib/lxcfs/proc/cpuinfo LXCFS的kubernets实践 在kubernetes中使用lxcfs需要解决两个问题: 第一个问题是每个node上都要启动lxcfs,这个简单,部署一个daemonset就可以了。 第二个问题是将lxcfs维护的/proc文件挂载到每个容器中 在集群节点上安装并启动lxcfs,我们将用Kubernetes的方式,用利用容器和DaemonSet方式来运行 lxcfs FUSE文件系统
LXCFS提升容器资源可见性https://yq.aliyun.com/articles/566208 使用二进制lxcfs包进行安装部署,下载地址为:https://github.com/cuisongliu /lxcfs/releases/download/lxcfs-3.0.3-binary-install/lxcfs.tar.gz 确保系统中是否有fusermount命令,系统使用fusermount进行卸载挂载点 lxcfs安装步骤 操作是不是很easy?下面我们对比一下效果。 未使用lxcfs效果图 接下来我们在安装了lxcfs的主机上同样执行命令 docker run --rm -it -m 200m \ -v /var/lib/lxcfs/proc/cpuinfo 使用lxcfs效果图 到这里lxcfs已经生效了。
上面提到的问题,可以通过 LXCFS 方法来解决。 LXCFS 简介 社区中常见的做法是利用 lxcfs 来提供容器中的资源可见性。 lxcfs 是一个开源的FUSE(用户态文件系统)实现来支持LXC容器,它也可以支持Docker容器。 LXCFS通过用户态文件系统,在容器中提供下列 procfs 的文件。 社区推出另一个项目 https://github.com/denverdino/lxcfs-admission-webhook 通过 Admission Webhook 给 Pod 注入 LXCFS 设置 # 查看 lxcfs 是否部署成功 $ kubectl get pods -n default | grep lxcfs lxcfs-4crr4 1/1 Running 0 $ deployment/uninstall.sh 清理 lxcfs $ kubectl delete -f deployment/lxcfs-daemonset.yaml 总结 lxcfs 支持容器镜像
前言 上一篇文章,我们介绍了,k8s1.12之前的版本怎么使用lxcfs,k8s1.12以下版本设置LXCFS。 先说下为什么需要使用lxcfs,首先容器获取不到真实内存与cpu,假设一个宿主机是384G内存的服务器,容器java应用配置了jvm参数,配额4G,但是堆内存确是按照了384G去分,这样产生的后果就会很大了 lxcfs的挂载有很多方式,可以podpreset,直接挂载等,下面我们来介绍下怎么直接挂载。 2. 使用k8s Daemonsets设置lxcfs apiVersion: apps/v1beta2 kind: DaemonSet metadata: name: lxcfs namespace: default labels: app: lxcfs spec: selector: matchLabels: app: lxcfs template:
lxcfs 是通过文件挂载的方式,把 cgroup 中关于系统的相关信息读取出来,通过 docker 的 volume 挂载给容器内部的 proc 系统。 image.png 下面我们来说下如何在tke集群用lxcfs来对容器资源进行视图隔离。 非 tlinux2.4操作系统tke集群开启lxcfs 如果你的节点操作系统部署tlinux2.4,是centos或者ubuntu,则需要参考文档在集群部署下lxcfs的DaemonSet,具体yaml name: lxcfs spec: selector: matchLabels: name: lxcfs template: metadata: labels : - name: lxcfs hostPath: path: /var/lib/lxc/lxcfs type: DirectoryOrCreate
项目地址: https://github.com/lxc/lxcfs lxcfs安装方法 yum install fuse fuse-lib fuse-devel libtool git clone git://github.com/lxc/lxcfs cd lxcfs . /configure make make install 安装完成后,我们可以在前台启动测试下: mkdir -p /var/lib/lxcfs # 先创建下目录 lxcfs /var/lib/lxcfs 具体启动脚本如下: lxcfs自启动脚本 cat /lib/systemd/system/lxcfs.service Unit Description=FUSE filesystem for LXC container Before=lxc.service Documentation=man:lxcfs(1) Service ExecStart=/usr/local/bin/lxcfs /var/lib
例如当容器内的应用如果需要读取/proc/meminfo的信息时,请求就会被导向lxcfs,而lxcfs又会通过cgroup的信息来返回正确的值最终使得容器内的应用正确识别 3.1 在k8s中部署lxcfs created 查看部署结果,会运行一个名为lxcfs-admission-webhook-deployment的pod,以及在所有节点上以ds的方式运行一个lxcfs的pod kubectl get =enabled 为指定的命名空间开启lxcfs注入,开启后该命名空间下所有新创建的Pod都将被注入lxcfs 3.3 还原 如果是要还原安装的环境,执行目录中的卸载脚本即可 # . (rw) /proc/loadavg from lxcfs-proc-loadavg (rw) /proc/meminfo from lxcfs-proc-meminfo (rw ) /proc/stat from lxcfs-proc-stat (rw) /proc/swaps from lxcfs-proc-swaps (rw) /proc
_64/01041891-lxcfs/lxcfs-3.1.2-0.2.el7.x86_64.rpm; rpm -ivh lxcfs-3.1.2-0.2.el7.x86_64.rpm --force -- nodeps 检查一下安装是否成功:lxcfs -h 启动 lxcfs 直接后台启动:lxcfs /var/lib/lxcfs & 通过 systemd 启动(推荐) touch /usr/lib/systemd /system/lxcfs.service cat > /usr/lib/systemd/system/lxcfs.service <<EOF [Unit] Description=lxcfs [Service 验证开启 lxcfs systemctl start lxcfs # 启动一个容器,用 lxcfs 的 /proc 文件映射到容器中的 /proc 文件,容器内存设置为 256M: docker run 四、lxcfs 的 Kubernetes 实践 在kubernetes中使用lxcfs需要解决两个问题: 第一个问题是每个node上都要启动 lxcfs; 第二个问题是将 lxcfs 维护的 /proc
今天翻了一个PVE集群的日志,发现一个持续报错,单一错误居然把/var/log/syslog撑到了600M,主要就一个错误 <14>Nov 15 09:20:10 xnode010 lxcfs[2201 proc/stat, 25054664 in cpuacct.usage_all; unable to determine idle time <14>Nov 15 09:20:08 xnode010 lxcfs ● lxcfs.service - FUSE filesystem for LXC Loaded: loaded (/lib/systemd/system/lxcfs.service; enabled (1) Main PID: 2201 (lxcfs) Tasks: 11 (limit: 308995) Memory: 28.5M CGroup: /system.slice/lxcfs.service └─2201 /usr/bin/lxcfs /var/lib/lxcfs Nov 15 09:35:27 xnode010 lxcfs[2201]: proc_fuse.c:
├─dbus-daemon ├─irqbalance───{irqbalance} ├─2*[iscsid] ├─lvmetad ├─lxcfs ───2*[{lxcfs}] ├─networkd-dispat───{networkd-dispat} ├─nginx───2*[nginx] ... ├─lxcfs───2*[{lxcfs}] 你可以使用 -t 选项显示完整的线程名称,如果要隐藏线程并仅显示进程,请使用 -T 选项。 通常,pstree 会在屏幕上显示多行输出。
2、方案探索 业界目前普遍采用 lxcfs 的方案解决容器隔离漏洞问题。 但是 lxcfs 方案有其固有的缺陷: 1)需要依赖额外的组件 lxcfs; 2)lxcfs 在用户态基于 FUSE 实现,开销相比内核更大; 3)lxcfs 稳定性比较差,可能在容器的生命周期状态切换时触发 为缓减全局影响,高稳场景会设置每pod对应一个 lxcfs 服务进程 3、方案实现 CgroupFS 方案基于内核态实现,其核心设计为,设计一个新的虚拟文件系统,其中包含需要实现的容器视角的 /proc
社区主流的解决方案是通过部署 FUSE 实现的 LXCFS 来实现/proc/cpuinfo, /proc/meminfo等资源展示按容器隔离。 这个方案需要在节点部署 LXCFS 文件系统, 也需要往 POD sepc 中插入相关 volume 和挂载点的配置。 详情可以参考:Kubernetes Demystified: Using LXCFS to Improve Container Resource Visibility[3] Tencnet Linux内核中实现了类似 LXCFS 特性,用户无需在节点部署 LXCFS 文件系统, 也无需修改 POD spec。 ] pr#81775: https://github.com/kubernetes/kubernetes/issues/81775 [3] Kubernetes Demystified: Using LXCFS
将会同时安装下列软件: bridge-utils libgbinder libglibutil liblxc-common liblxc1 libpam-cgfs lxc lxc-utils lxcfs 获取:1 http://mirrors.aliyun.com/ubuntu focal/universe amd64 lxcfs amd64 4.0.3-0ubuntu1 [65.3 kB] 获取:2 准备解压 .../00-lxcfs_4.0.3-0ubuntu1_amd64.deb ... 正在解压 lxcfs (4.0.3-0ubuntu1) ... 正在设置 lxcfs (4.0.3-0ubuntu1) ... Created symlink /etc/systemd/system/multi-user.target.wants/lxcfs.service → /lib /systemd/system/lxcfs.service
2、方案探索业界目前普遍采用 lxcfs 的方案解决容器隔离漏洞问题。 但是 lxcfs 方案有其固有的缺陷:1)需要依赖额外的组件 lxcfs;2)lxcfs 在用户态基于 FUSE 实现,开销相比内核更大;3)lxcfs 稳定性比较差,可能在容器的生命周期状态切换时触发 图片每个 container 都需要对应一个 lxcfs 服务进程3、方案实现图片CgroupFS 方案基于内核态实现,其核心设计为,设计一个新的虚拟文件系统,其中包含需要实现的容器视角的 /proc、
修复 Ubuntu16.04 lxcfs 升级造成 pod 退出问题 K8s 集群在 Ubuntu16.04 下默认安装低版本 lxcfs,在对 lxcfs 升级后,会导致 pod 无法正常运行。 原因是低版本 lxcfs 挂载 cgroupfs,kubelet 在启动时会使用 lxcfs 已挂载 cgroupfs,而非系统 /sys/fs/cgroup。 lxcfs 在升级新版本后,旧 cgroupfs 会被解挂,导致 kubelet 对 pod cgroup 操作失败。TKE 发行版修复了该问题。
lxcfs & 固定 IP 助力任务精准调度 转码的业务与通用的业务请求不同,在开始转码前是无法预知当前转码请求的资源消耗量的。比如:游戏直播视频和课堂教育视频,资源的消耗量会相差一个量级。 为了解决这一问题,TKE 支持 lxcfs 配置,通过 lxcfs 可以精准获取当前 pod 的实际负载信息。
直观的做法就是容器不挂载宿主机的该目录就可以了,那么实际上可以通过 lxcfs 来实现隔离,lxcfs 在宿主机上维护进程组的信息,然后容器启动的时候将 lxcfs 维护的进程组信息所在的目录挂载到容器的
type: RollingUpdate template: metadata: annotations: initializer.kubernetes.io/lxcfs type: RollingUpdate template: metadata: annotations: initializer.kubernetes.io/lxcfs
| lxcfs一定程度上解决了这个问题 ? lxcfs可以让容器有更好的资源可视性,如内存,cpuset等,原理也非常简单,就是把proc下的一些文件还在给容器,容器内进程读取资源信息时系统调用会被lxcfs拦截,然后到cgroup下去查该进程资源配额信息进行计算 | 然鹅,lxcfs的缺陷 第一,支持lxcfs的运行时甚少 第二,用户使用时不透明,需要自行挂载很多文件不友好 第三,由于第二点,你就得去开发一些特性去支持它,主流方式有几种 1.k8s上监听一些对象的创建