Kubernetes之路 2 - 利用LXCFS提升容器资源可见性

摘要: 这是本系列的第2篇内容,将介绍在Docker和Kubernetes环境中解决遗留应用无法识别容器资源限制的问题。

图片描述

本系列文章记录了企业客户在应用Kubernetes时的一些常见问题

第一篇:Java应用资源限制的迷思
第二篇:利用LXCFS提升容器资源可见性
第三篇:解决服务依赖
这是本系列的第2篇内容,将介绍在Docker和Kubernetes环境中解决遗留应用无法识别容器资源限制的问题。

Linuxs利用Cgroup实现了对容器的资源限制,但在容器内部依然缺省挂载了宿主机上的procfs的/proc目录,其包含如:meminfo, cpuinfo,stat, uptime等资源信息。一些监控工具如free/top或遗留应用还依赖上述文件内容获取资源配置和使用情况。当它们在容器中运行时,就会把宿主机的资源状态读取出来,引起错误和不便。

LXCFS简介

社区中常见的做法是利用 lxcfs来提供容器中的资源可见性。lxcfs 是一个开源的FUSE(用户态文件系统)实现来支持LXC容器,它也可以支持Docker容器。

LXCFS通过用户态文件系统,在容器中提供下列 procfs 的文件。

/proc/cpuinfo
/proc/diskstats
/proc/meminfo
/proc/stat
/proc/swaps
/proc/uptime

LXCFS的示意图如下

图片描述

比如,把宿主机的 /var/lib/lxcfs/proc/memoinfo 文件挂载到Docker容器的/proc/meminfo位置后。容器中进程读取相应文件内容时,LXCFS的FUSE实现会从容器对应的Cgroup中读取正确的内存限制。从而使得应用获得正确的资源约束设定。

Docker环境下LXCFS使用

注:

  • 本文采用CentOS 7.4作为测试环境,并已经开启FUSE模块支持。
  • Docker for Mac/Minikube等开发环境由于采用高度剪裁过的操作系统,无法支持FUSE,并运行LXCFS进行测试。
    安装 lxcfs 的RPM包
wget https://copr-be.cloud.fedoraproject.org/results/ganto/lxd/epel-7-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:/proc/cpuinfo:rw \-v /var/lib/lxcfs/proc/diskstats:/proc/diskstats:rw \-v /var/lib/lxcfs/proc/meminfo:/proc/meminfo:rw \-v /var/lib/lxcfs/proc/stat:/proc/stat:rw \-v /var/lib/lxcfs/proc/swaps:/proc/swaps:rw \-v /var/lib/lxcfs/proc/uptime:/proc/uptime:rw \ubuntu:16.04 /bin/bashroot@f4a2a01e61cd:/# freetotal        used        free      shared  buff/cache   available
Mem:         262144         708      261436        2364           0      261436
Swap:             0           0           0

我们可以看到total的内存为256MB,配置已经生效。

lxcfs 的 Kubernetes实践

一些同学问过如何在Kubernetes集群环境中使用lxcfs,我们将给大家一个示例方法供参考。

首先我们要在集群节点上安装并启动lxcfs,我们将用Kubernetes的方式,用利用容器和DaemonSet方式来运行 lxcfs FUSE文件系统。

本文所有示例代码可以通过以下地址从Github上获得

git clone https://github.com/denverdino/lxcfs-initializer
cd lxcfs-initializer

其manifest文件如下

apiVersion: apps/v1beta2
kind: DaemonSet
metadata:name: lxcfslabels:app: lxcfs
spec:selector:matchLabels:app: lxcfstemplate:metadata:labels:app: lxcfsspec:hostPID: truetolerations:- key: node-role.kubernetes.io/mastereffect: NoSchedulecontainers:- name: lxcfsimage: registry.cn-hangzhou.aliyuncs.com/denverdino/lxcfs:2.0.8imagePullPolicy: AlwayssecurityContext:privileged: truevolumeMounts:- name: rootfsmountPath: /hostvolumes:- name: rootfshostPath:path: /

注: 由于 lxcfs FUSE需要共享系统的PID名空间以及需要特权模式,所有我们配置了相应的容器启动参数。

可以通过如下命令在所有集群节点上自动安装、部署完成 lxcfs,是不是很简单?:-)

kubectl create -f lxcfs-daemonset.yaml

