开发者学堂课程【企业级运维之云原生与 Kubernets 实战课程:深入剖析 linux 容器 & Pod(下) 】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/913/detail/14555
深入剖析 linux 容器 & Pod(下)
三、资源限制( 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 受限与否?