首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >k8s1.12以下版本设置LXCFS

k8s1.12以下版本设置LXCFS

作者头像
SY小站
发布于 2020-06-15 03:53:37
发布于 2020-06-15 03:53:37
1.1K00
代码可运行
举报
文章被收录于专栏:SY小站的专栏SY小站的专栏
运行总次数:0
代码可运行

1. LXCFS简介

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

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

代码语言:javascript
代码运行次数:0
运行
复制
/proc/cpuinfo
/proc/diskstats
/proc/meminfo
/proc/stat
/proc/swaps
/proc/uptime

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

2. Docker环境下LXCFS使用

安装 lxcfs 的RPM包

代码语言:javascript
代码运行次数:0
运行
复制
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

代码语言:javascript
代码运行次数:0
运行
复制
lxcfs /var/lib/lxcfs &

测试

代码语言:javascript
代码运行次数:0
运行
复制
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/bash

结果

代码语言:javascript
代码运行次数:0
运行
复制
[root@node1 ~]# 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/bash
root@6bcd804eef79:/# free -m
              total        used        free      shared  buff/cache   available
Mem:            256           0         254         189           0         254
Swap:           256           0         256
root@6bcd804eef79:/#

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

3. LXCFS的kubernets实践

kubernetes中使用lxcfs需要解决两个问题:

第一个问题是每个node上都要启动lxcfs,这个简单,部署一个daemonset就可以了。

第二个问题是将lxcfs维护的/proc文件挂载到每个容器中

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

代码语言:javascript
代码运行次数:0
运行
复制
git clone https://github.com/denverdino/lxcfs-initializer
cd lxcfs-initializer

lxcfs-daemonset

代码语言:javascript
代码运行次数:0
运行
复制
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
代码语言:javascript
代码运行次数:0
运行
复制
kubectl apply -f lxcfs-daemonset.yaml

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

lxcfs-initializer

Initializer功能开启

在Kubernetes 1.13中initializers还是一个alpha特性,需要在Kube-apiserver中添加参数开启。

这里使用的是kubernets 1.12,设置方法是一样的:

代码语言:javascript
代码运行次数:0
运行
复制
--enable-admission-plugins="Initializers,NamespaceLifecycle,NamespaceExists,LimitRanger,SecurityContextDeny,ServiceAccount,ResourceQuota"
--runtime-config=admissionregistration.k8s.io/v1alpha1

--enable-admission-plugins--admission-control互斥,如果同时设置,kube-apiserver启动报错:

代码语言:javascript
代码运行次数:0
运行
复制
error: [admission-control and enable-admission-plugins/disable-admission-plugins flags are mutually exclusive, 
enable-admission-plugins plugin "--runtime-config=admissionregistration.k8s.io/v1alpha1" is unknown]

InitializerConfiguration

InitializerConfiguration资源中定义了一组的initializers

每个initializer有一个名字和多个规则,规则中是它要作用的资源,例如下面的initializers中只有一个initializer,名称为podimage.example.com,作用于v1版本的pods。

代码语言:javascript
代码运行次数:0
运行
复制
apiVersion: admissionregistration.k8s.io/v1alpha1
kind: InitializerConfiguration
metadata:
  name: example-config
initializers:
  # the name needs to be fully qualified, i.e., containing at least two "."
  - name: podimage.example.com
    rules:
      # apiGroups, apiVersion, resources all support wildcard "*".
      # "*" cannot be mixed with non-wildcard.
      - apiGroups:
          - ""
        apiVersions:
          - v1
        resources:
          - pods

在kubernets中创建了上面的initializers之后,新建的pod在pending阶段,metadata中会添加一个initializer列表:

代码语言:javascript
代码运行次数:0
运行
复制
metadata:
  creationTimestamp: 2019-01-09T08:56:36Z
  generateName: echo-7cfbbd7d49-
  initializers:
    pending:
    - name: podimage.example.com

注意需要加上参数--include-uninitialized=true才能看到处于这个阶段的Pod:

metadata中initializers列表不为空的Pod,处于正在等待初始化状态,需要部署一个initializer controller对处于这个阶段中的pod完成初始化后, pod才能退出pending状态。

initializer controller需要自己根据需要实现。

Initializer Controller

initializer controller监听指定类型的resource,当发现有新创建的resouce创建时,通过检查resource的metadata中的initializer名单,决定是否要对resource进行初始化设置,并且在完成设置之后,需要将对应的initializer名单从resource的metadata中删除,否则resource就一直处于等待初始化设置的状态。

