Kubernetes资源管理:核心概念与生产实践 1. Kubernetes资源管理核心概念解析在Kubernetes集群中资源控制是保障系统稳定性的关键机制。当我们谈论资源时主要涉及两类核心资源计算资源CPU可压缩资源和内存不可压缩资源扩展资源GPU、FPGA等专用硬件资源1.1 资源请求与限制资源管理的基础是Pod定义中的resources字段包含两个关键参数resources: requests: cpu: 500m memory: 256Mi limits: cpu: 1 memory: 512Mirequests调度依据确保节点有足够资源才会部署Podlimits运行时约束防止容器过度消耗资源经验提示内存单位区分大小写1Mi1024Ki而1MB1000KB。生产环境务必使用MiB/GiB等二进制单位1.2 服务质量(QoS)等级根据资源设置方式K8s自动划分三个QoS等级QoS等级设置条件驱逐优先级Guaranteed所有容器设置limitsrequests最低Burstable至少一个容器设置requests中等BestEffort未设置任何资源限制最高实测案例当节点内存不足时BestEffort Pod会最先被终止其次是Burstable最后才是Guaranteed。2. 命名空间级别的资源控制2.1 ResourceQuota限制命名空间内的资源总量apiVersion: v1 kind: ResourceQuota metadata: name: compute-resources spec: hard: requests.cpu: 10 requests.memory: 20Gi limits.cpu: 20 limits.memory: 40Gi pods: 50常见配额类型计算资源CPU/Memory的requests/limits存储资源PVC数量/存储空间对象数量Pod/Service/ConfigMap等2.2 LimitRange设置命名空间内Pod/Container的默认资源限制apiVersion: v1 kind: LimitRange metadata: name: mem-limit-range spec: limits: - default: memory: 512Mi defaultRequest: memory: 256Mi type: Container主要功能自动注入未设置资源的容器限制单个Pod/Container的资源上下限防止恶意用户占用过多资源3. 节点资源管理实战3.1 节点资源预留通过kubelet参数为系统守护进程预留资源--kube-reservedcpu500m,memory1Gi --system-reservedcpu1000m,memory2Gi --eviction-hardmemory.available500Mi配置要点kube-reservedK8s组件(如kubelet)资源system-reserved系统进程(sshd等)资源eviction-hard触发Pod驱逐的阈值3.2 节点压力驱逐当节点资源达到阈值时kubelet按以下顺序处理回收未使用的镜像和容器层终止运行中的Pod按QoS等级和优先级查看当前节点资源状态kubectl describe node node-name | grep -A 10 Allocated4. 高级资源控制策略4.1 Pod优先级与抢占定义PriorityClassapiVersion: scheduling.k8s.io/v1 kind: PriorityClass metadata: name: high-priority value: 1000000 globalDefault: false description: 用于关键业务Pod在Pod中引用spec: priorityClassName: high-priority4.2 拓扑感知调度通过拓扑分布约束实现负载均衡topologySpreadConstraints: - maxSkew: 1 topologyKey: kubernetes.io/hostname whenUnsatisfiable: DoNotSchedule labelSelector: matchLabels: app: nginx关键参数解析maxSkew允许的最大不均衡数topologyKey节点标签的拓扑域whenUnsatisfiable不满足时的处理策略5. 资源监控与优化5.1 实时监控方案# 查看节点资源使用 kubectl top node # 查看Pod资源使用 kubectl top pod -n namespace # 带标签筛选 kubectl top pod -l appnginx5.2 资源推荐工具安装Vertical Pod Autoscalerkubectl apply -f https://github.com/kubernetes/autoscaler/releases/latest/download/vpa.yaml创建VPA对象apiVersion: autoscaling.k8s.io/v1 kind: VerticalPodAutoscaler metadata: name: nginx-vpa spec: targetRef: apiVersion: apps/v1 kind: Deployment name: nginx updatePolicy: updateMode: Auto6. 常见问题排查手册6.1 Pod处于Pending状态排查步骤查看事件详情kubectl describe pod pod-name检查资源配额kubectl describe quota -n namespace验证节点资源kubectl describe node | grep -A 10 Allocatable6.2 OOMKilled问题内存不足终止分析查看容器退出码137OOMkubectl get pod -o jsonpath{.status.containerStatuses[*].lastState.terminated.exitCode}对比limits与实际使用kubectl top pod --containers6.3 CPU限流问题诊断方法kubectl describe pod | grep -i throttling优化方案适当提高CPU limits使用CPU管理器static策略调整CFS调度参数7. 生产环境最佳实践黄金法则所有生产Pod必须设置requests和limits内存设置limits不应超过节点可用内存的70%CPU设置避免使用小数核如0.1应表示为100m监控策略持续监控资源使用率设置资源使用率告警CPU70%, Mem80%优化工具链graph LR A[Prometheus] -- B[资源监控] C[Grafana] -- D[可视化看板] E[VPA] -- F[自动调整建议]最后分享一个实战技巧对于Java应用建议设置内存limits比Xmx大10-15%避免因堆外内存导致OOM。例如env: - name: JAVA_OPTS value: -Xmx512m resources: limits: memory: 600Mi