当前位置: 首页 > news >正文

k8s笔记27--快速了解 k8s pod和cgroup的关系

k8s笔记27--快速了解 k8s pod和 cgroup 的关系

  • 介绍
  • pod & cgroup
  • 注意事项
  • 说明

介绍

随着云计算、云原生技术的成熟和广泛应用,K8S已经成为容器编排的事实标准,学习了解容器、K8S技术对于新时代的IT从业者显得极其重要了。
之前在文章 docker笔记13–面试必知的容器核心技术 中介绍了容器相关的核心技术,包括容器的隔离技术和限制技术,搞明白这些内容可以说理解了容器技术的底层原理。k8s作为当前最流行的开源的容器编排引擎,用来对容器化应用进行自动化部署、 扩缩和管理,它以pod为基础构成了各种有价值的工作负载。作为最重要的工作负载,它和容器有什么关联呢,是如何利用cgroup来实现资源限制的呢,它的限制又体现在哪里呢?本文就基于这些基础问题一步步展开…

pod & cgroup

Pod 是可以在 Kubernetes 中创建和管理的、最小的可部署的计算单元, 它包含一组容器,这些容器共享存储、网络、以及怎样运行这些容器的声明。
当Pod备调度期调度到某个节点后,节点上的kubelet就会和High-Level的容器运行时通信,把创建pod所涉及的容器参数传递给容器运行时,容器运行时最终通过Low-Level的runc或者其它运行时工具创建对应的容器。当容器创建成功后,我们可以通过docker inspect 或者 nerdctl inspect 来找到容器的pid,然后通过pid找到具体的cgroup信息。

k8s pod相关cgroup基础信息位置如下

k8s pod相关cgroup位置 : /sys/fs/cgroup/systemd/kubepods.sliceGuaranteed 类型pod 直接存放在 kubepods.slice 根目录下,例如: 
/sys/fs/cgroup/systemd/kubepods.slice/kubepods-pod48574e3c_f4d0_4a5c_84bb_166fd32ea22b.sliceBurstable 类型pod直接在子目录 kubepods-burstable.slice下, 例如 :
/sys/fs/cgroup/systemd/kubepods.slice/kubepods-burstable.slice/kubepods-burstable-pod49f8fde6_4c35_44c7_a237_c5b8c4312953.sliceBest-Effort 类型pod直接在子目录 kubepods-besteffort.slice下, 例如:
/sys/fs/cgroup/systemd/kubepods.slice/kubepods-besteffort.slice/kubepods-besteffort-podc1bb8757_1115_4dc5_a0cf_5fd39e14fdd9.slice

此处以 xg-dev命名空间的 pod besteffort-busybox-778b6fb576-8p59p为例,可以通过如下步骤找到对应的cgroup详细信息

