Debian上Kubernetes资源分配实践指南
一 基础概念与节点规划
- 在Kubernetes中,容器通过requests声明调度所需的最小资源,通过limits限制最大可用资源;调度器依据requests选择节点,kubelet依据limits进行限流与隔离。CPU以核/毫核(1000m=1核)计量,内存以字节(Mi/Gi)计量。未设置requests/limits时,Pod可能为BestEffort/Burstable类,稳定性与可预测性较差。为获得更可预测的性能,建议为关键负载设置明确的requests与limits。节点侧建议为系统守护进程预留资源(如通过kubelet的reservedSystemCPUs),避免与业务争用。Debian节点部署时,确保已禁用swap、放行kubelet等端口、安装containerd并配置apt源,使用kubeadm初始化集群,这些步骤是后续资源分配的前提。
二 Pod与容器的资源配置
- 为容器设置requests与limits,是资源分配的核心。示例(requests=limits时为Guaranteed QoS;仅设置limits时requests默认等于limits):
apiVersion: v1
kind: Pod
metadata:
name: app
spec:
containers:
- name: app
image: nginx:1.25
resources:
requests:
cpu: "500m"
memory: "256Mi"
limits:
cpu: "1"
memory: "512Mi"
- 规则要点:
- 调度只看requests;运行期受limits约束,CPU被限流,内存超限会被OOMKilled。
- 仅设置内存limit而未设request时,request会被自动设为与limit相同;仅设置CPU limit亦然(建议显式同时设置两者)。
- 为获得CPU亲和与更少抖动,可将关键负载配置为Guaranteed且CPU requests为整数,并结合CPU管理器使用“独占CPU”。
三 节点级资源优化
- CPU管理器(CPU Manager):
- 策略none:默认CFS配额,无额外亲和性。
- 策略static:对Guaranteed且CPU requests为整数的Pod分配独占CPU(cpuset),减少迁移与争用。启用static需配置kubelet的reservedSystemCPUs(预留CPU集合),且静态策略要求预留个数**> 0**。可结合拓扑管理器与以下选项优化拓扑对齐与分布:
- full-pcpus-only:仅分配完整物理核心(减少SMT同核争用)。
- distribute-cpus-across-numa:跨NUMA均匀分配CPU,缓解并行任务瓶颈。
- distribute-cpus-across-cores:跨不同物理核分布vCPU,降低同核干扰。
- strict-cpu-reservation:禁止任何Pod使用reservedSystemCPUs,确保系统服务隔离。
- 内存管理器(Memory Manager):
- 面向Guaranteed Pod提供有保证的内存与巨页分配,按拓扑提示将内存分配到最少数量的NUMA节点,提升延迟敏感负载的稳定性。
- 建议:延迟敏感/CPU密集型服务优先使用static策略并开启full-pcpus-only;NUMA敏感应用启用distribute-cpus-across-numa与Memory Manager。
四 集群维度配额与弹性扩缩
- 命名空间配额(ResourceQuota):限制租户/团队资源总量,防止资源抢占。
apiVersion: v1
kind: ResourceQuota
metadata:
name: team-a-quota
namespace: team-a
spec:
hard:
requests.cpu: "4"
requests.memory: "8Gi"
limits.cpu: "8"
limits.memory: "16Gi"
- 水平自动扩缩(HPA):基于CPU/内存或自定义指标自动增减副本数。
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: app-hpa
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: app
minReplicas: 2
maxReplicas: 10
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 70
- 垂直自动扩缩(VPA):在观测到长期资源不足/过量时,自动建议或更新Pod的requests/limits(通常与滚动更新配合,避免运行中直接替换容器资源)。
- 监控与持续优化:部署Prometheus + Grafana观测节点/Pod利用率与OOM/限流事件,结合业务峰值与SLO周期性调优requests/limits与HPA阈值。
五 快速落地清单
- 明确SLO与负载特征:区分延迟敏感/吞吐型/批处理,为每类负载建立资源画像(P50/P95/P99延迟、峰值QPS、内存常驻/峰值)。
- 为每个容器设置显式的requests/limits,关键负载尽量使用Guaranteed并让CPU requests为整数,以便后续启用static策略。
- 配置kubelet:设置reservedSystemCPUs(如系统与服务预留1–2核或按NUMA划分),启用CPU Manager(static)与Memory Manager,按应用需求选择拓扑对齐选项。
- 建立配额与限额:命名空间级ResourceQuota,必要时启用LimitRange设置默认/最大/最小。
- 接入弹性:为无状态服务配置HPA(CPU/内存或自定义指标),对长时间资源偏差明显的服务评估VPA。
- 观测与迭代:用Prometheus/Grafana与事件日志持续验证调度命中率、CPU限流、OOM、节点利用率,按周期回写资源配置并滚动更新。