🙈 By 陈潞波 2023-10-19
1. 容器环境中资源分配
我们都知道在启动一个容器的时候一般都会限制该容器可使用的资源,比如cpu、内存等。而启动容器后,容器里相关资源配置文件都是宿主机的资源信息,比如Linux利用Cgroup实现了对容器的资源限制,但在容器内部依然缺省挂载了宿主机上的procfs的/proc目录,其包含如:meminfo, cpuinfo,stat, uptime等资源信息。一些监控工具如free/top或遗留应用还依赖上述文件内容获取资源配置和使用情况。当它们在容器中运行时,就会把宿主机的资源状态读取出来,这样就导致我们并没有获取到真实的容器环境里的资源信息。为此,我们需要借助lxcfs,才能够在容器中获取到正确的资源信息。
2.docker容器环境
在宿主机安装lxcfs,将/var/lib/lxcfs/proc/stat文件mount到容器内,方法如下:
wget http://copr-be.cloud.fedoraproject.org/results/ganto/lxc3/epel-7-x86_64/01041891-lxcfs/lxcfs-3.1.2-0.2.el7.x86_64.rpm
yum -y localinstall lxcfs-3.1.2-0.2.el7.x86_64.rpm
如果缺少其他依赖,可从如下地址下载对应的rpm包安装
https://copr-be.cloud.fedoraproject.org/results/ganto/lxc3/epel-7-x86_64/01041881-lxc/
Docker 启动服务的时候需要挂载,比如启动的时候设置cpu个数是3,则容器启动后,会在容器中获取到的实际cpu格式就是3
docker run -it --cpus 3 -v /root/clb/njet1.0:/root/clb/njet1.0 \
-v /var/lib/lxcfs/proc/stat:/proc/stat:rw \
-v /var/lib/lxcfs/proc/cpuinfo:/proc/cpuinfo:rw centos:7 /bin/bash
3. k8s容器环境
方法一:
跟docker环境一样,在宿主机安装lxcfs, 然后在我们服务的yaml文件中进行volumn挂载的设置,映射到容器中
方法二:
可以参照阿里云的一个解决方案: https://developer.aliyun.com/article/566208
该方案介绍了通过 lxcfs 提供容器资源可见性的方法,可以帮助一些遗留系统更好的识别容器运行时的资源限制。
同时,在该文中介绍了利用DaemonSet的方式部署lxcfs FUSE,这不但极大简化了部署。也可以方便地利用Kubernetes自身的容器管理能力,支持lxcfs进程失效时自动恢复,在集群伸缩时也可以保证节点部署的一致性。这个技巧对于其他类似的监控或者系统扩展都是适用的。
另外该文还介绍了利用Kubernetes的扩展机制 Initializer,实现对 lxcfs 文件的自动化挂载。整个过程对于应用部署人员是透明的,可以极大简化运维复杂度。同时利用类似的方法,我们可以灵活地定制应用部署的行为,满足业务的特殊要求
DaemonSet部署lxcfs FUSE:
git clone https://github.com/denverdino/lxcfs-initializer
cd lxcfs-initializer
其manifest文件如下:
apiVersion: apps/v1beta2
kind: DaemonSet
metadata:
name: lxcfs
labels:
app: lxcfs
spec:
selector:
matchLabels:
app: lxcfs
template:
metadata:
labels:
app: lxcfs
spec:
hostPID: true
tolerations:
- key: node-role.kubernetes.io/master
effect: NoSchedule
containers:
- name: lxcfs
image: registry.cn-hangzhou.aliyuncs.com/denverdino/lxcfs:3.0.4
imagePullPolicy: Always
securityContext:
privileged: true
volumeMounts:
- name: cgroup
mountPath: /sys/fs/cgroup
- name: lxcfs
mountPath: /var/lib/lxcfs
mountPropagation: Bidirectional
- name: usr-local
mountPath: /usr/local
volumes:
- name: cgroup
hostPath:
path: /sys/fs/cgroup
- name: usr-local
hostPath:
path: /usr/local
- name: lxcfs
hostPath:
path: /var/lib/lxcfs
type: DirectoryOrCreate
kubectl apply -f lxcfs-daemonset.yaml