1) 获取容器信息
# nerdctl --namespace=k8s.io ps|grep  besteffort
b6ec5bbb1447    docker.io/kubesphere/pause:3.7                                                         "/pause"                  36 minutes ago    Up                 k8s://xg-dev/besteffort-busybox-778b6fb576-8p59p
be0bfc9325bc    docker.io/library/busybox:1.32                                                         "/bin/sh -c sleep 36…"    36 minutes ago    Up                 k8s://xg-dev/besteffort-busybox-778b6fb576-8p59p/busybox2)通过nerdctl inspect 获取容器pid
# nerdctl --namespace=k8s.io inspect be0bfc9325bc|grep -i pid"Pid": 33866,3)通过pid获取 cgroup位置
通过 cat /proc/${pid}/cgroup 来找到实际pid的cgroup配置
# cat /proc/33866/cgroup 
11:devices:/kubepods.slice/kubepods-besteffort.slice/kubepods-besteffort-podc1bb8757_1115_4dc5_a0cf_5fd39e14fdd9.slice/cri-containerd-be0bfc9325bcf952464d5bf613e29afd792cbb9069bd34164ddc6a23e5b10ea5.scope
10:blkio:/kubepods.slice/kubepods-besteffort.slice/kubepods-besteffort-podc1bb8757_1115_4dc5_a0cf_5fd39e14fdd9.slice/cri-containerd-be0bfc9325bcf952464d5bf613e29afd792cbb9069bd34164ddc6a23e5b10ea5.scope
9:hugetlb:/kubepods.slice/kubepods-besteffort.slice/kubepods-besteffort-podc1bb8757_1115_4dc5_a0cf_5fd39e14fdd9.slice/cri-containerd-be0bfc9325bcf952464d5bf613e29afd792cbb9069bd34164ddc6a23e5b10ea5.scope
8:memory:/kubepods.slice/kubepods-besteffort.slice/kubepods-besteffort-podc1bb8757_1115_4dc5_a0cf_5fd39e14fdd9.slice/cri-containerd-be0bfc9325bcf952464d5bf613e29afd792cbb9069bd34164ddc6a23e5b10ea5.scope
7:freezer:/kubepods.slice/kubepods-besteffort.slice/kubepods-besteffort-podc1bb8757_1115_4dc5_a0cf_5fd39e14fdd9.slice/cri-containerd-be0bfc9325bcf952464d5bf613e29afd792cbb9069bd34164ddc6a23e5b10ea5.scope
6:perf_event:/kubepods.slice/kubepods-besteffort.slice/kubepods-besteffort-podc1bb8757_1115_4dc5_a0cf_5fd39e14fdd9.slice/cri-containerd-be0bfc9325bcf952464d5bf613e29afd792cbb9069bd34164ddc6a23e5b10ea5.scope
5:net_prio,net_cls:/kubepods.slice/kubepods-besteffort.slice/kubepods-besteffort-podc1bb8757_1115_4dc5_a0cf_5fd39e14fdd9.slice/cri-containerd-be0bfc9325bcf952464d5bf613e29afd792cbb9069bd34164ddc6a23e5b10ea5.scope
4:cpuset:/kubepods.slice/kubepods-besteffort.slice/kubepods-besteffort-podc1bb8757_1115_4dc5_a0cf_5fd39e14fdd9.slice/cri-containerd-be0bfc9325bcf952464d5bf613e29afd792cbb9069bd34164ddc6a23e5b10ea5.scope
3:cpuacct,cpu:/kubepods.slice/kubepods-besteffort.slice/kubepods-besteffort-podc1bb8757_1115_4dc5_a0cf_5fd39e14fdd9.slice/cri-containerd-be0bfc9325bcf952464d5bf613e29afd792cbb9069bd34164ddc6a23e5b10ea5.scope
2:pids:/kubepods.slice/kubepods-besteffort.slice/kubepods-besteffort-podc1bb8757_1115_4dc5_a0cf_5fd39e14fdd9.slice/cri-containerd-be0bfc9325bcf952464d5bf613e29afd792cbb9069bd34164ddc6a23e5b10ea5.scope
1:name=systemd:/kubepods.slice/kubepods-besteffort.slice/kubepods-besteffort-podc1bb8757_1115_4dc5_a0cf_5fd39e14fdd9.slice/cri-containerd-be0bfc9325bcf952464d5bf613e29afd792cbb9069bd34164ddc6a23e5b10ea5.scope4)通过 ls /sys/fs/cgroup/systemd/** 就可以看到这个pod指定容器的cgroup基础信息,其中 cgroup.procs 存放了容器进程的id
# ls /sys/fs/cgroup/systemd/kubepods.slice/kubepods-besteffort.slice/kubepods-besteffort-podc1bb8757_1115_4dc5_a0cf_5fd39e14fdd9.slice/cri-containerd-be0bfc9325bcf952464d5bf613e29afd792cbb9069bd34164ddc6a23e5b10ea5.scope
cgroup.clone_children  cgroup.event_control  cgroup.procs  notify_on_release  tasks5)进一步可以在 /sys/fs/cgroup/cpu/kubepods.slice/* 中查看cpu相关详细cgroup信息
# ls /sys/fs/cgroup/cpu/kubepods.slice/kubepods-besteffort.slice/kubepods-besteffort-podc1bb8757_1115_4dc5_a0cf_5fd39e14fdd9.slice/cri-containerd-be0bfc9325bcf952464d5bf613e29afd792cbb9069bd34164ddc6a23e5b10ea5.scope
cgroup.clone_children  cgroup.procs  cpuacct.usage         cpu.cfs_period_us  cpu.rt_period_us   cpu.shares  notify_on_release
cgroup.event_control   cpuacct.stat  cpuacct.usage_percpu  cpu.cfs_quota_us   cpu.rt_runtime_us  cpu.stat    tasks同理可以在 /sys/fs/cgroup/{blkio,memory}/** 中查看blkio、memory等详细信息。

创建3个不同qosClass 的 deployment, 相关参数如下:

besteffort-busyboxburstable-busyboxguaranted-busybox
cpu requests60m60m
memory requests50Mi50Mi
cpu limits60m100m
memory limits50Mi100Mi
cgroup 位置/sys/*/kubepods.slice//sys/*/kubepods.slice/kubepods-burstable.slice/sys/*/kubepods.slice/kubepods-besteffort.slice

guaranted-busybox 容器的CPU和Memory信息如下
在这里插入图片描述这里 cfs_period_us 默认为100ms, 100ms内cfs_quota_us为6ms,即1000ms内为60ms,等价于我们的60m
在这里插入图片描述
这里 5010241024 = 52428800 ,刚好为50Mi

同理 burstable-busybox 容器的CPU和Memory信息如下
在这里插入图片描述
在这里插入图片描述
这里100ms内cfs_quota_us为10ms,刚好对应CPU limit 100m, 10010241024 = 104857600 ,刚好对应memory limit 100Mi

