容器技术提供了不同于传统虚拟机技术的环境隔离方式。通常的 Linux 容器对容器打包和启动进行了加速,但也降低了容器的隔离强度。其中 Linux 容器最为知名的问题就是资源视图隔离问题。
容器可以通过 cgroup 的方式对资源的使用情况进行限制,包括: 内存,CPU 等。但是需要注意的是,如果容器内的一个进程使用一些常用的监控命令,如: free, top 等命令其实看到还是物理机的数据,而非容器的数据。这是由于容器并没有做到对 /proc, /sys 等文件系统的资源视图隔离。
lxcfs 是通过文件挂载的方式,把 cgroup 中关于系统的相关信息读取出来,通过 docker 的 volume 挂载给容器内部的 proc 系统。 然后让 docker 内的应用读取 proc 中信息的时候以为就是读取的宿主机的真实的 proc。
下面我们来说下如何在tke集群用lxcfs来对容器资源进行视图隔离。
1. tlinux2.4操作系统tke集群开启lxcfs
如果你的集群节点操作系统是用的腾讯云的tlinux2.4,则可以修改节点内存参数开启这个特性,腾讯云对tlinux2.4做了特性订制。
代码语言:javascript复制# 全局开关
sysctl -w kernel.stats_isolated=1
# 容器级别开关
sysctl -w kernel.container_stats_isolated=0
具体参考文档说明https://cloud.tencent.com/document/product/213/53867
2. 非 tlinux2.4操作系统tke集群开启lxcfs
如果你的节点操作系统部署tlinux2.4,是centos或者ubuntu,则需要参考文档在集群部署下lxcfs的DaemonSet,具体yaml如下
代码语言:javascript复制apiVersion: apps/v1
kind: DaemonSet
metadata:
name: lxcfs
namespace: kube-system
labels:
name: lxcfs
spec:
selector:
matchLabels:
name: lxcfs
template:
metadata:
labels:
name: lxcfs
spec:
priorityClassName: system-node-critical
hostPID: true
tolerations:
- operator: Exists
containers:
- name: lxcfs-monitor
image: ccr.ccs.tencentyun.com/tkeimages/lxcfs:4.0.8
imagePullPolicy: Always
command: ["/lxcfs-monitor.sh"]
args: ["/var/lib/lxc"]
resources:
limits:
cpu: 50m
memory: 50Mi
securityContext:
privileged: true
- name: lxcfs
image: ccr.ccs.tencentyun.com/tkeimages/lxcfs:4.0.8
imagePullPolicy: Always
command: ["/start.sh"]
args: ["5", "/var/lib/lxc"]
env:
- name: ENV_DEBUG_COMM
value: "true"
- name: ENV_DEBUG_PID_CID
value: "true"
resources:
limits:
cpu: 2
memory: 256Mi
securityContext:
privileged: true
volumeMounts:
- name: lxcfs
mountPath: /var/lib/lxc/lxcfs
mountPropagation: Bidirectional
volumes:
- name: lxcfs
hostPath:
path: /var/lib/lxc/lxcfs
type: DirectoryOrCreate