【k8s pod container内存指标说明】

K8s环境下内存指标分析:container_memory_working_set_bytes与container_memory_rss

一、问题描述

我司平台研发的devops平台底层采用k8s实现,k8s自带cadvisor进行集群指标收集,根据官网,我们选用了container_memory_working_set_bytes(容器的工作集使用量)作为内存使用量的观察项,但随着后续使用过程中发现该指标上升到一定大小后就会维持不变,并不像应用实际内存使用量,没出现波动;

来自kubernetes对该问题的讨论(讨论了5年多了):https://github.com/kubernetes/kubernetes/issues/43916

二、原因分析

⚠️以下是建立在关闭swap交换分区的前提下分析

经过一系列分析发现使用container_memory_working_set_bytes不合理,应该使用container_memory_rss来表示应用实际内存使用量;

我最开始受cadvisor git问题栏中描述的影响,里面描述说:k8s kill pod时是根据该指标使用情况来判断的,所以下意识认为该指标表示pod实际内存使用量;官网说的没有问题,container_memory_working_set_bytes指标就是k8s来控制pod是否被kill的依据参考,但不代表container_memory_working_set_bytes接近pod limit后就一定会被kill,这里涉及到下面要详细分析的pod内存分布情况;

  1. 获取pod内存记录信息
    在cadvisor中,采集应用内存信息具体实现实际是获取docker cgroup中memory.stat中的内容,下面是通过cat /sys/fs/cgroup/memory/memory.stat获取到的pod内存数据:

                
<think>嗯,用户现在遇到了KubernetesPod卡在ContainerCreating状态的问题,我需要帮ta解决这个问题。根据用户的请求,结合引用[1]和[2]的内容,我需要系统性地分析可能的原因和解决方案。首先从问题表现入手。ContainerCreating状态表示Pod已调度到节点,但容器未完成创建。这通常发生在镜像拉取、网络配置或存储挂载阶段。用户可能刚部署新Pod时遇到这个问题,或者运维中突然出现异常。排查思路需要分层展开。第一步是查看Pod描述信息,这是最直接的诊断方式,kubectldescribe命令能显示Pending原因、事件日志和错误详情。引用[2]中第六部分提到查看pod描述信息的方法,这应该作为首要建议。比如显示ImagePullBackoff的话,显然是镜像问题。然后是网络问题排查。Kubernetes网络插件如果异常,会导致CNI配置失败,特别要注意calico或flannel的Pod状态。节点间的网络策略也很关键,比如防火墙是否阻断端口。引用[1]提到要等待Pod进入Running状态,暗示部署过程需要网络连通性。镜像相关因素也不能忽视。如果用户使用了私有镜像仓库,需要检查pullsecret配置是否正确。还遇到过大小写敏感的镜像名拼写错误,或者远程仓库响应超时的情况。底层存储问题方面,PersistentVolumeClaim如果处于Pending会阻塞Pod创建。需要确认StorageClass可用性、节点存储配额,以及NFS服务器连接等细节。特别是StatefulSet类的有状态应用更容易在此处出错。对于kubelet日志的获取方法可能需要具体说明。用journalctl-ukubelet查看日志时,注意加上-f实时过滤关键字"ContainerCreating"或相关容器ID,这样用户能快速定位报错片段。最后给出分步骤流程图很重要。用户可能是新手运维人员,按"查看详情→网络检查→镜像验证→存储排查→插件重启"的路径来操作,能避免遗漏关键点。同时必须提醒kubelet服务健康度检查,这是很多文档容易忽略的基础项。</think> Kubernetes Pod 处于 `ContainerCreating` 状态通常表明容器尚未成功启动。以下是系统化的排查步骤和解决方案: --- ### **排查步骤 & 解决方案** #### **1. 查看 Pod 详细状态(关键)** ```bash kubectl describe pod <pod-name> -n <namespace> # 替换 Pod 名称和命名空间 ``` - **重点关注 `Events` 部分**,常见错误包括: - **`Failed to pull image`**: 镜像拉取失败(权限/路径错误) - **`NetworkPlugin not ready`**: CNI 网络插件未就绪 - **`MountVolume failed`**: 存储卷挂载失败(PVC 不存在/权限不足) - **`ImagePullBackOff`**: 镜像拉取策略错误或镜像仓库不可达 #### **2. 检查网络插件状态** ```bash kubectl get pods -n kube-system | grep -E 'cni|flannel|calico' # 检查 CNI 组件 kubectl logs -n kube-system <cni-pod-name> # 查看 CNI 日志 ``` - **常见问题**: - CNI 组件未运行或崩溃(重启相关 DaemonSet) - 节点防火墙阻止 VXLAN/IPIP 流量(开放 UDP 8472/VXLAN 端口) #### **3. 验证镜像可用性** ```bash kubectl get pod <pod-name> -o yaml | grep image: # 确认镜像名称 ``` - **排查方向**: - 镜像名称是否正确(区分公有/私有仓库) - 私有镜像需正确配置 `imagePullSecret`(引用[2]中提到 YAML 清单) - 执行 `docker pull <image>` 在节点手动测试镜像拉取 #### **4. 检查存储配置(PersistentVolume)** ```bash kubectl get pvc -n <namespace> # 查看 PVC 状态 kubectl describe pvc <pvc-name> -n <namespace> # 检查 PVC 事件 ``` - **解决方案**: - 确保 PVC 处于 `Bound` 状态(引用[2]中存储卷配置) - 验证 StorageClass 是否存在且可用 - NFS/GlusterFS 需确认服务端连通性 #### **5. 查看节点资源状态** ```bash kubectl describe node <node-name> | grep -A 10 "Allocated resources" # 检查资源配额 kubectl get events --field-selector involvedObject.name=<pod-name> # 过滤事件 ``` - **常见问题**: - 节点磁盘空间不足(`df -h` 检查 `/var/lib/docker`) - 内存/CPU 超分导致调度失败 #### **6. Kubelet 服务日志** ```bash journalctl -u kubelet -f | grep -i containercreating # 实时追踪 kubelet 日志 ``` - **关键日志**: - CRI(容器运行时)错误(如 Docker/Containerd 崩溃) - AppArmor/SELinux 安全策略拦截 --- ### **快速修复方案** ```mermaid graph TD A[Pod卡在ContainerCreating] --> B{查看 describe 事件} B --> |镜像问题| C[检查镜像名称/拉取密钥] B --> |存储问题| D[修复 PVC 或 StorageClass] B --> |网络问题| E[重启 CNI 或检查防火墙] B --> |资源不足| F[清理节点磁盘/扩容] C --> G[重新部署 Pod] D --> G E --> G F --> G ``` --- ### **相关问题** 1. **如何诊断 Kubernetes Pod 处于 `ImagePullBackOff` 状态?** 2. **PVC 绑定失败(Pending)的常见原因及解决方法?** 3. **Kubernetes 节点磁盘空间不足时如何自动清理?** 4. **如何为私有镜像仓库配置 `imagePullSecret`?** > 提示:检查 CNI 日志时若发现 `failed to allocate IP`,可能需扩容 Pod 网段(如 Calico IP 池)[^2]。 [^1]: 引用[1]: kubectl create -f busybox.yaml, Wait for pod running state. [^2]: 引用[2]: 【云原生kubernetesPod 配置详解与运维管理实践.
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值