Cgroups驱动
k8s有两种 cgroup 驱动:一种是 systemd,另外一种是 cgroupfs:
cgroupfs 比较好理解,比如说要限制内存是多少、要用 CPU share 为多少,其实直接把 pid 写入到对应 cgroup task 文件中,然后把对应需要限制的资源也写入相应的 memory cgroup 文件和 CPU 的 cgroup 文件就可以了;
另外一个是 systemd 的 cgroup 驱动,这个驱动是因为 systemd 本身可以提供一个 cgroup 管理方式。所以如果用 systemd 做 cgroup 驱动的话,所有的写 cgroup 操作都必须通过 systemd 的接口来完成,不能手动更改 cgroup 的文件;
kubernetes 中默认 kubelet 的 cgroup 驱动就是 cgroupfs,若要使用 systemd,则必须将 kubelet 以及 runtime 都需要配置为 systemd 驱动。
Cgroupfs下Pod的cgroup学习
以一个Deployment为例
apiVersion: apps/v1
kind: Deployment
metadata:
name: front-end
labels:
app: front-end
spec:
replicas: 1
selector:
matchLabels:
app: front-end
template:
metadata:
labels:
app: front-end
spec:
nodeSelector:
app: demo3
containers:
- name: nginx
image: autoregistry.rd.tp-link.net/auto/nginx:1.18
imagePullPolicy: IfNotPresent
resources:
requests:
cpu: 2
limits:
cpu: 3
ports:
- name: http
containerPort: 80
protocol: TCP
在resources下对cpu的requests和limits做出了限制,最终在部署的时候会写入Pod运行的节点的Cgroup对应文件中
(1)查看这个Pod运行的节点
[root@iamdemo1 ~]# k get pod -o wide | grep front
(2)到Pod运行的节点上,查看容器名nginx对应的CONTAINER ID
[root@iamdemo3 ~]# crictl ps | grep nginx
(3)查看对应容器的Cgroup参数
[root@iamdemo3 ~]# crictl inspect fd35fc385366c | grep -A3 cgroup
可以得到Pod对应的组目录为 kubepods-burstable-podb2253f4f_92ae_4d96_af6b_5b5f416ed2e6.slice
Container对应的目录为cri-containerd-fd35fc385366cfe4a215a4aaa6ec406c9f943c90b3f9967a405d2caa114208d5
(4)到容器所在节点的cgroup目录下
/sys/fs/cgroup/cpu/kubepods.slice/kubepods-burstable.slice
再cd kubepods-burstable-podb2253f4f_92ae_4d96_af6b_5b5f416ed2e6.slice
就可以看到当前目录有很多cpu相关参数文件
(5)cpu.shares文件的内容为2048,对应resources.requests.cpu的2
(6)cd到Container对应的目录cri-containerd-fd35fc385366cfe4a215a4aaa6ec406c9f943c90b3f9967a405d2caa114208d5.scope中查看cgroup.procs文件内容,即为Pod中的进程在宿主机上的PID,可以看到两个进程分别对应nginx的master和daemon进程
标签:systemd,Cgroup,对应,学习,nginx,cgroup,Pod,k8s,cpu
From: https://www.cnblogs.com/iamxiaofu/p/18030112