企业级运维之云原生与Kubernetes实战课程
第三章第2讲 深入剖析linux容器&Pod(下)
视频地址:https://developer.aliyun.com/learning/course/913/detail/14555
三、资源限制(cgroup)
1. 控制器组(cgroup)
cgroup是Linux control group的缩写,cgroup是内核的一个特性,进程可以通过树形结构的cgroup来监控和限制进程可以使用的资源,比如限制某个进程对cpu、memory的使用量等。
cgroup 驱动:
- systemd cgroup driver
- cgroupfs cgroup driver
cgroup 类型:
- cpu
- memory
- pid
- blkio
- device
- freezer
查看pod的cgroup信息:
a. 登录pod所在的节点, docker ps |grep <pod name>找到容器的容器id;
b. 找到容器的Pid : docker inspect <容器id> |grep Pid;
c. 查看容器cgroup相对路径: cat /proc/ <Pid>/cgroup |grep memory;
示例:
# docker inspect 0683e462045a |grep -i pid
# cat /proc/905215/cgroup
# kubectl exec -it multi-containers-6695d87b75-dsxgn -- bash
2. cgroup子系统
pod中最主要的2个cgroup子系统: cpu、memory。
a. 子系统cpu
cpu子系统:观察cpu是否受限以及如何临时取消限制。
- cpuacct.stat
- cpu.cfs_period_us
- cpu.cfs_quota_us
- cpuacct.usage
- cpu.shares
- cpu.stat
- tasks
示例:
# kubectl exec -it multi-containers-6695d87b75-dsxgn -c nginx -- bash
# cat /sys/fs/cgroup/cpu.stat
# ssh root@192.168.88.156
# docker ps |grep mu
# docker inspect 0683e462045a |grep -i -pid
# grep -i cpu /proc/905215/cgroup
# grep -i cpu /proc/905215/cgroup
# cat cpu.cfs_quota_us
50000
# cat cpu.cfs_period_us
100000
Top命令查看,Cat cpu使用在50%,然后临时取消cat的cpu限制:
#echo -1 >cpu.cfs_quota_us
则cat 瞬时cpu使用达到100%。
b. 子系统memory
Memory子系统:观察memory是否受限以及如何临时取消限制。
- memory.failcnt
- memory.limit_in_bytes
- memory.max_ usage_in_ bytes
- memory.usage_in_bytes
- memory.stat
- memory.oom_control
- tasks
3. 超好用的command:system-cg*
- Systemd-cgtop:观察systemd驱动管理的cgroup相关资源使用情况;
- Systemd-cgls:列出systemd驱动管理的cgroup相关资源;
四、Init容器
Init容器是一种特殊容器,在Pod内的应用容器启动之前运行。Init容器可以包括一些应用镜像中不存在的实用工具和安装脚本。
特点:
- Init容器总是运行到完成;
- Init容器不支持lifecycle、livenessProbe、readinessProbe和startupProbe,因为它们必须在Pod就绪之前运行完成;
- 每一个Init容器都必须在下一个容器启动之前成功完成;
- Pod内多个Init容器会按顺序依次执行;
示例:
- 安装定制化的工具或者下载文件等;
- 等待依赖准备完毕;
- 初始化pod内核参数;
五、pause容器
Pause容器在K8s中,被当作pod中所有容器的父容器,它为Pod提供一个沙箱(sandbox)环境。
作用:
- 为pod中容器准备所需共享的命名空间;
- 启用pid命名空间,开启init进程,回收容器中的进程;
代码片段:
六、最佳实践
pod中容器缺少需要的sh命令,可以创建一个临时容器去调试pod中的容器。
步骤:
a. 查看pod名称;
b. 登录到pod所在节点;
c. 创建容器并绑定pod容器的命名空间;
d. 执行ps -ef;netstat -ntp等命令;
本讲小结
1. 容器中命名空间隔离以及控制器组限制资源的原理;
2. 容器中/容器外如何查看命名空间以及cgroup的配置文件;
3. pod中Init容器与pause容器的基本概念和作用;
4. 如何创建一个临时容器来调试pod容器。
思考:
1. pod多容器之间,共享哪些命名空间?
2. 如何修改pod的内核参数?
3. 有哪几种方法查看pod里的tcp/udp连接信息?
4. 如何查看pod是否有cpu/memory受限与否?