同理 besteffort-busybox 容器的CPU和Memory信息如下
在这里插入图片描述
在这里插入图片描述
可以发现 besteffort 的pod对应的容器cpu.cfs_quota_us为-1, memory.limit_in_bytes为一个极大值(远超实际的内存)。

通过上述内容可以发现当Pod对应的容器在机器创建成功后,系统上会对该容器做对应的cgroup限制,后续CPU、内存的使用就会被限制了。

注意事项

  1. 每个pod在启动的时候除了有正常运行的容器外,还有一个做初始化工作的pause容器,
    我们可以看到kubelet的启动配置参数中有一个类似–pod-infra-container-image=kubesphere/pause:3.7 类型的参数,通过名字可以大概猜到时pod基础镜像相关的容器。pause 容器它cgroup 的 cpu.cfs_quota_us值也为-1, memory.limit_in_bytes也为一个极大值。

    默认每个pod都有一个对应的pause容器:
    在这里插入图片描述
    kubelet启动参数中指定了 pod-infra-container-image 参数
    在这里插入图片描述

说明

软件环境:
centos 7
k8s v1.24.9
containerd v1.7.3
cgroup v1
参考文档:
k8s官方文档-工作负载
Kubernetes-Qos之 Guaranteed, Burstable,Best-Effor
Kubernetes中 Requests 和 Limits 的初步理解
Kubernetes中的Pause容器到底是干嘛的

相关文章:

  • mac安装openresty
  • 【JavaEE初阶系列】——阻塞队列
  • nginx有哪些安装方法
  • 层级选择器
  • 【python】(10)理解Python中的数据聚合和分组运算
  • 关于C/C++,Linux/MacOS/Windows 平台虚拟内存分配
  • 机器人流程自动化技术(RPA)金融应用指南
  • 计算机网络⑧ —— IP地址
  • 利用K8S Statefulset搭建Etcd集群 - 本地存储
  • 加密技术概述
  • 信号处理与分析——matlab记录
  • RPC 快速入门
  • vue.js——学习计划表
  • 第十三届蓝桥杯JavaB组省赛真题 - 星期计算
  • 家乡特色推荐系统设计与实现|SpringBoot+ Mysql+Java+ B/S结构(可运行源码+数据库+设计文档)
  • [ JavaScript ] 数据结构与算法 —— 链表
  • 【跃迁之路】【519天】程序员高效学习方法论探索系列(实验阶段276-2018.07.09)...
  • java正则表式的使用
  • js 实现textarea输入字数提示
  • js继承的实现方法
  • node入门
  • Python语法速览与机器学习开发环境搭建
  • vue 个人积累(使用工具,组件)
  • Web设计流程优化:网页效果图设计新思路
  • 不用申请服务号就可以开发微信支付/支付宝/QQ钱包支付!附:直接可用的代码+demo...
  • 从零开始的webpack生活-0x009:FilesLoader装载文件
  • 浅谈JavaScript的面向对象和它的封装、继承、多态
  • 设计模式(12)迭代器模式(讲解+应用)
  • 使用 5W1H 写出高可读的 Git Commit Message
  • 项目管理碎碎念系列之一:干系人管理
  • 一加3T解锁OEM、刷入TWRP、第三方ROM以及ROOT
  • 与 ConTeXt MkIV 官方文档的接驳
  • Oracle Portal 11g Diagnostics using Remote Diagnostic Agent (RDA) [ID 1059805.
  • 你对linux中grep命令知道多少?
  • Java总结 - String - 这篇请使劲喷我
  • Redis4.x新特性 -- 萌萌的MEMORY DOCTOR
  • 基于django的视频点播网站开发-step3-注册登录功能 ...
  • ​ 无限可能性的探索:Amazon Lightsail轻量应用服务器引领数字化时代创新发展
  • ​软考-高级-系统架构设计师教程(清华第2版)【第1章-绪论-思维导图】​
  • ​直流电和交流电有什么区别为什么这个时候又要变成直流电呢?交流转换到直流(整流器)直流变交流(逆变器)​
  • # Apache SeaTunnel 究竟是什么?
  • #NOIP 2014# day.1 T3 飞扬的小鸟 bird
  • (java版)排序算法----【冒泡,选择,插入,希尔,快速排序,归并排序,基数排序】超详细~~
  • (八)c52学习之旅-中断实验
  • (九)One-Wire总线-DS18B20
  • (三) diretfbrc详解
  • (四)linux文件内容查看
  • (已解决)什么是vue导航守卫
  • .NET Framework 和 .NET Core 在默认情况下垃圾回收(GC)机制的不同(局部变量部分)
  • .NET/C# 利用 Walterlv.WeakEvents 高性能地中转一个自定义的弱事件(可让任意 CLR 事件成为弱事件)
  • .NET学习全景图
  • /usr/bin/env: node: No such file or directory
  • @RequestBody的使用
  • @RequestMapping用法详解
  • @ResponseBody