k8s容器资源可见性配置-lxcfs

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了k8s容器资源可见性配置-lxcfs相关的知识,希望对你有一定的参考价值。

参考技术A <a name="609h1"></a>

使用k8s容器化后,对内存 CPU 资源限制后,在容器内查看资源,显示的和容器所在宿主机信息一致,无法看到限制后的内存情况

<a name="UOYMO"></a>

实现资源可见性<br />比如 resources.requests.memory: "1024Mi"<br />那么在容器内查看内存,执行free -m 后显示的内存也为1024

<a name="iKTq8"></a>

在k8s所有节点执行以下命令,安装依赖包<br /> yum -y install fuse-devel fuse fuse-libs

<a name="J4mlh"></a>

安装lxcfs有如下两种方案:
<a name="GL3Gg"></a>

<a name="c8iGO"></a>

将以上内容保存为lxcfs-dadaemontset.yaml 文件<br /> kubectl apply -f ``lxcfs-dadaemontset.yaml <br />以上两种方式二选一
<a name="AtwEM"></a>

使用lxcfs会有三种方式,分别是 直接挂载,PodPreset, Initializer
<a name="Q3gos"></a>

在创建pod的时候,将lxcfs相应文件直接挂载到pod即可<br />相关文件:<br />/var/lib/lxcfs/proc/cpuinfo<br />/var/lib/lxcfs/proc/meminfo<br />/var/lib/lxcfs/proc/diskstats<br />/var/lib/lxcfs/proc/stat<br />/var/lib/lxcfs/proc/swaps<br />/var/lib/lxcfs/proc/uptime

案例:

<a name="YquMZ"></a>

使用该方案, 需要开启 kube-apiserver 相关参数 <br /> --enable-admission-plugins=PodPreset,XXXX,XXXX <br /> --runtime-config=settings.k8s.io/v1alpha1 <br />PodPreset 会根据<br />然后创建PodPreset spec.selector 来选择pod并注入<br />以下案例就是PodPreset 会将该Namespace 下所有包含标签inject-lxcfs: "true" 的pod 进行 注入volumeMounts,volumes

创建Deployment

接下来查看pod 就会有相应的内容注入<br /> kubectl get pod lxcfs-test-xxxxx-xxx -o yaml

<a name="pZznT"></a>

根据上面部署的httpd 将内存限制为1024m,cpu限制为0.1<br />因此效果如下
<a name="8syiW"></a>

<a name="m3khy"></a>

<a name="DhBfT"></a>

https://yq.aliyun.com/articles/566208 <br /> https://kubernetes.io/docs/tasks/inject-data-application/podpreset/ <br /> https://kubernetes.io/docs/concepts/workloads/pods/podpreset/ <br /> https://github.com/lijiaocn/lxcfs-initializer

运维实操——docker容器安全

1、Docker容器的安全

Docker容器的安全性,主要依赖于Linux系统自身,考虑Docker的安全性时,主要有:
(1)Linux内核的命名空间机制提供的容器隔离安全
启动一个容器时,Docker将在后台为容器创建一个独立的命名空间,就是隔离,但是ns(namespace)的隔离不够强,容器都是使用的同一个物理机的内核

(2)Linux控制组机制对容器资源的控制能力安全
启动容器时,Docker将在后台为容器创建一个独立的控制组策略集合Cgroups,它负责分配内存、CPU、磁盘IO等。

(3)Linux内核的能力机制所带来的操作权限安全
一般容器并不需要“真正的”root权限,只需要给某几个必须的权限即可,还能实现白名单。

2、容器资源控制

接下来分别对memory、cpu和io进行控制

(1)memory

后台运行容器,查看pid是11716

查看

在/sys/fs/cgroup中有许多的子目录,分别控制每个资源,/sys/fs/cgroup/memory/下的这些变量是是物理机全句的控制

/sys/fs/cgroup/memory/docker是所有容器的控制

/sys/fs/cgroup/memory/docker/b6639de883cc006c8c05921b708264c9429a3158ec1e753b99dfb52c5fdb8a98是针对该11716容器的控制

并且这些变量具有继承属性。

/dev/shm挂载到tmpfs 默认是内存的一半,我们可以利用这个特性测试控制memory

memory创建x1来测试,修改memory的最大值为200M。

安装libcgroup-tools工具。内存不够用的话,还有swap分区帮忙,为了不影响实验效果,先关闭swap,free可以看到已经关闭swap,100M的块使用内存时,可以成功;200M时就失败了,这是因为控制x1的内存大小是200M

cgexec -g memory:x1 dd if=/dev/zero of=bigfile bs=1M count=100
cgexec -g memory:x1 dd if=/dev/zero of=bigfile bs=1M count=200


就算这个容器不用swap,其他容器页可能用到swap,所以直接关掉swap不合适,再次打开swap,选择内存和swap在一起的这个选项,控制总量为200M,cgexec -g memory:x1 dd if=/dev/zero of=bigfile bs=1M count=300失败,且没有用swap

(2)cpu

对于cpu优先级的控制:
建立x2目录,cpu.shares 表示优先级,默认是1024,现在设置为100,大概是原来的十分之一。

后台运行重复的命令,改进程号是16222,top查看现在cpu使用是百分之百。并把x2子目录中的tasks中写入16222,表示对16222进行控制。

再开启一个进程,16365,top查看,二者的cpu占用基本是9比1。

对于cpu配额的控制:
cpu_period 表示总量,总数是100000; cpu_quota 表示配额,是-1时表示不控制策略,即总数是多少用多少。现在修改配额为总数的百分之二十。

关闭16222进程,只剩下16365,把16365导入到tasks中,top查看,只占用了百分之二十

(3)io

docker run -it —rm -device-write-bps /dev/vda:30MB rel7 bash,–device-write-bps限制写设备的bps速度为30M。oflag=direct表示,不通过内存到io设备,直接接入io设备,此时可以看到用了6.6秒,如果没有这个oflag=direct参数,速度就很快。

3、安全加固

(1)利用LXCFS增强docker容器隔离性和资源可见性

[root@server1 lxcfs]# yum install -y lxcfs-2.0.5-3.el7.centos.x86_64.rpm 		%安装插件
[root@server1 lxcfs]# lxcfs /var/lib/lxcfs & 									%运行
[root@server1 lxcfs]# docker run  -it -m 256m \\			%创建容器,内存限制为256MB
  
-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

(2)设置特权级运行的容器

不加–privileged=true这个参数,无法关闭eth0,加了–privileged=true这个参数后,就可以关闭了

(3)设置容器白名单:–cap-add

但是上面是权限都给,有点不放心,我们想做到需要什么给什么,而不是直接都给。
加入–cap-add=NET_ADMIN这个参数,就可以控制网络ip的添加和删除了

(4)其他安全加固的思路

使用安全的基础镜像
删除镜像中的setuid和setgid权限
启用Docker的内容信任
最小安装原则
对镜像进行安全漏洞扫描,镜像安全扫描器:Clair
容器使用非root用户运行

以上是关于k8s容器资源可见性配置-lxcfs的主要内容,如果未能解决你的问题,请参考以下文章

运维实操——docker容器安全

Linux企业运维——Docker安全

为啥以下用于切换两个容器的可见性的代码不起作用,正确的做法是啥?

动态切换资源列可见性

使用 Spring 安全性在 Thymeleaf 中的静态资源的可见性

Java 同步和内存可见性。 10 对其他线程可见吗?