实例:

代码语言:javascript
代码运行次数:0
运行
复制
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: lxcfs-initializer-default
  namespace: default
rules:
- apiGroups: ["*"]
  resources: ["pods"]
  verbs: ["initialize", "update", "patch", "watch", "list"]
---
apiVersion: v1
kind: ServiceAccount
metadata:
  name: lxcfs-initializer-service-account
  namespace: default
---
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: lxcfs-initializer-role-binding
subjects:
- kind: ServiceAccount
  name: lxcfs-initializer-service-account
  namespace: default
roleRef:
  kind: ClusterRole
  name: lxcfs-initializer-default
  apiGroup: rbac.authorization.k8s.io
---
apiVersion: apps/v1
kind: Deployment
metadata:
  initializers:
    pending: []
  labels:
    app: lxcfs-initializer
  name: lxcfs-initializer
spec:
  replicas: 1
  selector:
    matchLabels:
      app: lxcfs-initializer
  template:
    metadata:
      labels:
        app: lxcfs-initializer
    spec:
      serviceAccountName: lxcfs-initializer-service-account
      containers:
        - name: lxcfs-initializer
          image: registry.cn-hangzhou.aliyuncs.com/denverdino/lxcfs-initializer:0.0.4
          imagePullPolicy: Always
          args:
            - "-annotation=initializer.kubernetes.io/lxcfs"
            - "-require-annotation=true"
---
apiVersion: admissionregistration.k8s.io/v1alpha1
kind: InitializerConfiguration
metadata:
  name: lxcfs.initializer
initializers:
  - name: lxcfs.initializer.kubernetes.io
    rules:
      - apiGroups:
          - "*"
        apiVersions:
          - "*"
        resources:
          - pods

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

代码语言:javascript
代码运行次数:0
运行
复制
kubectl apply -f lxcfs-initializer.yaml

下面我们部署一个简单的Apache应用

为其分配256MB内存,并且声明了如下注释 "initializer.kubernetes.io/lxcfs": "true"

web.yaml:

代码语言:javascript
代码运行次数:0
运行
复制
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: web
  name: web
spec:
  replicas: 1
  selector:
    matchLabels:
      app: web
  template:
    metadata:
      annotations:
        "initializer.kubernetes.io/lxcfs": "true"
      labels:
        app: web
    spec:
      containers:
        - name: web
          image: httpd:2.4.32
          imagePullPolicy: Always
          resources:
            requests:
              memory: "256Mi"
              cpu: "500m"
            limits:
              memory: "256Mi"
              cpu: "500m"
代码语言:javascript
代码运行次数:0
运行
复制
kubectl apply -f web.yaml

验证

代码语言:javascript
代码运行次数:0
运行
复制
kubectl exec web-7f6bc6797c-rb9sk free
             total       used       free     shared    buffers     cached