那么如何在Kubernetes中使用 lxcfs 呢?和上文一样,我们可以在Pod的定义中添加对 /proc 下面文件的 volume(文件卷)和对 volumeMounts(文件卷挂载)定义。然而这就让K8S的应用部署文件变得比较复杂,有没有办法让系统自动完成相应文件的挂载呢?

Kubernetes提供了 Initializer 扩展机制,可以用于对资源创建进行拦截和注入处理,我们可以借助它优雅地完成对lxcfs文件的自动化挂载。

注: 阿里云Kubernetes集群,已经默认开启了对 Initializer 的支持,如果是在自建集群上进行测试请参见文档开启相应功能

其 manifest 文件如下

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:name: lxcfs-initializer-defaultnamespace: default
rules:
- apiGroups: ["*"]resources: ["deployments"]verbs: ["initialize", "patch", "watch", "list"]
---
apiVersion: v1
kind: ServiceAccount
metadata:name: lxcfs-initializer-service-accountnamespace: default
---
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:name: lxcfs-initializer-role-binding
subjects:
- kind: ServiceAccountname: lxcfs-initializer-service-accountnamespace: default
roleRef:kind: ClusterRolename: lxcfs-initializer-defaultapiGroup: rbac.authorization.k8s.io
---
apiVersion: apps/v1beta1
kind: Deployment
metadata:initializers:pending: []labels:app: lxcfs-initializername: lxcfs-initializer
spec:replicas: 1template:metadata:labels:app: lxcfs-initializername: lxcfs-initializerspec:serviceAccountName: lxcfs-initializer-service-accountcontainers:- name: lxcfs-initializerimage: registry.cn-hangzhou.aliyuncs.com/denverdino/lxcfs-initializer:0.0.2imagePullPolicy: Alwaysargs:- "-annotation=initializer.kubernetes.io/lxcfs"- "-require-annotation=true"
---
apiVersion: admissionregistration.k8s.io/v1alpha1
kind: InitializerConfiguration
metadata:name: lxcfs.initializer
initializers:- name: lxcfs.initializer.kubernetes.iorules:- apiGroups:- "*"apiVersions:- "*"resources:- deployments

注: 这是一个典型的 Initializer 部署描述,首先我们创建了service account lxcfs-initializer-service-account,并对其授权了 “deployments” 资源的查找、更改等权限。然后我们部署了一个名为 “lxcfs-initializer” 的Initializer,利用上述SA启动一个容器来处理对 “deployments” 资源的创建,如果deployment中包含 initializer.kubernetes.io/lxcfs为true的注释,就会对该应用中容器进行文件挂载

我们可以执行如下命令,部署完成之后就可以愉快地玩耍了

kubectl apply -f lxcfs-initializer.yaml

下面我们部署一个简单的Apache应用,为其分配256MB内存,并且声明了如下注释 “initializer.kubernetes.io/lxcfs”: “true”

其manifest文件如下

apiVersion: apps/v1beta1
kind: Deployment
metadata:annotations:"initializer.kubernetes.io/lxcfs": "true"labels:app: webname: web
spec:replicas: 1template:metadata:labels:app: webname: webspec:containers:- name: webimage: httpd:2imagePullPolicy: Alwaysresources:requests:memory: "256Mi"cpu: "500m"limits:memory: "256Mi"cpu: "500m"

我们可以用如下方式进行部署和测试

$ kubectl create -f web.yaml 
deployment "web" created$ kubectl get pod
NAME                                 READY     STATUS    RESTARTS   AGE
web-7f6bc6797c-rb9sk                 1/1       Running   0          32s
$ kubectl exec web-7f6bc6797c-rb9sk freetotal       used       free     shared    buffers     cached
Mem:        262144       2876     259268       2292          0        304
-/+ buffers/cache:       2572     259572
Swap:            0          0          0

我们可以看到 free 命令返回的 total memory 就是我们设置的容器资源容量。

我们可以检查上述Pod的配置,果然相关的 procfs 文件都已经挂载正确

$ kubectl describe pod web-7f6bc6797c-rb9sk
...Mounts:/proc/cpuinfo from lxcfs-proc-cpuinfo (rw)/proc/diskstats from lxcfs-proc-diskstats (rw)/proc/meminfo from lxcfs-proc-meminfo (rw)/proc/stat from lxcfs-proc-stat (rw)
...

