Linux 容器化运维实战

3次阅读

linux容器运维问题需按五步排查:一查运行时与内核兼容性;二查cni配置与网络;三查镜像拉取认证与存储空间;四清僵死容器cgroup与任务资源;五调应用无响应原因,含oom、挂载及系统调用追踪。

Linux 容器化运维实战

如果您在 Linux 环境中开展容器化运维工作,但遇到容器启动失败、网络不通、镜像拉取异常或资源隔离失效等问题,则可能是由于容器运行时配置、宿主机内核支持、存储驱动或命名空间设置不当所致。以下是针对典型场景的实操处理步骤:

一、验证容器运行时环境

确认系统已正确安装并启用兼容的容器运行时(如 containerd 或 runc),且内核版本满足最低要求(通常需 ≥3.10),同时检查 cgroups v2 是否启用或与运行时兼容。

1、执行 uname -r 查看当前内核版本。

2、运行 systemctl is-active containerd 检查 containerd 服务状态。

3、执行 cat /proc/sys/user/max_user_namespaces 确认用户命名空间已启用(值应大于 0)。

4、使用 ctr version 验证 containerd 客户端与服务端版本一致性。

二、修复容器网络不可达问题

容器无法访问外部网络或彼此间 ping 不通,常因 CNI 插件未就绪、网桥配置错误或 iptables 规则拦截所致,需逐层排查网络栈。

1、检查默认 CNI 配置文件是否存在:ls /etc/cni/net.d/10-containerd-net.conflist

2、查看容器网络命名空间接口ip link show | grep veth,确认 veth pair 已创建。

3、进入容器命名空间执行 nsenter -n -t $(pidof containerd-shim) — ip addr 查看内部 IP 分配情况。

4、临时关闭宿主机 firewalld:systemctl stop firewalld,排除防火墙拦截干扰。

三、解决镜像拉取超时或校验失败

镜像拉取中断或 sha256 校验不匹配,多由 registry 认证失效、http 代理配置错误、磁盘配额不足或镜像层元数据损坏引发。

1、检查 containerd 配置中是否启用了私有 registry 及跳过 TLS 验证:grep -A 5 ‘registry.mirrors’ /etc/containerd/config.toml

2、手动触发镜像拉取并显示详细日志:ctr -n k8s.io images pull –user ‘user:pass’ docker.io/library/nginx:alpine

3、清理无效镜像层缓存:ctr -n k8s.io content ls | awk ‘$3 ~ /missing/ {print $1}’ | xargs -r ctr -n k8s.io content rm

4、验证底层存储目录可用空间:df -h /var/lib/containerd/io.containerd.content.v1.content

四、强制回收僵死容器资源

容器进程已退出但状态仍为 Running,或 pause 进程残留导致 cgroup 资源未释放,需绕过常规 stop 命令直接清理底层资源。

1、定位对应容器的 sandbox ID:crictl ps -a | grep -E ‘(NotReady|Unknown)’

2、获取该容器的完整 sandbox PID:crictl inspect CONTAINER_ID | jq -r ‘.info.runtimeSpec.process.pid’

3、强制移除其 cgroup 路径:rmdir /sys/fs/cgroup/pids/kubepods/burstable/pod*/CONTAINER_ID(路径依实际 cgroup 版本调整)。

4、执行 ctr -n k8s.io tasks delete SANDBOX_ID 彻底清除任务对象

五、调试容器内应用无响应问题

容器内主进程持续运行但无业务输出,可能因 stdin/stdout 重定向异常、OOMKilled 后未退出、或挂载的 proc/sysfs 被覆盖导致健康检查失准。

1、检查容器是否被 OOM 终止:crictl stats | grep -A 5 CONTAINER_NAME,观察 memory usage 是否接近 limit。

2、进入容器命名空间读取内核日志:nsenter -m -u -i -n -p -t $(crictl inspect CONTAINER_ID | jq -r ‘.info.runtimeSpec.process.pid’) — dmesg -T | tail -20

3、验证 /proc 和 /sys 挂载是否为只读或绑定挂载:findmnt -D | grep -E ‘(proc|sysfs)’ | grep CONTAINER_ID

4、临时注入调试进程:crictl exec -it CONTAINER_ID sh -c ‘apk add –no-cache strace && strace -p 1 -e trace=connect,sendto,recvfrom’

text=ZqhQzanResources