深入剖析 linux 容器 & Pod(下)| 学习笔记

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
简介: 快速学习深入剖析 linux 容器 & Pod(下)

开发者学堂课程【企业级运维之云原生与 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

image.png

# kubectl exec -it multi-containers-6695d87b75-dsxgn -- bash

image.png

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

示例:

image.png

# kubectl exec -it multi-containers-6695d87b75-dsxgn -c nginx -- bash

# cat /sys/fs/cgroup/cpu.stat

image.png 

# ssh root@192.168.88.156

# docker ps |grep mu

# docker inspect 0683e462045a |grep -i -pid

# grep -i cpu /proc/905215/cgroup

image.png

# grep -i cpu /proc/905215/cgroup

image.png

# 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%。

image.png 

b. 子系统 memory

Memory 子系统:观察 memory 是否受限以及如何临时取消限制。

image.png 

Ÿ memory.failcnt

Ÿ memory.limit_in_bytes

Ÿ memory.max_ usage_in_ bytes

Ÿ memory.usage_in_bytes

Ÿ memory.stat

Ÿ memory.oom_control

Ÿ tasks

image.png

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 内核参数;

image.png

 

五、pause 容器

Pause 容器在 K8s 中,被当作 pod 中所有容器的父容器,它为 Pod 提供一个沙箱( sandbox )环境。

作用:

Ÿ 为 pod 中容器准备所需共享的命名空间;

Ÿ 启用 pid 命名空间,开启 init 进程,回收容器中的进程;

代码片段:

image.png 

 

六、最佳实践

pod 中容器缺少需要的 sh 命令,可以创建一个临时容器去调试 pod 中的容器。

步骤:

a. 查看 pod 名称;

b. 登录到 pod 所在节点;

c. 创建容器并绑定 pod 容器的命名空间;

d. 执行 ps -ef; netstat -ntp 等命令;

image.png

image.png

 

本讲小结

1. 容器中命名空间隔离以及控制器组限制资源的原理;

2. 容器中/容器外如何查看命名空间以及 cgroup 的配置文件;

3. pod 中 Init 容器与 pause 容器的基本概念和作用;

4. 如何创建一个临时容器来调试 pod 容器。

思考:

1. pod 多容器之间,共享哪些命名空间?

2. 如何修改 pod 的内核参数?

3. 有哪几种方法查看 pod 里的 tcp/udp 连接信息?

4. 如何查看 pod 是否有 cpu/memory 受限与否?

相关文章
|
3月前
|
Shell Linux
Linux shell编程学习笔记30:打造彩色的选项菜单
Linux shell编程学习笔记30:打造彩色的选项菜单
|
4月前
|
存储 消息中间件 容器
当一个 Pod 中包含多个容器时,容器间共享一些重要的资源和环境,这使得它们能够更有效地协同工作和交互。
当一个 Pod 中包含多个容器时,容器间共享一些重要的资源和环境,这使得它们能够更有效地协同工作和交互。
|
29天前
|
存储 Kubernetes Docker
【赵渝强老师】Kubernetes中Pod的基础容器
Pod 是 Kubernetes 中的基本单位,代表集群上运行的一个进程。它由一个或多个容器组成,包括业务容器、基础容器、初始化容器和临时容器。基础容器负责维护 Pod 的网络空间,对用户透明。文中附有图片和视频讲解,详细介绍了 Pod 的组成结构及其在网络配置中的作用。
【赵渝强老师】Kubernetes中Pod的基础容器
|
2月前
|
Ubuntu 安全 Linux
|
29天前
|
运维 Kubernetes Shell
【赵渝强老师】K8s中Pod的临时容器
Pod 是 Kubernetes 中的基本调度单位,由一个或多个容器组成,包括业务容器、基础容器、初始化容器和临时容器。临时容器用于故障排查和性能诊断,不适用于构建应用程序。当 Pod 中的容器异常退出或容器镜像不包含调试工具时,临时容器非常有用。文中通过示例展示了如何使用 `kubectl debug` 命令创建临时容器进行调试。
|
29天前
|
Kubernetes 调度 容器
【赵渝强老师】K8s中Pod中的业务容器
Pod 是 Kubernetes 中的基本调度单元,由一个或多个容器组成。除了业务容器,Pod 还包括基础容器、初始化容器和临时容器。本文通过示例介绍如何创建包含业务容器的 Pod,并提供了一个视频讲解。示例中创建了一个名为 &quot;busybox-container&quot; 的业务容器,并使用 `kubectl create -f firstpod.yaml` 命令部署 Pod。
|
29天前
|
Kubernetes 容器 Perl
【赵渝强老师】K8s中Pod中的初始化容器
Kubernetes的Pod包含业务容器、基础容器、初始化容器和临时容器。初始化容器在业务容器前运行,用于执行必要的初始化任务。本文介绍了初始化容器的作用、配置方法及优势,并提供了一个示例。
|
2月前
|
并行计算 Ubuntu Linux
Ubuntu学习笔记(三):Linux下操作指令大全
Ubuntu学习笔记,介绍了Linux操作系统中常用的命令和操作,如文件管理、系统信息查看、软件安装等。
47 3
|
3月前
|
Shell Linux
Linux shell编程学习笔记82:w命令——一览无余
Linux shell编程学习笔记82:w命令——一览无余
|
3月前
|
NoSQL 关系型数据库 Redis
mall在linux环境下的部署(基于Docker容器),Docker安装mysql、redis、nginx、rabbitmq、elasticsearch、logstash、kibana、mongo
mall在linux环境下的部署(基于Docker容器),docker安装mysql、redis、nginx、rabbitmq、elasticsearch、logstash、kibana、mongodb、minio详细教程,拉取镜像、运行容器
mall在linux环境下的部署(基于Docker容器),Docker安装mysql、redis、nginx、rabbitmq、elasticsearch、logstash、kibana、mongo