在Kubernetes中,还可以通过 Preset 实现类似的功能,篇幅有限。本文不再赘述了。

总结

本文介绍了通过 lxcfs 提供容器资源可见性的方法,可以帮助一些遗留系统更好的识别容器运行时的资源限制。

同时,在本文中我们介绍了利用容器和DaemonSet的方式部署lxcfs FUSE,这不但极大简化了部署。也可以方便地利用Kubernetes自身的容器管理能力,支持lxcfs进程失效时自动恢复,在集群伸缩时也可以保证节点部署的一致性。这个技巧对于其他类似的监控或者系统扩展都是适用的。

另外我们介绍了利用Kubernetes的扩展机制 Initializer,实现对 lxcfs 文件的自动化挂载。整个过程对于应用部署人员是透明的,可以极大简化运维复杂度。同时利用类似的方法,我们可以灵活地定制应用部署的行为,满足业务的特殊要求。

阿里云Kubernetes服务 全球首批通过Kubernetes一致性认证,简化了Kubernetes集群生命周期管理,内置了与阿里云产品集成,也将进一步简化Kubernetes的开发者体验,帮助用户关注云端应用价值创新。

原文链接

干货好文,请关注扫描以下二维码:
图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/522044.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mysql数据库模型相应解释_数据库事务系列-MySQL跨行事务模型

说来和MySQL倒是有缘,毕业的第一份工作就被分配到了RDS团队,主要负责把MySQL弄到云上做成数据库服务。虽说整天和MySQL打交道,但说实话那段时间并没有很深入的理解MySQL内核,做的事情基本都是围绕着MySQL做管控系统,比…

springboot项目jar冲突问题解决

问题:大概意思就是项目中有两个jar,同时是要是想slf4j的接口的,这样程序不知道使用哪个,就会报错了。也不算错,项目照样运行。但是就是报日志错误 SLF4J: Class path contains multiple SLF4J bindings. SLF4J: Found …

火热的云计算,你知道这些吗?

戳蓝字“CSDN云计算”关注我们哦!作者 | Dan Muse译者 | 风车云马如今云计算已经渗透到IT的各个领域,从应用程序到基础设施无处不在。为了了解IT领导者是如何规划各自企业的云战略,Insider Pro采访了数百名技术决策者。面对炙手可热的云计算&…

Kubernetes Ingress 高可靠部署最佳实践

摘要: 在Kubernetes集群中,Ingress作为集群流量接入层,Ingress的高可靠性显得尤为重要,今天我们主要探讨如何部署一套高性能高可靠的Ingress接入层。 简介 在Kubernetes集群中,Ingress是授权入站连接到达集群服务的规则…

容器开启数据服务之旅系列(二):Kubernetes如何助力Spark大数据分析

摘要: 容器开启数据服务之旅系列(二):Kubernetes如何助力Spark大数据分析 (二):Kubernetes如何助力Spark大数据分析 概述 本文为大家介绍一种容器化的数据服务Spark OSS on ACK,允许…

三步走——带你打造一份完美的数据科学家简历|(附件有PPT福利)

摘要: 本文介绍了关于写数据科学家简历的一些技巧,主要包含三个部分,分别为简历前的材料准备,写简历时应注意的地方以及对整个简历的整理。不管你是不是数据科学领域的工作者,本文对于即将求职或找实习的同学而言是一份…

你的目的是什么是谁指使你_电视剧《谁说我结不了婚》第25-27集剧情:魏书帮程璐搞定投资人...

电视剧《谁说我结不了婚》第25-27集剧情介绍电视剧《谁说我结不了婚》第25-27集剧情介绍电视剧《谁说我结不了婚》第25集剧情介绍:程璐向魏书请教感情困扰 田蕾帮徐海峰彻底打垮凯文程璐来找魏书诉苦,小哈最近不但躲着她,还撒谎骗她不在上海&…

纪·阿晶的首次AWS之行!

戳蓝字“CSDN云计算”关注我们哦!这是阿晶的第一次AWS之行,在上海,2019世界人工智能大会。一年前,同样在上海,AWS成立其亚太地区首个人工智能研究院。还记得当时振奋人心的官宣:AWS上海人工智能研究院将重点…

阿里云与WPS深度合作,开放数据处理生态

