15.10.6 资源限制与安全的排障与审计
资源限制与安全的排障与审计需要同时覆盖 cgroups、namespace、内核安全机制与容器运行时事件链路。建议建立“症状—证据—定位—修复—复盘”的闭环流程,并在平台层面形成标准化检查清单与审计基线。
一、准备与工具安装(排障基础)
常用工具需提前安装,便于采集证据与审计:
# Debian/Ubuntu
sudo apt-get update
sudo apt-get install -y sysstat auditd jq
# RHEL/CentOS
sudo yum install -y sysstat audit audit-libs jq
# 启用并启动审计服务
sudo systemctl enable --now auditd
二、常见症状与快速定位(含示例)
1) CPU异常:容器慢、宿主机负载正常
示例:检查运行参数与实际 cgroup 限制是否一致。
# 查看容器资源限制
docker inspect --format 'CPUQuota={{.HostConfig.CpuQuota}} CPUPeriod={{.HostConfig.CpuPeriod}} CPUShares={{.HostConfig.CpuShares}}' web01
# 进入宿主机 cgroup 查看实际生效(cgroup v1 示例)
cat /sys/fs/cgroup/cpu/docker/$(docker inspect -f '{{.Id}}' web01)/cpu.cfs_quota_us
cat /sys/fs/cgroup/cpu/docker/$(docker inspect -f '{{.Id}}' web01)/cpu.cfs_period_us
# 观察实时使用
docker stats web01 --no-stream
- 预期:
cpu.cfs_quota_us/period_us比例与--cpus设置一致。若比例过低,会导致明显限速。
2) 内存 OOM:容器重启或日志出现 OOM
# 查看容器内存限制
docker inspect --format 'Memory={{.HostConfig.Memory}} Swap={{.HostConfig.MemorySwap}}' app01
# 内核 OOM 记录
dmesg | egrep -i 'oom|killed process' | tail -n 5
# cgroup 实际限制与使用(v1示例)
cat /sys/fs/cgroup/memory/docker/$(docker inspect -f '{{.Id}}' app01)/memory.limit_in_bytes
cat /sys/fs/cgroup/memory/docker/$(docker inspect -f '{{.Id}}' app01)/memory.usage_in_bytes
- 预期:
memory.limit_in_bytes不应明显低于应用峰值;dmesg能定位被杀进程与时间。
3) IO 瓶颈:磁盘延迟高、吞吐低
# 宿主机 I/O 观察
iostat -xz 1 5
# 容器 blkio 限制(v1示例)
cat /sys/fs/cgroup/blkio/docker/$(docker inspect -f '{{.Id}}' db01)/blkio.throttle.read_bps_device
cat /sys/fs/cgroup/blkio/docker/$(docker inspect -f '{{.Id}}' db01)/blkio.throttle.write_bps_device
- 预期:若设备限速过低(BPS/IOPS),需调整或移除。
4) 权限与安全异常:操作被拒绝或启动失败
# 查看容器安全配置
docker inspect --format 'Privileged={{.HostConfig.Privileged}} CapAdd={{.HostConfig.CapAdd}} CapDrop={{.HostConfig.CapDrop}}' api01
# 查看 seccomp 与 AppArmor/SELinux 状态
docker inspect --format 'Seccomp={{.HostConfig.SecurityOpt}}' api01
sudo aa-status 2>/dev/null | head -n 5
getenforce 2>/dev/null
- 预期:避免
--privileged,确保所需能力未被误删。
三、排障流程与关键证据(命令串联)
# 1) 记录启动参数与配置(镜像、限制、权限)
docker inspect app01 > /tmp/app01.inspect.json
jq '.HostConfig' /tmp/app01.inspect.json
# 2) 采集容器日志与时间线
docker logs --since 2h app01 > /tmp/app01.log
# 3) 采集内核日志(OOM/权限拒绝)
sudo journalctl -k --since "2 hours ago" | egrep -i 'oom|denied|apparmor|selinux' > /tmp/kernel.log
# 4) 采集 cgroup 指标(CPU/内存)
CID=$(docker inspect -f '{{.Id}}' app01)
cat /sys/fs/cgroup/cpu/docker/$CID/cpu.stat > /tmp/cpu.stat
cat /sys/fs/cgroup/memory/docker/$CID/memory.stat > /tmp/mem.stat
- 预期:通过时间戳对齐
app01.log与kernel.log,定位是否触发 OOM、权限拒绝或限制。
四、安全审计重点(含审计示例)
1) 镜像来源与完整性
# 查看镜像来源与摘要
docker images --digests | grep myapp
# 核对镜像拉取记录
docker history myapp:1.2.3
2) 高危运行权限审计
# 扫描存在 --privileged 的容器
docker ps -q | xargs -I{} docker inspect -f '{{.Name}} Privileged={{.HostConfig.Privileged}}' {} | grep true
# 扫描宿主机敏感挂载(示例:/、/var/run/docker.sock)
docker ps -q | xargs -I{} docker inspect -f '{{.Name}} {{range .Mounts}}{{.Source}}:{{.Destination}} {{end}}' {} | egrep '/:/|docker.sock'
3) 审计系统调用与文件访问(auditd 示例)
# 监控 docker.sock 被访问
sudo auditctl -w /var/run/docker.sock -p rwxa -k docker_sock_watch
# 查询审计记录
sudo ausearch -k docker_sock_watch | tail -n 20
五、整改与回滚示例(含命令)
# CPU 限制调整:由 0.5 核提升至 1 核
docker update --cpus=1 app01
# 内存限制调整:提升至 1GB,并设置 swap=1.5GB
docker update --memory=1g --memory-swap=1536m app01
# 回滚:恢复为默认(不限制)
docker update --cpus=0 --memory=0 --memory-swap=0 app01
- 预期:应用响应恢复,
docker stats显示上限变化。
六、练习与自测
1) CPU 限速验证
- 启动容器并限制 0.2 核,运行压测命令,观察 cpu.cfs_quota_us 与 docker stats。
- 练习命令:
docker run -d --name cpu-test --cpus=0.2 alpine sh -c "while true; do :; done"
docker stats cpu-test --no-stream
2) 内存 OOM 复现
- 启动 64MB 内存限制容器,运行内存占用程序并观察 dmesg。
docker run -d --name mem-test --memory=64m alpine sh -c "dd if=/dev/zero of=/dev/null bs=1M"
dmesg | egrep -i 'oom|killed process' | tail -n 3
3) 权限拒绝定位
- 启动去掉 NET_ADMIN 的容器,尝试设置网卡,观察错误并定位 capabilities。
docker run --name cap-test --cap-drop=NET_ADMIN -it --rm alpine sh
# 容器内执行
ip link set lo down
七、关键命令解释速查
docker inspect:查看容器真实运行参数与安全配置。docker stats:实时资源使用与限制对比。/sys/fs/cgroup/*:cgroup 实际生效值与统计指标。dmesg/journalctl -k:内核层面的 OOM/安全拒绝日志。auditctl/ausearch:系统级访问审计。
通过将监控、日志、审计与变更管理贯穿资源限制与安全体系,可显著降低误配置与安全风险带来的运行事故。