Mem:        262144       2876     259268       2292          0        304
-/+ buffers/cache:       2572     259572
Swap:            0          0          0
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-06-06,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 SY技术小站 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
Kubernetes 中利用 LXCFS 控制容器资源可见性
Linux 利用 Cgroup 实现了对容器的资源限制,但在容器内部依然缺省挂载了宿主机上的 procfs 的 /proc 目录,其包含如:meminfo、cpuinfo、stat、uptime 等资源信息。一些监控工具如 free、top 或 业务应用还依赖上述文件内容获取资源配置和使用情况。当它们在容器中运行时,就会把宿主机的资源状态读取出来,导致资源设置不对。
YP小站
2020/06/16
3.9K7
Kubernetes 中利用 LXCFS 控制容器资源可见性
docker实践(4) docker资源限制和lxcfs实现对容器资源视图隔离
docker 是通过 CPU cgroups 来限制容器使用的cpu上限,而和CPU groups有关的三个比较重要的参数是: cpu.cfs_quota_us、cpu.cfs_period_us、cpu.shares.
黄规速
2023/12/10
2.8K0
docker实践(4) docker资源限制和lxcfs实现对容器资源视图隔离
k8s1.12以上版本设置LXCFS
上一篇文章,我们介绍了,k8s1.12之前的版本怎么使用lxcfs,k8s1.12以下版本设置LXCFS。
SY小站
2020/06/15
1.1K0
通过lxcfs限制docker使用的内存和CPU的实验
项目地址: https://github.com/lxc/lxcfs lxcfs安装方法 yum install fuse fuse-lib fuse-devel libtool git clone git://github.com/lxc/lxcfs cd lxcfs ./bootstrap.sh ./configure make make install 安装完成后,我们可以在前台启动测试下: mkdir -p /var/lib/lxcfs # 先创建下目录 lxcfs /var/lib/lxcfs
保持热爱奔赴山海
2021/02/14
2.7K0
在k8s中解决pod资源的正确识别
在使用docker作为容器引擎的时候,可以通过添加--memory、--cpus及更多参数来限制容器可用的cpu和内存,具体参数可以参考docker资源限制,docker对容器进行限制的原理实际上是利用Linux内核的cgroups实现的,cgroups可以限制、记录、隔离进程组所使用的物理资源(包括:CPU、memory、IO 等),为容器实现虚拟化提供了基本保证,是构建Docker等一系列虚拟化管理工具的基石
仙人技术
2021/03/29
2.4K0
在k8s中解决pod资源的正确识别
利用LXCFS增强容器隔离性和资源可见性
JVM会根据宿主机的内存去分配堆内存,所以经常在给容器配额的场景下直接导致java类应用起不来,当然如java10会更好的适配容器,所以本文通过介绍lxcfs来解决容器里面资源可见性问题,让容器内看到的是真实的容器配额资源量。
sealyun
2019/07/25
1.2K0
Lxcfs在容器集群中的使用
背景:我们知道在k8s 的pod 内,使用top/free/df等命令,展示的状态信息是从/proc目录中的相关文件里读取出来的,这些文件默认是读取pod所在节点主机对应文件的数据。
keepyan
2020/03/06
3K0
Lxcfs在容器集群中的使用
Docker容器资源限制问题&LXCFS
Linux利用CGroup实现了对容器资源的限制,但是在容器内部还是默认挂载宿主机 /proc 目录下的资源信息文件,如:meminfo,cpuinfo,stat,uptiem,等。当进入Containers执行free,df,top等命令的时候,这时候默认读取的是 /proc 目录内的资源信息文件内容,而这些资源信息文件使用的是宿主机的,所以我们看到的是宿主机的使用信息。
chen1900s
2022/06/09
1.2K0
深度剖析Kubernetes动态准入控制之Initializers
Author: xidianwangtao@gmail.com Admission Controll的最佳配置 配置过kube-apiserver的同学一定记得这个配置--admission-control或者--admission-control-config-file,你可以在这里顺序的配置你想要的准入控制器,默认是AlwaysAdmit。 在Kubernetes 1.9中,所有允许的控制器列表如已经支持多达32个: AlwaysAdmit, AlwaysDeny, AlwaysPullImag
Walton
2018/04/16
1.8K0
声明式Api及其实际应用
这篇文章, 我将按照自己的理解结合我阅读过的文章给大家讲讲关于声明式API这个概念
用户11097514
2024/07/28
2760
声明式Api及其实际应用
k8s on eks
虚拟 kubernetes 是一种多租户 kubernetes 的运行方式,有兴趣的可以阅读这篇文章
王磊-字节跳动
2020/08/25
2.1K0
kubernetes Admission Controller原理介绍
admission controller非常有用,也是经常会用到的k8s的一个扩展方式,今天在源码级别对其做一下介绍,以及如何自己去开发一个admission controller.
sealyun
2019/07/25
1.4K0
kubernetes 自定义资源(CRD)的校验
在以前的版本若要对 apiserver 的请求做一些访问控制,必须修改 apiserver 的源代码然后重新编译部署,非常麻烦也不灵活,apiserver 也支持一些动态的准入控制器,在 apiserver 配置中看到的ServiceAccount,NamespaceLifecycle,NamespaceExists,LimitRanger,ResourceQuota 等都是 apiserver 的准入控制器,但这些都是 kubernetes 中默认内置的。在 v1.9 中,kubernetes 的动态准入控制器功能中支持了 Admission Webhooks,即用户可以以插件的方式对 apiserver 的请求做一些访问控制,要使用该功能需要自己写一个 admission webhook,apiserver 会在请求通过认证和授权之后、对象被持久化之前拦截该请求,然后调用 webhook 已达到准入控制,比如 Istio 中 sidecar 的注入就是通过这种方式实现的,在创建 Pod 阶段 apiserver 会回调 webhook 然后将 Sidecar 代理注入至用户 Pod。 本文主要介绍如何使用 AdmissionWebhook 对 CR 的校验,一般在开发 operator 过程中,都是通过对 CR 的操作实现某个功能的,若 CR 不规范可能会导致某些问题,所以对提交 CR 的校验是不可避免的一个步骤。
田飞雨
2019/12/20
2.6K0
kubernetes 自定义资源(CRD)的校验
K8s实现最简单灰度发布
灰度发布又名金丝雀部署,是让部分用户访问到新版本应用,在 Kubernetes 中,可以使用两个具有相同 Pod 标签的 Deployment 来实现金丝雀部署。新版本的副本和旧版本的一起发布。在一段时间后如果没有检测到错误,则可以扩展新版本的副本数量并删除旧版本的应用。
院长技术
2020/06/13
10.5K0
[译]深入剖析 Kubernetes MutatingAdmissionWebhook
对于在数据持久化之前,拦截到 Kubernetes API server 的请求, Admissioncontrollers 是非常有用的工具。然而,由于其需要由集群管理员在 kube-apiserver 中编译成二进制文件,所以使用起来不是很灵活。从 Kubernetes 1.7 起,引入了 Initializers 和 ExternalAdmissionWebhooks,用以解决这个问题。在 Kubernetes 1.9 中, Initializers 依然停留在 alpha 版本,然而 ExternalAdmissionWebhooks 被提升到了 beta 版,且被分成了 MutatingAdmissionWebhook 和 ValidatingAdmissionWebhook。
CS实验室
2021/03/22
3.5K0
[译]深入剖析 Kubernetes MutatingAdmissionWebhook
深度剖析Kubernetes动态准入控制之Admission Webhooks
Author: xidianwangtao@gmail.com Admission Controll的最佳配置 这部分内容,请参考我的上一篇博文深度剖析Kubernetes动态准入控制之Initializers External Admission Webhooks工作机制 External Admission Webhooks有什么用 我们什么时候需要用External Admission Webhooks呢?当集群管理员需要强制对某些请求或者所有请求都进行校验或者修改的时候,就可以考虑使用Vali
Walton
2018/04/16
3.2K0
9-Kubernetes入门基础之集群安全介绍
描述: Kubernetes 作为一个分布式的集群管理工具,保证集群的安全性是非常至关重要的。同时由于API Server是集群内部各个组件通信的中介,也是外部控制的入口,所以Kubernetes的安全机制基本是就是围绕保护API Server 来进行设计的;
全栈工程师修炼指南
2022/09/29
1.4K0
9-Kubernetes入门基础之集群安全介绍
Prometheus监控k8s集群节点
Kubernetes 节点的监控:比如节点的 cpu、load、disk、memory 等指标 内部系统组件的状态:比如 kube-scheduler、kube-controller-manager、kubedns/coredns 等组件的详细运行状态 编排级的 metrics:比如 Deployment 的状态、资源请求、调度和 API 延迟等数据指标
mikelLam
2022/10/31
1.5K0
Prometheus监控k8s集群节点
[云原生]深入了解K8S准入控制
本篇我们将聚焦于 kube-apiserver 请求处理过程中一个很重要的部分 -- 准入控制器(Admission Controller)
宇宙无敌暴龙战士之心悦大王
2023/03/22
1K0
玩转K8S AdmissionWebhook
ice yao 喜欢看动漫的IT男,还是火影迷、海贼迷、死神迷、妖尾迷、全职猎人迷、龙珠迷、网球王子迷 环境准备 OS: CentOS 7.5 Kubernetes v1.11.6 Etcd 3.3.10 Docker 1.13.1 什么是AdmissionWebhook 什么是AdmissionWebhook,就要先了解K8S中的admission controller, 按照官方的解释是: admission controller是拦截(经过身份验证)API Server请求的网关,并且可以
腾讯云TStack
2019/06/14
18.8K2
玩转K8S AdmissionWebhook
相关推荐
Kubernetes 中利用 LXCFS 控制容器资源可见性
更多 >
目录
  • 2. Docker环境下LXCFS使用
  • 3. LXCFS的kubernets实践
  • lxcfs-daemonset
  • lxcfs-initializer
    • Initializer功能开启
    • InitializerConfiguration
    • Initializer Controller
  • 下面我们部署一个简单的Apache应用
    • 验证
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档