摘要: 在3月28日举行的2018云栖大会-深圳峰会上,阿里云与金山办公达成深度合作,WPS在线预览与格式转换能力落地阿里云。标志着阿里云存储开放的数据湖体系不但面向计算引擎,还面向应用开放。 在3月28日举行的2018云栖大会-深圳峰会…

interp1函数matlab_【原创】干货:用MATLAB搭建电化学单粒子模型(中)

上一期讲到Eq.1中所需要求解的参数,我们已经获取了3个,需要注意的是,上期所获得的电化学反应过电势已经转化成时间的函数,接下来只需要求正负极的固相电势随时间的变化就可以了。Eq.1 固相电势与材料的soc或体相锂离子浓度…

官宣!CSDN“2019 优秀 AI、IoT 应用案例 TOP 30+”重磅发布!

戳蓝字“CSDN云计算”关注我们哦!作者 | 王金许、伍杏玲责编 | 屠敏出品 | CSDN(ID:CSDNnews)「Talk is cheap. Show me the case.」在 AI、IoT 技术当道的时代下,空泛的概念炒作永远说服不了抱有质疑的消费者。如今随…

用html设计一个logo页面_如何设计一个Logo?——Bobu Africa旅行品牌Logo设计

负空间Logo听起来很牛逼,但是到底要怎么做?Bobu Africa是一家位于肯尼亚,主营泛非洲奢侈旅行与工艺品销售的品牌。Africa当然指的是其主要业务范围——非洲。Bobu则是猴面包树Baobabu的一种本地化称谓。树形Logo通常的设计方式大概是写实剪影…

云HBase小组成功抢救某公司自建HBase集群,挽救30+T数据

摘要: 使用过开源HBase的人都知道,运维HBase是多么复杂的事情,集群大的时候,读写压力大,配置稍微不合理一点,就可能会出现集群状态不一致的情况,糟糕一点的直接导致入库、查询某个业务表不可用,…

来来来!一次搞定各种数据库 SQL 执行计划:MySQL、Oracle

执行计划(execution plan,也叫查询计划或者解释计划)是数据库执行 SQL 语句的具体步骤,例如通过索引还是全表扫描访问表中的数据,连接查询的实现方式和连接的顺序等。如果 SQL 语句性能不够理想,我们首先应…

linux 升级mysql版本 lamp_Linux 下安装 LAmp及配置

第一步:配置防火墙(默认情况下,端口80和3306是拒绝访问的,在防火墙上进行配置):vi /etc/sysconfig/iptables(在"COMMIT"的上一行加上如下两句)-A INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT(允许8…

阿里云Redis混合存储典型场景:如何轻松搭建视频直播间系统

摘要: 本文主要介绍视频直播间系统,以及如何使用阿里云Redis混合存储实例方便快捷的构建大数据量,低延迟的视频直播间服务。 背景 视频直播间作为直播系统对外的表现形式,在整个系统中处于核心地位。通常除了视频直播窗口外&#…

mysql遇见Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggre的问题

报错如下: Expression #2 of SELECT list is not in GROUP BY clause and contains nonaggregated column ‘sss.month_id’ which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_modeonly_full_group_by问题出现…

融合非负矩阵分解和图全变分的歌曲推荐算法

摘要: Kirell Benzi, Vassilis Kalofolias, Xavier Bresson and Pierre Vandergheynst Signal Processing Laboratory 2 (LTS2), Swiss Federal Institute of Technology (EPFL) Kirell Benzi, Vassilis Kalofolias, Xavier Bresson and Pierre Vandergheynst Sign…

Facebook面向所有用户开放人脸识别功能;福布斯美国最具创新力领袖公布;AMD:将发新BIOS 优化三代锐龙加速性能……...

戳蓝字“CSDN云计算”关注我们哦!嗨,大家好,重磅君带来的【云重磅】特别栏目,如期而至,每周五第一时间为大家带来重磅新闻。把握技术风向标,了解行业应用与实践,就交给我重磅君吧!重…

Python数据挖掘与机器学习技术入门实战

摘要: 什么是数据挖掘?什么是机器学习?又如何进行Python数据预处理?本文将带领大家一同了解数据挖掘和机器学习技术,通过淘宝商品案例进行数据预处理实战,通过鸢尾花案例介绍各种分类算法。 课程主讲简介&a…