您现在的位置是:首页 > 文章详情

基于CPU使用率动态调整Worker数量(二):容器环境

日期:2023-10-25点击:126

NGINX 向云原生演进,All in OpenNJet


上篇我们讲解了基于CPU使用率动态调整Worker数量(一):物理机,本篇我们将讲解容器环境的操作。

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

🧚OpenNJet 已经更新到1.2.2,更新了Proxy protocol V2协议,支持设置TLV 字段值新功能,修复了配置主动健康检查后,reload会导致进程core、upstream 轮询算法bug等问题,🔍 Gitee 了解详情。

OpenNJet  最早是基于 NGINX1.19 基础 fork 并独立演进,OpenNJet 具有高性能、稳定、易扩展的特点,同时也解决了 NGINX 长期存在的难于动态配置、管理功能影响业务等问题。

邮件组  官网

原文链接:https://my.oschina.net/u/6606114/blog/10123061
关注公众号

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。

持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。

转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。

文章评论

共有0条评论来说两句吧...

文章二维码

扫描即可查看该文章

点击排行

推荐阅读

最新文章